Completing sub support.

This commit is contained in:
stephb9959
2021-12-01 09:04:51 -08:00
parent 40faa84d2b
commit ec82bdec24
16 changed files with 84 additions and 56 deletions

View File

@@ -85,6 +85,7 @@ add_executable( owsec
src/RESTAPI/RESTAPI_suboauth2_handler.h src/RESTAPI/RESTAPI_suboauth2_handler.cpp src/RESTAPI/RESTAPI_suboauth2_handler.h src/RESTAPI/RESTAPI_suboauth2_handler.cpp
src/RESTAPI/RESTAPI_subuser_handler.h src/RESTAPI/RESTAPI_subuser_handler.cpp src/RESTAPI/RESTAPI_subuser_handler.h src/RESTAPI/RESTAPI_subuser_handler.cpp
src/RESTAPI/RESTAPI_subusers_handler.h src/RESTAPI/RESTAPI_subusers_handler.cpp src/RESTAPI/RESTAPI_subusers_handler.h src/RESTAPI/RESTAPI_subusers_handler.cpp
src/RESTAPI/RESTAPI_validate_sub_token_handler.cpp src/RESTAPI/RESTAPI_validate_sub_token_handler.h
src/APIServers.cpp src/APIServers.cpp
src/Daemon.h src/Daemon.cpp src/Daemon.h src/Daemon.cpp
src/AuthService.h src/AuthService.cpp src/AuthService.h src/AuthService.cpp

2
build
View File

@@ -1 +1 @@
58 68

View File

@@ -18,6 +18,7 @@
#include "RESTAPI/RESTAPI_suboauth2_handler.h" #include "RESTAPI/RESTAPI_suboauth2_handler.h"
#include "RESTAPI/RESTAPI_subuser_handler.h" #include "RESTAPI/RESTAPI_subuser_handler.h"
#include "RESTAPI/RESTAPI_subusers_handler.h" #include "RESTAPI/RESTAPI_subusers_handler.h"
#include "RESTAPI/RESTAPI_validate_sub_token_handler.h"
namespace OpenWifi { namespace OpenWifi {
@@ -49,6 +50,7 @@ namespace OpenWifi {
RESTAPI_system_command, RESTAPI_system_command,
RESTAPI_action_links, RESTAPI_action_links,
RESTAPI_validate_token_handler, RESTAPI_validate_token_handler,
RESTAPI_validate_sub_token_handler,
RESTAPI_sms_handler, RESTAPI_sms_handler,
RESTAPI_suboauth2_handler, RESTAPI_suboauth2_handler,
RESTAPI_subuser_handler, RESTAPI_subuser_handler,

View File

@@ -43,23 +43,52 @@ namespace OpenWifi {
break; break;
SecurityObjects::UserInfo UInfo; SecurityObjects::UserInfo UInfo;
if(!StorageService()->GetUserById(i.userId,UInfo)) { if((i.action==OpenWifi::SecurityObjects::LinkActions::FORGOT_PASSWORD ||
i.action==OpenWifi::SecurityObjects::LinkActions::VERIFY_EMAIL) && !StorageService()->GetUserById(i.userId,UInfo)) {
StorageService()->CancelAction(i.id);
continue;
} else if(( i.action==OpenWifi::SecurityObjects::LinkActions::SUB_FORGOT_PASSWORD ||
i.action==OpenWifi::SecurityObjects::LinkActions::SUB_VERIFY_EMAIL) && !StorageService()->GetSubUserById(i.userId,UInfo)) {
StorageService()->CancelAction(i.id); StorageService()->CancelAction(i.id);
continue; continue;
} }
if(i.action==OpenWifi::SecurityObjects::LinkActions::FORGOT_PASSWORD) { switch(i.action) {
if(AuthService::SendEmailToUser(i.id, UInfo.email, AuthService::FORGOT_PASSWORD)) { case OpenWifi::SecurityObjects::LinkActions::FORGOT_PASSWORD: {
Logger_.information(Poco::format("Send password reset link to %s",UInfo.email)); if(AuthService::SendEmailToUser(i.id, UInfo.email, AuthService::FORGOT_PASSWORD)) {
Logger_.information(Poco::format("Send password reset link to %s",UInfo.email));
}
StorageService()->SentAction(i.id);
}
break;
case OpenWifi::SecurityObjects::LinkActions::VERIFY_EMAIL: {
if(AuthService::SendEmailToUser(i.id, UInfo.email, AuthService::EMAIL_VERIFICATION)) {
Logger_.information(Poco::format("Send email verification link to %s",UInfo.email));
}
StorageService()->SentAction(i.id);
}
break;
case OpenWifi::SecurityObjects::LinkActions::SUB_FORGOT_PASSWORD: {
if(AuthService::SendEmailToSubUser(i.id, UInfo.email, AuthService::FORGOT_PASSWORD)) {
Logger_.information(Poco::format("Send subscriber password reset link to %s",UInfo.email));
}
StorageService()->SentAction(i.id);
}
break;
case OpenWifi::SecurityObjects::LinkActions::SUB_VERIFY_EMAIL: {
if(AuthService::SendEmailToSubUser(i.id, UInfo.email, AuthService::EMAIL_VERIFICATION)) {
Logger_.information(Poco::format("Send subscriber email verification link to %s",UInfo.email));
}
StorageService()->SentAction(i.id);
}
break;
default: {
StorageService()->SentAction(i.id);
} }
StorageService()->SentAction(i.id);
} else if (i.action==OpenWifi::SecurityObjects::LinkActions::VERIFY_EMAIL) {
if(AuthService::SendEmailToUser(i.id, UInfo.email, AuthService::EMAIL_VERIFICATION)) {
Logger_.information(Poco::format("Send email verification link to %s",UInfo.email));
}
StorageService()->SentAction(i.id);
} else {
StorageService()->SentAction(i.id);
} }
} }
} }

View File

@@ -12,11 +12,13 @@ namespace OpenWifi {
class ActionLinkManager : public SubSystemServer, Poco::Runnable { class ActionLinkManager : public SubSystemServer, Poco::Runnable {
public: public:
enum Actions { /* enum Actions {
FORGOT_PASSWORD, FORGOT_PASSWORD,
VERIFY_EMAIL VERIFY_EMAIL,
SUB_FORGOT_PASSWORD,
SUB_VERIFY_EMAIL
}; };
*/
static ActionLinkManager * instance() { static ActionLinkManager * instance() {
static auto * instance_ = new ActionLinkManager; static auto * instance_ = new ActionLinkManager;
return instance_; return instance_;

View File

@@ -46,10 +46,17 @@ namespace OpenWifi {
Signer_.setRSAKey(MicroService::instance().Key()); Signer_.setRSAKey(MicroService::instance().Key());
Signer_.addAllAlgorithms(); Signer_.addAllAlgorithms();
Logger_.notice("Starting..."); Logger_.notice("Starting...");
PasswordValidation_ = PasswordValidationStr_ = MicroService::instance().ConfigGetString("authentication.validation.expression","^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$");
SubPasswordValidation_ = SubPasswordValidationStr_ = MicroService::instance().ConfigGetString("authentication.subvalidation.expression","^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$");
TokenAging_ = (uint64_t) MicroService::instance().ConfigGetInt("authentication.token.ageing", 30 * 24 * 60 * 60); TokenAging_ = (uint64_t) MicroService::instance().ConfigGetInt("authentication.token.ageing", 30 * 24 * 60 * 60);
HowManyOldPassword_ = MicroService::instance().ConfigGetInt("authentication.oldpasswords", 5); HowManyOldPassword_ = MicroService::instance().ConfigGetInt("authentication.oldpasswords", 5);
AccessPolicy_ = MicroService::instance().ConfigPath("openwifi.document.policy.access", "/wwwassets/access_policy.html");
PasswordPolicy_ = MicroService::instance().ConfigPath("openwifi.document.policy.password", "/wwwassets/password_policy.html");
PasswordValidation_ = PasswordValidationStr_ = MicroService::instance().ConfigGetString("authentication.validation.expression","^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$");
SubPasswordValidation_ = SubPasswordValidationStr_ = MicroService::instance().ConfigGetString("subscriber.validation.expression","^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$");
SubAccessPolicy_ = MicroService::instance().ConfigPath("subscriber.policy.access", "/wwwassets/access_policy.html");
SubPasswordPolicy_ = MicroService::instance().ConfigPath("subscriber.policy.password", "/wwwassets/password_policy.html");
return 0; return 0;
} }
@@ -601,7 +608,7 @@ namespace OpenWifi {
bool AuthService::VerifySubEmail(SecurityObjects::UserInfo &UInfo) { bool AuthService::VerifySubEmail(SecurityObjects::UserInfo &UInfo) {
SecurityObjects::ActionLink A; SecurityObjects::ActionLink A;
A.action = OpenWifi::SecurityObjects::LinkActions::VERIFY_EMAIL; A.action = OpenWifi::SecurityObjects::LinkActions::SUB_VERIFY_EMAIL;
A.userId = UInfo.email; A.userId = UInfo.email;
A.id = MicroService::CreateUUID(); A.id = MicroService::CreateUUID();
A.created = std::time(nullptr); A.created = std::time(nullptr);

View File

@@ -104,6 +104,12 @@ namespace OpenWifi{
return MicroService::instance().WWWAssetsDir() + "/the_logo.png"; return MicroService::instance().WWWAssetsDir() + "/the_logo.png";
} }
inline const std::string & GetPasswordPolicy() const { return PasswordPolicy_; }
inline const std::string & GetAccessPolicy() const { return AccessPolicy_; }
inline const std::string & GetSubPasswordPolicy() const { return SubPasswordPolicy_; }
inline const std::string & GetSubAccessPolicy() const { return SubAccessPolicy_; }
private: private:
Poco::JWT::Signer Signer_; Poco::JWT::Signer Signer_;
Poco::SHA2Engine SHA2_; Poco::SHA2Engine SHA2_;
@@ -111,6 +117,10 @@ namespace OpenWifi{
Poco::ExpireLRUCache<std::string,SecurityObjects::UserInfoAndPolicy> UserCache_{256,1200000}; Poco::ExpireLRUCache<std::string,SecurityObjects::UserInfoAndPolicy> UserCache_{256,1200000};
Poco::ExpireLRUCache<std::string,SecurityObjects::UserInfoAndPolicy> SubUserCache_{4096,1200000}; Poco::ExpireLRUCache<std::string,SecurityObjects::UserInfoAndPolicy> SubUserCache_{4096,1200000};
std::string AccessPolicy_;
std::string PasswordPolicy_;
std::string SubAccessPolicy_;
std::string SubPasswordPolicy_;
std::string PasswordValidationStr_; std::string PasswordValidationStr_;
std::string SubPasswordValidationStr_; std::string SubPasswordValidationStr_;
std::regex PasswordValidation_; std::regex PasswordValidation_;

View File

@@ -56,8 +56,6 @@ namespace OpenWifi {
void Daemon::initialize() { void Daemon::initialize() {
AssetDir_ = MicroService::instance().ConfigPath("openwifi.restapi.wwwassets"); AssetDir_ = MicroService::instance().ConfigPath("openwifi.restapi.wwwassets");
AccessPolicy_ = MicroService::instance().ConfigPath("openwifi.document.policy.access", "/wwwassets/access_policy.html");
PasswordPolicy_ = MicroService::instance().ConfigPath("openwifi.document.policy.password", "/wwwassets/password_policy.html");
} }
void MicroServicePostInitialization() { void MicroServicePostInitialization() {

View File

@@ -43,13 +43,9 @@ namespace OpenWifi {
void initialize(); void initialize();
static Daemon *instance(); static Daemon *instance();
inline const std::string & AssetDir() { return AssetDir_; } inline const std::string & AssetDir() { return AssetDir_; }
inline const std::string & GetPasswordPolicy() const { return PasswordPolicy_; }
inline const std::string & GetAccessPolicy() const { return AccessPolicy_; }
private: private:
static Daemon *instance_; static Daemon *instance_;
std::string AssetDir_; std::string AssetDir_;
std::string PasswordPolicy_;
std::string AccessPolicy_;
}; };
inline Daemon * Daemon() { return Daemon::instance(); } inline Daemon * Daemon() { return Daemon::instance(); }

View File

@@ -73,8 +73,8 @@ namespace OpenWifi {
Logger_.information(Poco::format("POLICY-REQUEST(%s): Request.", Request->clientAddress().toString())); Logger_.information(Poco::format("POLICY-REQUEST(%s): Request.", Request->clientAddress().toString()));
Poco::JSON::Object Answer; Poco::JSON::Object Answer;
Answer.set(RESTAPI::Protocol::PASSWORDPATTERN, AuthService()->PasswordValidationExpression()); Answer.set(RESTAPI::Protocol::PASSWORDPATTERN, AuthService()->PasswordValidationExpression());
Answer.set(RESTAPI::Protocol::ACCESSPOLICY, Daemon()->GetAccessPolicy()); Answer.set(RESTAPI::Protocol::ACCESSPOLICY, AuthService()->GetAccessPolicy());
Answer.set(RESTAPI::Protocol::PASSWORDPOLICY, Daemon()->GetPasswordPolicy()); Answer.set(RESTAPI::Protocol::PASSWORDPOLICY, AuthService()->GetPasswordPolicy());
return ReturnObject(Answer); return ReturnObject(Answer);
} }

View File

@@ -47,7 +47,7 @@ namespace OpenWifi {
auto Token = GetBinding(RESTAPI::Protocol::TOKEN, "..."); auto Token = GetBinding(RESTAPI::Protocol::TOKEN, "...");
if (Token == SessionToken_) { if (Token == SessionToken_) {
AuthService()->Logout(Token); AuthService()->SubLogout(Token);
return ReturnStatus(Poco::Net::HTTPResponse::HTTP_NO_CONTENT, true); return ReturnStatus(Poco::Net::HTTPResponse::HTTP_NO_CONTENT, true);
} }
@@ -61,16 +61,14 @@ namespace OpenWifi {
auto password = GetS(RESTAPI::Protocol::PASSWORD, Obj); auto password = GetS(RESTAPI::Protocol::PASSWORD, Obj);
auto newPassword = GetS(RESTAPI::Protocol::NEWPASSWORD, Obj); auto newPassword = GetS(RESTAPI::Protocol::NEWPASSWORD, Obj);
Logger_.information("Doing post");
Poco::toLowerInPlace(userId); Poco::toLowerInPlace(userId);
if(GetBoolParameter(RESTAPI::Protocol::REQUIREMENTS, false)) { if(GetBoolParameter(RESTAPI::Protocol::REQUIREMENTS, false)) {
Logger_.information(Poco::format("POLICY-REQUEST(%s): Request.", Request->clientAddress().toString())); Logger_.information(Poco::format("POLICY-REQUEST(%s): Request.", Request->clientAddress().toString()));
Poco::JSON::Object Answer; Poco::JSON::Object Answer;
Answer.set(RESTAPI::Protocol::PASSWORDPATTERN, AuthService()->SubPasswordValidationExpression()); Answer.set(RESTAPI::Protocol::PASSWORDPATTERN, AuthService()->SubPasswordValidationExpression());
Answer.set(RESTAPI::Protocol::ACCESSPOLICY, Daemon()->GetAccessPolicy()); Answer.set(RESTAPI::Protocol::ACCESSPOLICY, AuthService()->GetSubAccessPolicy());
Answer.set(RESTAPI::Protocol::PASSWORDPOLICY, Daemon()->GetPasswordPolicy()); Answer.set(RESTAPI::Protocol::PASSWORDPOLICY, AuthService()->GetSubPasswordPolicy());
return ReturnObject(Answer); return ReturnObject(Answer);
} }
@@ -81,7 +79,7 @@ namespace OpenWifi {
Logger_.information(Poco::format("FORGOTTEN-PASSWORD(%s): Request for %s", Request->clientAddress().toString(), userId)); Logger_.information(Poco::format("FORGOTTEN-PASSWORD(%s): Request for %s", Request->clientAddress().toString(), userId));
SecurityObjects::ActionLink NewLink; SecurityObjects::ActionLink NewLink;
NewLink.action = OpenWifi::SecurityObjects::LinkActions::FORGOT_PASSWORD; NewLink.action = OpenWifi::SecurityObjects::LinkActions::SUB_FORGOT_PASSWORD;
NewLink.id = MicroService::CreateUUID(); NewLink.id = MicroService::CreateUUID();
NewLink.userId = UInfo1.Id; NewLink.userId = UInfo1.Id;
NewLink.created = std::time(nullptr); NewLink.created = std::time(nullptr);

View File

@@ -6,8 +6,7 @@
// Arilia Wireless Inc. // Arilia Wireless Inc.
// //
#ifndef UCENTRAL_RESTAPI_SECURITYOBJECTS_H #pragma once
#define UCENTRAL_RESTAPI_SECURITYOBJECTS_H
#include "framework/OpenWifiTypes.h" #include "framework/OpenWifiTypes.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
@@ -224,7 +223,9 @@ namespace OpenWifi::SecurityObjects {
enum LinkActions { enum LinkActions {
FORGOT_PASSWORD=1, FORGOT_PASSWORD=1,
VERIFY_EMAIL VERIFY_EMAIL,
SUB_FORGOT_PASSWORD,
SUB_VERIFY_EMAIL
}; };
struct ActionLink { struct ActionLink {
@@ -253,5 +254,3 @@ namespace OpenWifi::SecurityObjects {
bool from_json(Poco::JSON::Object::Ptr &Obj); bool from_json(Poco::JSON::Object::Ptr &Obj);
}; };
} }
#endif //UCENTRAL_RESTAPI_SECURITYOBJECTS_H

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-11-08. // Created by stephane bourque on 2021-11-08.
// //
#ifndef OWSEC_STORAGE_ACTIONLINKS_H #pragma once
#define OWSEC_STORAGE_ACTIONLINKS_H
#include <string> #include <string>
#include <vector> #include <vector>
@@ -74,6 +73,3 @@ namespace OpenWifi {
typedef std::vector <ActionLinkRecord> ActionLinkRecordList; typedef std::vector <ActionLinkRecord> ActionLinkRecordList;
} }
#endif //OWSEC_STORAGE_ACTIONLINKS_H

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-07-15. // Created by stephane bourque on 2021-07-15.
// //
#ifndef WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H #pragma once
#define WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H
namespace OpenWifi { namespace OpenWifi {
@@ -37,6 +36,3 @@ namespace OpenWifi {
} }
#endif //WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-11-16. // Created by stephane bourque on 2021-11-16.
// //
#ifndef OWSEC_STORAGE_PREFERENCES_H #pragma once
#define OWSEC_STORAGE_PREFERENCES_H
#include <string> #include <string>
#include <vector> #include <vector>
@@ -35,5 +34,3 @@ namespace OpenWifi {
typedef std::vector <PreferencesRecord> PreferencesRecordList; typedef std::vector <PreferencesRecord> PreferencesRecordList;
} }
#endif //OWSEC_STORAGE_PREFERENCES_H

View File

@@ -2,8 +2,7 @@
// Created by stephane bourque on 2021-11-08. // Created by stephane bourque on 2021-11-08.
// //
#ifndef OWSEC_STORAGE_TOKENS_H #pragma once
#define OWSEC_STORAGE_TOKENS_H
#include <string> #include <string>
#include <vector> #include <vector>
@@ -26,5 +25,3 @@ namespace OpenWifi {
} }
#endif //OWSEC_STORAGE_TOKENS_H