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.

94 lines
2.8 KiB

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