Fork of the excellent esp8266-react - https://github.com/rjwats/esp8266-react
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.5 KiB

  1. #ifndef SecuritySettingsService_h
  2. #define SecuritySettingsService_h
  3. #include <Features.h>
  4. #include <SecurityManager.h>
  5. #include <HttpEndpoint.h>
  6. #include <FSPersistence.h>
  7. #ifndef FACTORY_ADMIN_USERNAME
  8. #define FACTORY_ADMIN_USERNAME "admin"
  9. #endif
  10. #ifndef FACTORY_ADMIN_PASSWORD
  11. #define FACTORY_ADMIN_PASSWORD "admin"
  12. #endif
  13. #ifndef FACTORY_GUEST_USERNAME
  14. #define FACTORY_GUEST_USERNAME "guest"
  15. #endif
  16. #ifndef FACTORY_GUEST_PASSWORD
  17. #define FACTORY_GUEST_PASSWORD "guest"
  18. #endif
  19. #define SECURITY_SETTINGS_FILE "/config/securitySettings.json"
  20. #define SECURITY_SETTINGS_PATH "/rest/securitySettings"
  21. #if FT_ENABLED(FT_SECURITY)
  22. class SecuritySettings {
  23. public:
  24. String jwtSecret;
  25. std::list<User> users;
  26. static void read(SecuritySettings& settings, JsonObject& root) {
  27. // secret
  28. root["jwt_secret"] = settings.jwtSecret;
  29. // users
  30. JsonArray users = root.createNestedArray("users");
  31. for (User user : settings.users) {
  32. JsonObject userRoot = users.createNestedObject();
  33. userRoot["username"] = user.username;
  34. userRoot["password"] = user.password;
  35. userRoot["admin"] = user.admin;
  36. }
  37. }
  38. static StateUpdateResult update(JsonObject& root, SecuritySettings& settings) {
  39. // secret
  40. settings.jwtSecret = root["jwt_secret"] | FACTORY_JWT_SECRET;
  41. // users
  42. settings.users.clear();
  43. if (root["users"].is<JsonArray>()) {
  44. for (JsonVariant user : root["users"].as<JsonArray>()) {
  45. settings.users.push_back(User(user["username"], user["password"], user["admin"]));
  46. }
  47. } else {
  48. settings.users.push_back(User(FACTORY_ADMIN_USERNAME, FACTORY_ADMIN_PASSWORD, true));
  49. settings.users.push_back(User(FACTORY_GUEST_USERNAME, FACTORY_GUEST_PASSWORD, false));
  50. }
  51. return StateUpdateResult::CHANGED;
  52. }
  53. };
  54. class SecuritySettingsService : public StatefulService<SecuritySettings>, public SecurityManager {
  55. public:
  56. SecuritySettingsService(AsyncWebServer* server, FS* fs);
  57. void begin();
  58. // Functions to implement SecurityManager
  59. Authentication authenticate(const String& username, const String& password);
  60. Authentication authenticateRequest(AsyncWebServerRequest* request);
  61. String generateJWT(User* user);
  62. ArRequestFilterFunction filterRequest(AuthenticationPredicate predicate);
  63. ArRequestHandlerFunction wrapRequest(ArRequestHandlerFunction onRequest, AuthenticationPredicate predicate);
  64. ArJsonRequestHandlerFunction wrapCallback(ArJsonRequestHandlerFunction callback, AuthenticationPredicate predicate);
  65. private:
  66. HttpEndpoint<SecuritySettings> _httpEndpoint;
  67. FSPersistence<SecuritySettings> _fsPersistence;
  68. ArduinoJsonJWT _jwtHandler;
  69. void configureJWTHandler();
  70. /*
  71. * Lookup the user by JWT
  72. */
  73. Authentication authenticateJWT(String& jwt);
  74. /*
  75. * Verify the payload is correct
  76. */
  77. boolean validatePayload(JsonObject& parsedPayload, User* user);
  78. };
  79. #else
  80. class SecuritySettingsService : public SecurityManager {
  81. public:
  82. SecuritySettingsService(AsyncWebServer* server, FS* fs);
  83. ~SecuritySettingsService();
  84. // minimal set of functions to support framework with security settings disabled
  85. Authentication authenticateRequest(AsyncWebServerRequest* request);
  86. ArRequestFilterFunction filterRequest(AuthenticationPredicate predicate);
  87. ArRequestHandlerFunction wrapRequest(ArRequestHandlerFunction onRequest, AuthenticationPredicate predicate);
  88. ArJsonRequestHandlerFunction wrapCallback(ArJsonRequestHandlerFunction onRequest, AuthenticationPredicate predicate);
  89. };
  90. #endif // end FT_ENABLED(FT_SECURITY)
  91. #endif // end SecuritySettingsService_h