mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ucentralsec.git
				synced 2025-10-31 02:37:56 +00:00 
			
		
		
		
	Compare commits
	
		
			20 Commits
		
	
	
		
			v2.0.0
			...
			release/v2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 7439051e54 | ||
|   | 0457294136 | ||
|   | 82f683cfc3 | ||
|   | 8cd59bcea7 | ||
|   | ca57334cca | ||
|   | 371bee0baa | ||
|   | 92ef201b2b | ||
|   | 7211cd945b | ||
|   | 7a3e1ca33a | ||
|   | 2d5e7f3c00 | ||
|   | cda8c640fe | ||
|   | 5ff6836c8c | ||
|   | 1e05919e85 | ||
|   | 4c9c693242 | ||
|   | 7564da75b5 | ||
|   | 197925d446 | ||
|   | eee368a918 | ||
|   | 90b5bf526f | ||
|   | 9e5f9c4f0f | ||
|   | 208dda626f | 
| @@ -1,5 +1,5 @@ | |||||||
| cmake_minimum_required(VERSION 3.13) | cmake_minimum_required(VERSION 3.13) | ||||||
| project(ucentralsec VERSION 2.0.0) | project(ucentralsec VERSION 2.1.0) | ||||||
|  |  | ||||||
| set(CMAKE_CXX_STANDARD 17) | set(CMAKE_CXX_STANDARD 17) | ||||||
|  |  | ||||||
| @@ -62,14 +62,18 @@ add_executable( ucentralsec | |||||||
|                 src/KafkaManager.h src/KafkaManager.cpp |                 src/KafkaManager.h src/KafkaManager.cpp | ||||||
|                 src/StorageService.cpp src/StorageService.h |                 src/StorageService.cpp src/StorageService.h | ||||||
|                 src/Utils.cpp src/Utils.h |                 src/Utils.cpp src/Utils.h | ||||||
|                 src/storage_sqlite.cpp src/storage_sqlite.cpp src/storage_pgql.cpp src/storage_mysql.cpp |                 src/storage_setup.cpp | ||||||
|                 src/storage_tables.cpp src/SMTPMailerService.cpp src/SMTPMailerService.h |                 src/storage_tables.cpp src/SMTPMailerService.cpp src/SMTPMailerService.h | ||||||
|                 src/RESTAPI_users_handler.cpp src/RESTAPI_users_handler.h |                 src/RESTAPI_users_handler.cpp src/RESTAPI_users_handler.h | ||||||
|                 src/RESTAPI_user_handler.cpp src/RESTAPI_user_handler.h |                 src/RESTAPI_user_handler.cpp src/RESTAPI_user_handler.h | ||||||
|                 src/RESTAPI_action_links.cpp src/RESTAPI_action_links.h src/storage_users.cpp |                 src/RESTAPI_action_links.cpp src/RESTAPI_action_links.h src/storage_users.cpp | ||||||
|                 src/RESTAPI_InternalServer.cpp src/RESTAPI_InternalServer.h |                 src/RESTAPI_InternalServer.cpp src/RESTAPI_InternalServer.h | ||||||
|                 src/RESTAPI_validateToken_handler.cpp src/RESTAPI_validateToken_handler.h |                 src/RESTAPI_validateToken_handler.cpp src/RESTAPI_validateToken_handler.h | ||||||
|                 src/RESTAPI_systemEndpoints_handler.cpp src/RESTAPI_systemEndpoints_handler.h src/RESTAPI_AssetServer.cpp src/RESTAPI_AssetServer.h src/RESTAPI_avatarHandler.cpp src/RESTAPI_avatarHandler.h src/storage_avatar.cpp src/storage_avatar.h src/storage_users.h) |                 src/RESTAPI_systemEndpoints_handler.cpp src/RESTAPI_systemEndpoints_handler.h | ||||||
|  |                 src/RESTAPI_AssetServer.cpp src/RESTAPI_AssetServer.h | ||||||
|  |                 src/RESTAPI_avatarHandler.cpp src/RESTAPI_avatarHandler.h | ||||||
|  |                 src/storage_avatar.cpp src/storage_avatar.h src/storage_users.h | ||||||
|  |                 src/OpenWifiTypes.h ) | ||||||
|  |  | ||||||
| if(NOT SMALL_BUILD) | if(NOT SMALL_BUILD) | ||||||
|     target_link_libraries(ucentralsec PUBLIC |     target_link_libraries(ucentralsec PUBLIC | ||||||
|   | |||||||
| @@ -46,7 +46,8 @@ RUN addgroup -S "$UCENTRALSEC_USER" && \ | |||||||
|     adduser -S -G "$UCENTRALSEC_USER" "$UCENTRALSEC_USER" |     adduser -S -G "$UCENTRALSEC_USER" "$UCENTRALSEC_USER" | ||||||
|  |  | ||||||
| RUN mkdir /ucentral | RUN mkdir /ucentral | ||||||
| RUN mkdir -p "$UCENTRALSEC_ROOT" "$UCENTRALSEC_CONFIG" | RUN mkdir -p "$UCENTRALSEC_ROOT" "$UCENTRALSEC_CONFIG" && \ | ||||||
|  |     chown "$UCENTRALSEC_USER": "$UCENTRALSEC_ROOT" "$UCENTRALSEC_CONFIG" | ||||||
| RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc su-exec | RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc su-exec | ||||||
|  |  | ||||||
| COPY --from=builder /ucentralsec/cmake-build/ucentralsec /ucentral/ucentralsec | COPY --from=builder /ucentralsec/cmake-build/ucentralsec /ucentral/ucentralsec | ||||||
|   | |||||||
| @@ -1,5 +1,18 @@ | |||||||
| apiVersion: v1 | apiVersion: v2 | ||||||
| appVersion: "1.0" | appVersion: "1.0" | ||||||
| description: A Helm chart for Kubernetes | description: A Helm chart for Kubernetes | ||||||
| name: ucentralsec | name: ucentralsec | ||||||
| version: 0.1.0 | version: 0.1.0 | ||||||
|  | dependencies: | ||||||
|  | - name: postgresql | ||||||
|  |   repository: https://charts.bitnami.com/bitnami | ||||||
|  |   version: 10.9.2 | ||||||
|  |   condition: postgresql.enabled | ||||||
|  | - name: mysql | ||||||
|  |   repository: https://charts.bitnami.com/bitnami | ||||||
|  |   version: 8.8.3 | ||||||
|  |   condition: mysql.enabled | ||||||
|  | - name: mariadb | ||||||
|  |   repository: https://charts.bitnami.com/bitnami | ||||||
|  |   version: 9.4.2 | ||||||
|  |   condition: mariadb.enabled | ||||||
|   | |||||||
| @@ -83,6 +83,11 @@ spec: | |||||||
|             {{- toYaml . | nindent 12 }} |             {{- toYaml . | nindent 12 }} | ||||||
|           {{- end }} |           {{- end }} | ||||||
|  |  | ||||||
|  |       {{- with .Values.securityContext }} | ||||||
|  |       securityContext: | ||||||
|  |         {{- toYaml . | nindent 8 }} | ||||||
|  |       {{- end }} | ||||||
|  |  | ||||||
|       imagePullSecrets: |       imagePullSecrets: | ||||||
|       {{- range $image, $imageValue := .Values.images }} |       {{- range $image, $imageValue := .Values.images }} | ||||||
|         {{- if $imageValue.regcred }} |         {{- if $imageValue.regcred }} | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ fullnameOverride: "" | |||||||
| images: | images: | ||||||
|   ucentralsec: |   ucentralsec: | ||||||
|     repository: tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralsec |     repository: tip-tip-wlan-cloud-ucentral.jfrog.io/ucentralsec | ||||||
|     tag: v2.0.0-RC1 |     tag: v2.1.0-RC1 | ||||||
|     pullPolicy: Always |     pullPolicy: Always | ||||||
| #    regcred: | #    regcred: | ||||||
| #      registry: tip-tip-wlan-cloud-ucentral.jfrog.io | #      registry: tip-tip-wlan-cloud-ucentral.jfrog.io | ||||||
| @@ -85,6 +85,9 @@ resources: {} | |||||||
|   #  cpu: 100m |   #  cpu: 100m | ||||||
|   #  memory: 128Mi |   #  memory: 128Mi | ||||||
|  |  | ||||||
|  | securityContext: | ||||||
|  |   fsGroup: 101 | ||||||
|  |  | ||||||
| nodeSelector: {} | nodeSelector: {} | ||||||
|  |  | ||||||
| tolerations: [] | tolerations: [] | ||||||
| @@ -173,7 +176,7 @@ configProperties: | |||||||
|   ucentral.system.commandchannel: /tmp/app_ucentralsec |   ucentral.system.commandchannel: /tmp/app_ucentralsec | ||||||
|   # Logging |   # Logging | ||||||
|   logging.formatters.f1.class: PatternFormatter |   logging.formatters.f1.class: PatternFormatter | ||||||
|   logging.formatters.f1.pattern: "%s: [%p] %t" |   logging.formatters.f1.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t" | ||||||
|   logging.formatters.f1.times: UTC |   logging.formatters.f1.times: UTC | ||||||
|   logging.channels.c1.class: ConsoleChannel |   logging.channels.c1.class: ConsoleChannel | ||||||
|   logging.channels.c1.formatter: f1 |   logging.channels.c1.formatter: f1 | ||||||
| @@ -186,7 +189,7 @@ configProperties: | |||||||
|   logging.channels.c2.purgeCount: 20 |   logging.channels.c2.purgeCount: 20 | ||||||
|   logging.channels.c3.class: ConsoleChannel |   logging.channels.c3.class: ConsoleChannel | ||||||
|   logging.channels.c3.pattern: "%s: [%p] %t" |   logging.channels.c3.pattern: "%s: [%p] %t" | ||||||
|   logging.loggers.root.channel: c2 |   logging.loggers.root.channel: c1 | ||||||
|   logging.loggers.root.level: debug |   logging.loggers.root.level: debug | ||||||
|  |  | ||||||
|   # -> Secret part |   # -> Secret part | ||||||
| @@ -211,3 +214,64 @@ certs: | |||||||
|   # restapi-ca.pem: "" |   # restapi-ca.pem: "" | ||||||
|   # restapi-cert.pem: "" |   # restapi-cert.pem: "" | ||||||
|   # restapi-key.pem: "" |   # restapi-key.pem: "" | ||||||
|  |  | ||||||
|  | # PostgreSQL (https://github.com/bitnami/charts/tree/master/bitnami/postgresql) | ||||||
|  | postgresql: | ||||||
|  |   enabled: false | ||||||
|  |  | ||||||
|  |   image: | ||||||
|  |     registry: docker.io | ||||||
|  |     repository: bitnami/postgresql | ||||||
|  |     tag: 11.13.0-debian-10-r0 | ||||||
|  |  | ||||||
|  |   postgresqlPostgresPassword: "" | ||||||
|  |   postgresqlUsername: postgres | ||||||
|  |   postgresqlPassword: "" | ||||||
|  |   postgresqlDatabase: "" | ||||||
|  |  | ||||||
|  |   persistence: | ||||||
|  |     enabled: true | ||||||
|  |     storageClass: "" | ||||||
|  |     size: 8Gi | ||||||
|  |  | ||||||
|  | # MySQL (https://github.com/bitnami/charts/tree/master/bitnami/mysql) | ||||||
|  | mysql: | ||||||
|  |   enabled: false | ||||||
|  |  | ||||||
|  |   image: | ||||||
|  |     registry: docker.io | ||||||
|  |     repository: bitnami/mysql | ||||||
|  |     tag: 8.0.26-debian-10-r10 | ||||||
|  |  | ||||||
|  |   auth: | ||||||
|  |     rootPassword: "" | ||||||
|  |     database: my_database | ||||||
|  |     username: "" | ||||||
|  |     password: "" | ||||||
|  |  | ||||||
|  |   primary: | ||||||
|  |     persistence: | ||||||
|  |       enabled: true | ||||||
|  |       storageClass: "" | ||||||
|  |       size: 8Gi | ||||||
|  |  | ||||||
|  | # MariaDB (https://github.com/bitnami/charts/tree/master/bitnami/mariadb) | ||||||
|  | mariadb: | ||||||
|  |   enabled: false | ||||||
|  |  | ||||||
|  |   image: | ||||||
|  |     registry: docker.io | ||||||
|  |     repository: bitnami/mariadb | ||||||
|  |     tag: 10.5.12-debian-10-r0 | ||||||
|  |  | ||||||
|  |   auth: | ||||||
|  |     rootPassword: "" | ||||||
|  |     database: my_database | ||||||
|  |     username: "" | ||||||
|  |     password: "" | ||||||
|  |  | ||||||
|  |   primary: | ||||||
|  |     persistence: | ||||||
|  |       enabled: true | ||||||
|  |       storageClass: "" | ||||||
|  |       size: 8Gi | ||||||
|   | |||||||
| @@ -504,7 +504,7 @@ paths: | |||||||
|               string |               string | ||||||
|           required: true |           required: true | ||||||
|       responses: |       responses: | ||||||
|         200: |         204: | ||||||
|           description: successful operation |           description: successful operation | ||||||
|           content: |           content: | ||||||
|             application/json: |             application/json: | ||||||
| @@ -613,7 +613,7 @@ paths: | |||||||
|             format: int64 |             format: int64 | ||||||
|           required: true |           required: true | ||||||
|       responses: |       responses: | ||||||
|         200: |         204: | ||||||
|           $ref: '#/components/responses/Success' |           $ref: '#/components/responses/Success' | ||||||
|         403: |         403: | ||||||
|           $ref: '#/components/responses/Unauthorized' |           $ref: '#/components/responses/Unauthorized' | ||||||
| @@ -731,7 +731,7 @@ paths: | |||||||
|             format: uuid |             format: uuid | ||||||
|           required: true |           required: true | ||||||
|       responses: |       responses: | ||||||
|         200: |         204: | ||||||
|           $ref: '#/components/responses/Success' |           $ref: '#/components/responses/Success' | ||||||
|         403: |         403: | ||||||
|           $ref: '#/components/responses/Unauthorized' |           $ref: '#/components/responses/Unauthorized' | ||||||
| @@ -818,7 +818,7 @@ paths: | |||||||
|             enum: |             enum: | ||||||
|               - version |               - version | ||||||
|               - times |               - times | ||||||
|         required: true |           required: true | ||||||
|  |  | ||||||
|       responses: |       responses: | ||||||
|         200: |         200: | ||||||
|   | |||||||
| @@ -1,9 +1,5 @@ | |||||||
| // | // | ||||||
| //	License type: BSD 3-Clause License | // Created by stephane bourque on 2021-06-04. | ||||||
| //	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE |  | ||||||
| // |  | ||||||
| //	Created by Stephane Bourque on 2021-03-04. |  | ||||||
| //	Arilia Wireless Inc. |  | ||||||
| // | // | ||||||
|  |  | ||||||
| #ifndef UCENTRALGW_ALBHEALTHCHECKSERVER_H | #ifndef UCENTRALGW_ALBHEALTHCHECKSERVER_H | ||||||
| @@ -24,7 +20,7 @@ | |||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
| #include "SubSystemServer.h" | #include "SubSystemServer.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	class ALBRequestHandler: public Poco::Net::HTTPRequestHandler | 	class ALBRequestHandler: public Poco::Net::HTTPRequestHandler | ||||||
| 			/// Return a HTML document with the current date and time. | 			/// Return a HTML document with the current date and time. | ||||||
| @@ -89,7 +85,7 @@ namespace uCentral { | |||||||
|  |  | ||||||
|             int Start() { |             int Start() { | ||||||
|                 if(Daemon()->ConfigGetBool("alb.enable",false)) { |                 if(Daemon()->ConfigGetBool("alb.enable",false)) { | ||||||
|                     Port_ = (int)Daemon()->ConfigGetInt("alb.port",15017); |                     Port_ = (int)Daemon()->ConfigGetInt("alb.port",15015); | ||||||
|                     Socket_ = std::make_unique<Poco::Net::ServerSocket>(Port_); |                     Socket_ = std::make_unique<Poco::Net::ServerSocket>(Port_); | ||||||
|                     auto Params = new Poco::Net::HTTPServerParams; |                     auto Params = new Poco::Net::HTTPServerParams; | ||||||
|                     Server_ = std::make_unique<Poco::Net::HTTPServer>(new ALBRequestHandlerFactory(Logger_), *Socket_, Params); |                     Server_ = std::make_unique<Poco::Net::HTTPServer>(new ALBRequestHandlerFactory(Logger_), *Socket_, Params); | ||||||
|   | |||||||
							
								
								
									
										88
									
								
								src/AuthClient.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/AuthClient.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | // | ||||||
|  | // Created by stephane bourque on 2021-06-30. | ||||||
|  | // | ||||||
|  | #include <utility> | ||||||
|  |  | ||||||
|  | #include "AuthClient.h" | ||||||
|  | #include "RESTAPI_SecurityObjects.h" | ||||||
|  | #include "Daemon.h" | ||||||
|  | #include "OpenAPIRequest.h" | ||||||
|  |  | ||||||
|  | namespace OpenWifi { | ||||||
|  | 	class AuthClient * AuthClient::instance_ = nullptr; | ||||||
|  |  | ||||||
|  | 	int AuthClient::Start() { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void AuthClient::Stop() { | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	void AuthClient::RemovedCachedToken(const std::string &Token) { | ||||||
|  | 		SubMutexGuard G(Mutex_); | ||||||
|  | 		UserCache_.erase(Token); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool IsTokenExpired(const SecurityObjects::WebToken &T) { | ||||||
|  | 		return ((T.expires_in_+T.created_)<std::time(nullptr)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool AuthClient::IsAuthorized(Poco::Net::HTTPServerRequest & Request, std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo ) { | ||||||
|  | 		SubMutexGuard G(Mutex_); | ||||||
|  |  | ||||||
|  | 		auto User = UserCache_.find(SessionToken); | ||||||
|  | 		if(User != UserCache_.end() && !IsTokenExpired(User->second.webtoken)) { | ||||||
|  | 			UInfo = User->second; | ||||||
|  | 			return true; | ||||||
|  | 		} else { | ||||||
|  | 			Types::StringPairVec QueryData; | ||||||
|  | 			QueryData.push_back(std::make_pair("token",SessionToken)); | ||||||
|  | 			OpenAPIRequestGet	Req(    uSERVICE_SECURITY, | ||||||
|  | 								  	"/api/v1/validateToken", | ||||||
|  | 									 QueryData, | ||||||
|  | 								  5000); | ||||||
|  | 			Poco::JSON::Object::Ptr Response; | ||||||
|  | 			if(Req.Do(Response)==Poco::Net::HTTPResponse::HTTP_OK) { | ||||||
|  | 				if(Response->has("tokenInfo") && Response->has("userInfo")) { | ||||||
|  | 					SecurityObjects::UserInfoAndPolicy	P; | ||||||
|  | 					P.from_json(Response); | ||||||
|  | 					UserCache_[SessionToken] = P; | ||||||
|  | 					UInfo = P; | ||||||
|  | 				} | ||||||
|  | 				return true; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool AuthClient::IsTokenAuthorized(const std::string &SessionToken, SecurityObjects::UserInfoAndPolicy & UInfo) { | ||||||
|  | 		SubMutexGuard G(Mutex_); | ||||||
|  |  | ||||||
|  | 		auto User = UserCache_.find(SessionToken); | ||||||
|  | 		if(User != UserCache_.end() && !IsTokenExpired(User->second.webtoken)) { | ||||||
|  | 			UInfo = User->second; | ||||||
|  | 			return true; | ||||||
|  | 		} else { | ||||||
|  | 			Types::StringPairVec QueryData; | ||||||
|  | 			QueryData.push_back(std::make_pair("token",SessionToken)); | ||||||
|  | 			OpenAPIRequestGet	Req(uSERVICE_SECURITY, | ||||||
|  | 									 "/api/v1/validateToken", | ||||||
|  | 									 QueryData, | ||||||
|  | 									 5000); | ||||||
|  | 			Poco::JSON::Object::Ptr Response; | ||||||
|  | 			if(Req.Do(Response)==Poco::Net::HTTPResponse::HTTP_OK) { | ||||||
|  | 				if(Response->has("tokenInfo") && Response->has("userInfo")) { | ||||||
|  | 					SecurityObjects::UserInfoAndPolicy	P; | ||||||
|  | 					P.from_json(Response); | ||||||
|  | 					UserCache_[SessionToken] = P; | ||||||
|  | 					UInfo = P; | ||||||
|  | 				} | ||||||
|  | 				return true; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								src/AuthClient.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/AuthClient.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | // | ||||||
|  | // Created by stephane bourque on 2021-06-30. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef UCENTRALGW_AUTHCLIENT_H | ||||||
|  | #define UCENTRALGW_AUTHCLIENT_H | ||||||
|  |  | ||||||
|  | #include "Poco/JSON/Object.h" | ||||||
|  | #include "Poco/Net/HTTPServerRequest.h" | ||||||
|  | #include "Poco/Net/HTTPServerResponse.h" | ||||||
|  | #include "Poco/JWT/Signer.h" | ||||||
|  | #include "Poco/SHA2Engine.h" | ||||||
|  | #include "RESTAPI_SecurityObjects.h" | ||||||
|  | #include "SubSystemServer.h" | ||||||
|  |  | ||||||
|  | namespace OpenWifi { | ||||||
|  |  | ||||||
|  | class AuthClient : public SubSystemServer { | ||||||
|  | 	  public: | ||||||
|  | 		explicit AuthClient() noexcept: | ||||||
|  | 			SubSystemServer("Authentication", "AUTH-CLNT", "authentication") | ||||||
|  | 		{ | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		static AuthClient *instance() { | ||||||
|  | 			if (instance_ == nullptr) { | ||||||
|  | 				instance_ = new AuthClient; | ||||||
|  | 			} | ||||||
|  | 			return instance_; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		int Start() override; | ||||||
|  | 		void Stop() override; | ||||||
|  | 		bool IsAuthorized(Poco::Net::HTTPServerRequest & Request, std::string &SessionToken, OpenWifi::SecurityObjects::UserInfoAndPolicy & UInfo ); | ||||||
|  | 		void RemovedCachedToken(const std::string &Token); | ||||||
|  | 		bool IsTokenAuthorized(const std::string &Token, SecurityObjects::UserInfoAndPolicy & UInfo); | ||||||
|  | 	  private: | ||||||
|  | 		static AuthClient 					*instance_; | ||||||
|  | 		OpenWifi::SecurityObjects::UserInfoCache 		UserCache_; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	inline AuthClient * AuthClient() { return AuthClient::instance(); } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif // UCENTRALGW_AUTHCLIENT_H | ||||||
| @@ -22,7 +22,7 @@ | |||||||
|  |  | ||||||
| #include "SMTPMailerService.h" | #include "SMTPMailerService.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class AuthService *AuthService::instance_ = nullptr; |     class AuthService *AuthService::instance_ = nullptr; | ||||||
|  |  | ||||||
|     AuthService::ACCESS_TYPE AuthService::IntToAccessType(int C) { |     AuthService::ACCESS_TYPE AuthService::IntToAccessType(int C) { | ||||||
| @@ -277,7 +277,7 @@ namespace uCentral { | |||||||
|     std::string AuthService::ComputePasswordHash(const std::string &UserName, const std::string &Password) { |     std::string AuthService::ComputePasswordHash(const std::string &UserName, const std::string &Password) { | ||||||
|         std::string UName = Poco::trim(Poco::toLower(UserName)); |         std::string UName = Poco::trim(Poco::toLower(UserName)); | ||||||
|         SHA2_.update(Password + UName); |         SHA2_.update(Password + UName); | ||||||
|         return uCentral::Utils::ToHex(SHA2_.digest()); |         return Utils::ToHex(SHA2_.digest()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     bool AuthService::SendEmailToUser(std::string &Email, EMAIL_REASON Reason) { |     bool AuthService::SendEmailToUser(std::string &Email, EMAIL_REASON Reason) { | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_SecurityObjects.h" | #include "RESTAPI_SecurityObjects.h" | ||||||
|  |  | ||||||
| namespace uCentral{ | namespace OpenWifi{ | ||||||
|  |  | ||||||
|     static const std::string AUTHENTICATION_SYSTEM{"SYSTEM"}; |     static const std::string AUTHENTICATION_SYSTEM{"SYSTEM"}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ | |||||||
| #include "RESTAPI_InternalServer.h" | #include "RESTAPI_InternalServer.h" | ||||||
| #include "AuthService.h" | #include "AuthService.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class Daemon *Daemon::instance_ = nullptr; |     class Daemon *Daemon::instance_ = nullptr; | ||||||
|  |  | ||||||
|     class Daemon *Daemon::instance() { |     class Daemon *Daemon::instance() { | ||||||
| @@ -55,7 +55,7 @@ namespace uCentral { | |||||||
|  |  | ||||||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||||
|     try { |     try { | ||||||
|         auto App = uCentral::Daemon::instance(); |         auto App = OpenWifi::Daemon::instance(); | ||||||
|         auto ExitCode =  App->run(argc, argv); |         auto ExitCode =  App->run(argc, argv); | ||||||
|         delete App; |         delete App; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,15 +21,15 @@ | |||||||
| #include "Poco/Crypto/Cipher.h" | #include "Poco/Crypto/Cipher.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "uCentralTypes.h" | #include "OpenWifiTypes.h" | ||||||
| #include "MicroService.h" | #include "MicroService.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     static const char * vDAEMON_PROPERTIES_FILENAME = "ucentralsec.properties"; |     static const char * vDAEMON_PROPERTIES_FILENAME = "ucentralsec.properties"; | ||||||
|     static const char * vDAEMON_ROOT_ENV_VAR = "UCENTRALSEC_ROOT"; |     static const char * vDAEMON_ROOT_ENV_VAR = "UCENTRALSEC_ROOT"; | ||||||
|     static const char * vDAEMON_CONFIG_ENV_VAR = "UCENTRALSEC_CONFIG"; |     static const char * vDAEMON_CONFIG_ENV_VAR = "UCENTRALSEC_CONFIG"; | ||||||
|     static const char * vDAEMON_APP_NAME = "uCentralSec"; |     static const char * vDAEMON_APP_NAME = uSERVICE_SECURITY.c_str(); | ||||||
|     static const uint64_t vDAEMON_BUS_TIMER = 5000; |     static const uint64_t vDAEMON_BUS_TIMER = 5000; | ||||||
|  |  | ||||||
|     class Daemon : public MicroService { |     class Daemon : public MicroService { | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	class KafkaManager *KafkaManager::instance_ = nullptr; | 	class KafkaManager *KafkaManager::instance_ = nullptr; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,11 +13,11 @@ | |||||||
| #include <thread> | #include <thread> | ||||||
|  |  | ||||||
| #include "SubSystemServer.h" | #include "SubSystemServer.h" | ||||||
| #include "uCentralTypes.h" | #include "OpenWifiTypes.h" | ||||||
|  |  | ||||||
| #include "cppkafka/cppkafka.h" | #include "cppkafka/cppkafka.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	class KafkaManager : public SubSystemServer { | 	class KafkaManager : public SubSystemServer { | ||||||
| 	  public: | 	  public: | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| #ifndef UCENTRALGW_KAFKA_TOPICS_H | #ifndef UCENTRALGW_KAFKA_TOPICS_H | ||||||
| #define UCENTRALGW_KAFKA_TOPICS_H | #define UCENTRALGW_KAFKA_TOPICS_H | ||||||
|  |  | ||||||
| namespace uCentral::KafkaTopics { | namespace OpenWifi::KafkaTopics { | ||||||
| 	static const std::string HEALTHCHECK{"healthcheck"}; | 	static const std::string HEALTHCHECK{"healthcheck"}; | ||||||
| 	static const std::string STATE{"state"}; | 	static const std::string STATE{"state"}; | ||||||
| 	static const std::string CONNECTION{"connection"}; | 	static const std::string CONNECTION{"connection"}; | ||||||
| @@ -13,6 +13,7 @@ namespace uCentral::KafkaTopics { | |||||||
| 	static const std::string ALERTS{"alerts"}; | 	static const std::string ALERTS{"alerts"}; | ||||||
| 	static const std::string COMMAND{"command"}; | 	static const std::string COMMAND{"command"}; | ||||||
| 	static const std::string SERVICE_EVENTS{"service_events"}; | 	static const std::string SERVICE_EVENTS{"service_events"}; | ||||||
|  | 	static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"}; | ||||||
|  |  | ||||||
| 	namespace ServiceEvents { | 	namespace ServiceEvents { | ||||||
| 		static const std::string EVENT_JOIN{"join"}; | 		static const std::string EVENT_JOIN{"join"}; | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ | |||||||
| #include "AuthClient.h" | #include "AuthClient.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	void MyErrorHandler::exception(const Poco::Exception & E) { | 	void MyErrorHandler::exception(const Poco::Exception & E) { | ||||||
| 		Poco::Thread * CurrentThread = Poco::Thread::current(); | 		Poco::Thread * CurrentThread = Poco::Thread::current(); | ||||||
| @@ -112,6 +112,16 @@ namespace uCentral { | |||||||
| 			} else { | 			} else { | ||||||
| 				logger().error("Bad bus message."); | 				logger().error("Bad bus message."); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			auto i=Services_.begin(); | ||||||
|  | 			auto Now = (uint64_t )std::time(nullptr); | ||||||
|  | 			for(;i!=Services_.end();) { | ||||||
|  | 			    if((Now - i->second.LastUpdate)>60) { | ||||||
|  | 			        i = Services_.erase(i); | ||||||
|  | 			    } else | ||||||
|  | 			        ++i; | ||||||
|  | 			} | ||||||
|  |  | ||||||
| 		} catch (const Poco::Exception &E) { | 		} catch (const Poco::Exception &E) { | ||||||
| 			logger().log(E); | 			logger().log(E); | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -24,16 +24,16 @@ | |||||||
| #include "Poco/Net/HTTPServerRequest.h" | #include "Poco/Net/HTTPServerRequest.h" | ||||||
| #include "Poco/Process.h" | #include "Poco/Process.h" | ||||||
|  |  | ||||||
| #include "uCentralTypes.h" | #include "OpenWifiTypes.h" | ||||||
| #include "SubSystemServer.h" | #include "SubSystemServer.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	static const std::string uSERVICE_SECURITY{"ucentralsec"}; | 	static const std::string uSERVICE_SECURITY{"ucentralsec"}; | ||||||
| 	static const std::string uSERVICE_GATEWAY{"ucentralgw"}; | 	static const std::string uSERVICE_GATEWAY{"ucentralgw"}; | ||||||
| 	static const std::string uSERVICE_FIRMWARE{ "ucentralfws"}; | 	static const std::string uSERVICE_FIRMWARE{ "ucentralfms"}; | ||||||
|     static const std::string uSERVICE_TOPOLOGY{ "ucentraltopo"}; |     static const std::string uSERVICE_TOPOLOGY{ "owtopo"}; | ||||||
|     static const std::string uSERVICE_PROVISIONING{ "ucentralprov"}; |     static const std::string uSERVICE_PROVISIONING{ "owprov"}; | ||||||
|  |  | ||||||
| 	class MyErrorHandler : public Poco::ErrorHandler { | 	class MyErrorHandler : public Poco::ErrorHandler { | ||||||
| 	  public: | 	  public: | ||||||
|   | |||||||
							
								
								
									
										68
									
								
								src/OpenAPIRequest.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/OpenAPIRequest.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | // | ||||||
|  | // Created by stephane bourque on 2021-07-01. | ||||||
|  | // | ||||||
|  | #include <iostream> | ||||||
|  |  | ||||||
|  | #include "OpenAPIRequest.h" | ||||||
|  |  | ||||||
|  | #include "Poco/Net/HTTPSClientSession.h" | ||||||
|  | #include <Poco/Net/HTTPClientSession.h> | ||||||
|  | #include <Poco/Net/HTTPRequest.h> | ||||||
|  | #include <Poco/Net/HTTPResponse.h> | ||||||
|  | #include <Poco/StreamCopier.h> | ||||||
|  | #include <Poco/JSON/Parser.h> | ||||||
|  | #include <Poco/Path.h> | ||||||
|  | #include <Poco/URI.h> | ||||||
|  | #include <Poco/Exception.h> | ||||||
|  | #include "Utils.h" | ||||||
|  | #include "Daemon.h" | ||||||
|  |  | ||||||
|  | namespace OpenWifi { | ||||||
|  |  | ||||||
|  | 	OpenAPIRequestGet::OpenAPIRequestGet( 	const std::string & ServiceType, | ||||||
|  | 											const std::string & EndPoint, | ||||||
|  | 									 		Types::StringPairVec & QueryData, | ||||||
|  | 											uint64_t msTimeout): | ||||||
|  |  		Type_(ServiceType), | ||||||
|  |  		EndPoint_(EndPoint), | ||||||
|  | 		QueryData_(QueryData), | ||||||
|  | 		msTimeout_(msTimeout) { | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int OpenAPIRequestGet::Do(Poco::JSON::Object::Ptr &ResponseObject) { | ||||||
|  | 		try { | ||||||
|  | 		    auto Services = Daemon()->GetServices(Type_); | ||||||
|  | 			for(auto const &Svc:Services) { | ||||||
|  | 				Poco::URI	URI(Svc.PrivateEndPoint); | ||||||
|  | 				Poco::Net::HTTPSClientSession Session(URI.getHost(), URI.getPort()); | ||||||
|  |  | ||||||
|  | 				URI.setPath(EndPoint_); | ||||||
|  | 				for (const auto &qp : QueryData_) | ||||||
|  | 					URI.addQueryParameter(qp.first, qp.second); | ||||||
|  |  | ||||||
|  | 				std::string Path(URI.getPathAndQuery()); | ||||||
|  | 				Session.setTimeout(Poco::Timespan(msTimeout_/1000, msTimeout_ % 1000)); | ||||||
|  |  | ||||||
|  | 				Poco::Net::HTTPRequest Request(Poco::Net::HTTPRequest::HTTP_GET, | ||||||
|  | 											   Path, | ||||||
|  | 											   Poco::Net::HTTPMessage::HTTP_1_1); | ||||||
|  | 				Request.add("X-API-KEY", Svc.AccessKey); | ||||||
|  | 				Session.sendRequest(Request); | ||||||
|  |  | ||||||
|  | 				Poco::Net::HTTPResponse Response; | ||||||
|  | 				std::istream &is = Session.receiveResponse(Response); | ||||||
|  | 				if(Response.getStatus()==Poco::Net::HTTPResponse::HTTP_OK) { | ||||||
|  | 					Poco::JSON::Parser	P; | ||||||
|  | 					ResponseObject = P.parse(is).extract<Poco::JSON::Object::Ptr>(); | ||||||
|  | 				} | ||||||
|  | 				return Response.getStatus(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		catch (const Poco::Exception &E) | ||||||
|  | 		{ | ||||||
|  | 			std::cerr << E.displayText() << std::endl; | ||||||
|  | 		} | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								src/OpenAPIRequest.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/OpenAPIRequest.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | // | ||||||
|  | // Created by stephane bourque on 2021-07-01. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #ifndef UCENTRALGW_OPENAPIREQUEST_H | ||||||
|  | #define UCENTRALGW_OPENAPIREQUEST_H | ||||||
|  |  | ||||||
|  | #include "Poco/JSON/Object.h" | ||||||
|  |  | ||||||
|  | #include "OpenWifiTypes.h" | ||||||
|  |  | ||||||
|  | namespace OpenWifi { | ||||||
|  |  | ||||||
|  | 	class OpenAPIRequestGet { | ||||||
|  | 	  public: | ||||||
|  | 		explicit OpenAPIRequestGet( const std::string & Type, | ||||||
|  | 								   	const std::string & EndPoint, | ||||||
|  | 									Types::StringPairVec & QueryData, | ||||||
|  | 									uint64_t msTimeout); | ||||||
|  | 		int Do(Poco::JSON::Object::Ptr &ResponseObject); | ||||||
|  | 	  private: | ||||||
|  | 		std::string 			Type_; | ||||||
|  | 		std::string 			EndPoint_; | ||||||
|  | 		Types::StringPairVec 	QueryData_; | ||||||
|  | 		uint64_t 				msTimeout_; | ||||||
|  | 	}; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif // UCENTRALGW_OPENAPIREQUEST_H | ||||||
| @@ -15,7 +15,9 @@ | |||||||
| #include <utility> | #include <utility> | ||||||
| #include <queue> | #include <queue> | ||||||
| 
 | 
 | ||||||
| namespace uCentral::Types { | #include "Poco/StringTokenizer.h" | ||||||
|  | 
 | ||||||
|  | namespace OpenWifi::Types { | ||||||
|     typedef std::pair<std::string,std::string>              StringPair; |     typedef std::pair<std::string,std::string>              StringPair; | ||||||
| 	typedef std::vector<StringPair>	                        StringPairVec; | 	typedef std::vector<StringPair>	                        StringPairVec; | ||||||
|     typedef std::queue<StringPair>	                        StringPairQueue; |     typedef std::queue<StringPair>	                        StringPairQueue; | ||||||
| @@ -28,12 +30,38 @@ namespace uCentral::Types { | |||||||
| 	typedef std::map<std::string, TopicNotifyFunctionList>  NotifyTable; | 	typedef std::map<std::string, TopicNotifyFunctionList>  NotifyTable; | ||||||
|     typedef std::map<std::string,uint64_t>                  CountedMap; |     typedef std::map<std::string,uint64_t>                  CountedMap; | ||||||
| 
 | 
 | ||||||
|     inline void UpdateCountedMap(CountedMap &M, const std::string &S ) { |     typedef std::string         UUID_t; | ||||||
|  |     typedef std::vector<UUID_t> UUIDvec_t; | ||||||
|  | 
 | ||||||
|  |     inline void UpdateCountedMap(CountedMap &M, const std::string &S, uint64_t Increment=1) { | ||||||
|         auto it = M.find(S); |         auto it = M.find(S); | ||||||
|         if(it==M.end()) |         if(it==M.end()) | ||||||
|             M[S]=1; |             M[S] = Increment; | ||||||
|         else |         else | ||||||
|             it->second += 1; |             it->second += Increment; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     inline std::string to_string( const StringVec &V) { | ||||||
|  |         std::string Result; | ||||||
|  | 
 | ||||||
|  |         bool first=true; | ||||||
|  |         for(const auto &i:V) { | ||||||
|  |             if(first) { | ||||||
|  |                 Result += i; | ||||||
|  |                 first = false; | ||||||
|  |             } else { | ||||||
|  |                 Result += ","; | ||||||
|  |                 Result += i; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return Result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     inline void from_string(const std::string &S, StringVec &V) { | ||||||
|  |         Poco::StringTokenizer   Tokens(S,",",Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); | ||||||
|  | 
 | ||||||
|  |         for(auto const &i:Tokens) | ||||||
|  |             V.emplace_back(i); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @@ -9,7 +9,7 @@ | |||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
| #include "RESTAPI_protocol.h" | #include "RESTAPI_protocol.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     void RESTAPI_AssetServer::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { |     void RESTAPI_AssetServer::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | ||||||
|         if(Request.getMethod()==Poco::Net::HTTPRequest::HTTP_GET) |         if(Request.getMethod()==Poco::Net::HTTPRequest::HTTP_GET) | ||||||
|             DoGet(Request, Response); |             DoGet(Request, Response); | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class RESTAPI_AssetServer : public RESTAPIHandler { |     class RESTAPI_AssetServer : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
|         RESTAPI_AssetServer(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) |         RESTAPI_AssetServer(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ | |||||||
|  |  | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class RESTAPI_InternalServer *RESTAPI_InternalServer::instance_ = nullptr; |     class RESTAPI_InternalServer *RESTAPI_InternalServer::instance_ = nullptr; | ||||||
|  |  | ||||||
| @@ -58,7 +58,7 @@ namespace uCentral { | |||||||
|     Poco::Net::HTTPRequestHandler *InternalRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { |     Poco::Net::HTTPRequestHandler *InternalRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { | ||||||
|  |  | ||||||
|         Logger_.debug(Poco::format("REQUEST(%s): %s %s", |         Logger_.debug(Poco::format("REQUEST(%s): %s %s", | ||||||
|                                    uCentral::Utils::FormatIPv6(Request.clientAddress().toString()), |                                    Utils::FormatIPv6(Request.clientAddress().toString()), | ||||||
|                                    Request.getMethod(), Request.getURI())); |                                    Request.getMethod(), Request.getURI())); | ||||||
|  |  | ||||||
|         Poco::URI uri(Request.getURI()); |         Poco::URI uri(Request.getURI()); | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
| #include "Poco/Net/HTTPServerRequest.h" | #include "Poco/Net/HTTPServerRequest.h" | ||||||
| #include "Poco/Net/NetException.h" | #include "Poco/Net/NetException.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class RESTAPI_InternalServer : public SubSystemServer { |     class RESTAPI_InternalServer : public SubSystemServer { | ||||||
|         public: |         public: | ||||||
|   | |||||||
| @@ -12,10 +12,10 @@ | |||||||
| #include "RESTAPI_SecurityObjects.h" | #include "RESTAPI_SecurityObjects.h" | ||||||
| #include "RESTAPI_utils.h" | #include "RESTAPI_utils.h" | ||||||
|  |  | ||||||
| using uCentral::RESTAPI_utils::field_to_json; | using OpenWifi::RESTAPI_utils::field_to_json; | ||||||
| using uCentral::RESTAPI_utils::field_from_json; | using OpenWifi::RESTAPI_utils::field_from_json; | ||||||
|  |  | ||||||
| namespace uCentral::SecurityObjects { | namespace OpenWifi::SecurityObjects { | ||||||
|  |  | ||||||
| 	void AclTemplate::to_json(Poco::JSON::Object &Obj) const { | 	void AclTemplate::to_json(Poco::JSON::Object &Obj) const { | ||||||
| 		field_to_json(Obj,"Read",Read_); | 		field_to_json(Obj,"Read",Read_); | ||||||
| @@ -303,6 +303,20 @@ namespace uCentral::SecurityObjects { | |||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |     bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes) { | ||||||
|  | 	    try { | ||||||
|  | 	        SecurityObjects::NoteInfoVec NIV; | ||||||
|  | 	        NIV = RESTAPI_utils::to_object_array<SecurityObjects::NoteInfo>(Obj->get("notes").toString()); | ||||||
|  | 	        for(auto const &i:NIV) { | ||||||
|  | 	            SecurityObjects::NoteInfo   ii{.created=(uint64_t)std::time(nullptr), .createdBy=UInfo.email, .note=i.note}; | ||||||
|  | 	            Notes.push_back(ii); | ||||||
|  | 	        } | ||||||
|  | 	    } catch(...) { | ||||||
|  |  | ||||||
|  | 	    } | ||||||
|  | 	    return false; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	void ProfileAction::to_json(Poco::JSON::Object &Obj) const { | 	void ProfileAction::to_json(Poco::JSON::Object &Obj) const { | ||||||
| 		field_to_json(Obj,"resource", resource); | 		field_to_json(Obj,"resource", resource); | ||||||
| 		field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString); | 		field_to_json<ResourceAccessType>(Obj,"access", access, ResourceAccessTypeToString); | ||||||
|   | |||||||
| @@ -10,9 +10,9 @@ | |||||||
| #define UCENTRAL_RESTAPI_SECURITYOBJECTS_H | #define UCENTRAL_RESTAPI_SECURITYOBJECTS_H | ||||||
|  |  | ||||||
| #include "Poco/JSON/Object.h" | #include "Poco/JSON/Object.h" | ||||||
| #include "uCentralTypes.h" | #include "OpenWifiTypes.h" | ||||||
|  |  | ||||||
| namespace uCentral::SecurityObjects { | namespace OpenWifi::SecurityObjects { | ||||||
|  |  | ||||||
| 	struct AclTemplate { | 	struct AclTemplate { | ||||||
| 		bool Read_ = true; | 		bool Read_ = true; | ||||||
| @@ -94,6 +94,8 @@ namespace uCentral::SecurityObjects { | |||||||
| 	}; | 	}; | ||||||
| 	typedef std::vector<UserInfo>   UserInfoVec; | 	typedef std::vector<UserInfo>   UserInfoVec; | ||||||
|  |  | ||||||
|  | 	bool append_from_json(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec & Notes); | ||||||
|  |  | ||||||
| 	struct InternalServiceInfo { | 	struct InternalServiceInfo { | ||||||
| 		std::string privateURI; | 		std::string privateURI; | ||||||
| 		std::string publicURI; | 		std::string publicURI; | ||||||
| @@ -114,9 +116,9 @@ namespace uCentral::SecurityObjects { | |||||||
| 	struct SystemEndpoint { | 	struct SystemEndpoint { | ||||||
| 		std::string type; | 		std::string type; | ||||||
| 		uint64_t 	id = 0; | 		uint64_t 	id = 0; | ||||||
| 		std::string vendor; | 		std::string vendor{"OpenWiFi"}; | ||||||
| 		std::string uri; | 		std::string uri; | ||||||
| 		std::string authenticationType; | 		std::string authenticationType{"internal_v1"}; | ||||||
| 		void to_json(Poco::JSON::Object &Obj) const; | 		void to_json(Poco::JSON::Object &Obj) const; | ||||||
| 		bool from_json(const Poco::JSON::Object::Ptr &Obj); | 		bool from_json(const Poco::JSON::Object::Ptr &Obj); | ||||||
| 	}; | 	}; | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
| #include "RESTAPI_server.h" | #include "RESTAPI_server.h" | ||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     void RESTAPI_action_links::handleRequest(Poco::Net::HTTPServerRequest &Request, |     void RESTAPI_action_links::handleRequest(Poco::Net::HTTPServerRequest &Request, | ||||||
|                        Poco::Net::HTTPServerResponse &Response) { |                        Poco::Net::HTTPServerResponse &Response) { | ||||||
|         //  there is no authentication here, this is just someone clicking on a link |         //  there is no authentication here, this is just someone clicking on a link | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
| #include "Poco/StreamCopier.h" | #include "Poco/StreamCopier.h" | ||||||
| #include "Poco/CountingStream.h" | #include "Poco/CountingStream.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class RESTAPI_action_links : public RESTAPIHandler { |     class RESTAPI_action_links : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
|         RESTAPI_action_links(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) |         RESTAPI_action_links(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
| #include "RESTAPI_protocol.h" | #include "RESTAPI_protocol.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     void AvatarPartHandler::handlePart(const Poco::Net::MessageHeader &Header, std::istream &Stream) { |     void AvatarPartHandler::handlePart(const Poco::Net::MessageHeader &Header, std::istream &Stream) { | ||||||
|         FileType_ = Header.get(RESTAPI::Protocol::CONTENTTYPE, RESTAPI::Protocol::UNSPECIFIED); |         FileType_ = Header.get(RESTAPI::Protocol::CONTENTTYPE, RESTAPI::Protocol::UNSPECIFIED); | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class AvatarPartHandler : public Poco::Net::PartHandler { |     class AvatarPartHandler : public Poco::Net::PartHandler { | ||||||
|     public: |     public: | ||||||
|   | |||||||
| @@ -27,16 +27,16 @@ | |||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
| 	bool RESTAPIHandler::ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &bindings) { | 	bool RESTAPIHandler::ParseBindings(const std::string & Request, const std::list<const char *> & EndPoints, BindingMap &bindings) { | ||||||
| 		std::string Param, Value; | 		std::string Param, Value; | ||||||
|  |  | ||||||
| 		bindings.clear(); | 		bindings.clear(); | ||||||
| 		std::vector<std::string> PathItems = uCentral::Utils::Split(Request, '/'); | 		std::vector<std::string> PathItems = Utils::Split(Request, '/'); | ||||||
|  |  | ||||||
| 		for(const auto &EndPoint:EndPoints) { | 		for(const auto &EndPoint:EndPoints) { | ||||||
| 			std::vector<std::string> ParamItems = uCentral::Utils::Split(EndPoint, '/'); | 			std::vector<std::string> ParamItems = Utils::Split(EndPoint, '/'); | ||||||
| 			if (PathItems.size() != ParamItems.size()) | 			if (PathItems.size() != ParamItems.size()) | ||||||
| 				continue; | 				continue; | ||||||
|  |  | ||||||
| @@ -364,18 +364,21 @@ namespace uCentral { | |||||||
| 		Poco::JSON::Stringifier::stringify(Object, Answer); | 		Poco::JSON::Stringifier::stringify(Object, Answer); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void RESTAPIHandler::InitQueryBlock() { | 	bool RESTAPIHandler::InitQueryBlock() { | ||||||
| 		QB_.SerialNumber = GetParameter(uCentral::RESTAPI::Protocol::SERIALNUMBER, ""); | 		QB_.SerialNumber = GetParameter(RESTAPI::Protocol::SERIALNUMBER, ""); | ||||||
| 		QB_.StartDate = GetParameter(uCentral::RESTAPI::Protocol::STARTDATE, 0); | 		QB_.StartDate = GetParameter(RESTAPI::Protocol::STARTDATE, 0); | ||||||
| 		QB_.EndDate = GetParameter(uCentral::RESTAPI::Protocol::ENDDATE, 0); | 		QB_.EndDate = GetParameter(RESTAPI::Protocol::ENDDATE, 0); | ||||||
| 		QB_.Offset = GetParameter(uCentral::RESTAPI::Protocol::OFFSET, 0); | 		QB_.Offset = GetParameter(RESTAPI::Protocol::OFFSET, 1); | ||||||
| 		QB_.Limit = GetParameter(uCentral::RESTAPI::Protocol::LIMIT, 100); | 		QB_.Limit = GetParameter(RESTAPI::Protocol::LIMIT, 100); | ||||||
| 		QB_.Filter = GetParameter(uCentral::RESTAPI::Protocol::FILTER, ""); | 		QB_.Filter = GetParameter(RESTAPI::Protocol::FILTER, ""); | ||||||
| 		QB_.Select = GetParameter(uCentral::RESTAPI::Protocol::SELECT, ""); | 		QB_.Select = GetParameter(RESTAPI::Protocol::SELECT, ""); | ||||||
| 		QB_.Lifetime = GetBoolParameter(uCentral::RESTAPI::Protocol::LIFETIME,false); | 		QB_.Lifetime = GetBoolParameter(RESTAPI::Protocol::LIFETIME,false); | ||||||
| 		QB_.LogType = GetParameter(uCentral::RESTAPI::Protocol::LOGTYPE,0); | 		QB_.LogType = GetParameter(RESTAPI::Protocol::LOGTYPE,0); | ||||||
| 		QB_.LastOnly = GetBoolParameter(uCentral::RESTAPI::Protocol::LASTONLY,false); | 		QB_.LastOnly = GetBoolParameter(RESTAPI::Protocol::LASTONLY,false); | ||||||
| 		QB_.Newest = GetBoolParameter(uCentral::RESTAPI::Protocol::NEWEST,false); | 		QB_.Newest = GetBoolParameter(RESTAPI::Protocol::NEWEST,false); | ||||||
|  |  | ||||||
|  | 		if(QB_.Offset<1) return false; | ||||||
|  | 		return true; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	[[nodiscard]] uint64_t RESTAPIHandler::Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default){ | 	[[nodiscard]] uint64_t RESTAPIHandler::Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default){ | ||||||
| @@ -397,7 +400,7 @@ namespace uCentral { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	[[nodiscard]] uint64_t RESTAPIHandler::GetWhen(const Poco::JSON::Object::Ptr &Obj) { | 	[[nodiscard]] uint64_t RESTAPIHandler::GetWhen(const Poco::JSON::Object::Ptr &Obj) { | ||||||
| 		return RESTAPIHandler::Get(uCentral::RESTAPI::Protocol::WHEN, Obj); | 		return RESTAPIHandler::Get(RESTAPI::Protocol::WHEN, Obj); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_SecurityObjects.h" | #include "RESTAPI_SecurityObjects.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class RESTAPI_PartHandler: public Poco::Net::PartHandler |     class RESTAPI_PartHandler: public Poco::Net::PartHandler | ||||||
|     { |     { | ||||||
| @@ -140,7 +140,7 @@ namespace uCentral { | |||||||
|         void SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response); |         void SendFile(Poco::File & File, Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response); | ||||||
|  |  | ||||||
|         const std::string &GetBinding(const std::string &Name, const std::string &Default); |         const std::string &GetBinding(const std::string &Name, const std::string &Default); | ||||||
| 		void InitQueryBlock(); | 		bool InitQueryBlock(); | ||||||
|  |  | ||||||
| 		[[nodiscard]] static uint64_t Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default=0); | 		[[nodiscard]] static uint64_t Get(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, uint64_t Default=0); | ||||||
| 		[[nodiscard]] static std::string GetS(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, const std::string & Default=""); | 		[[nodiscard]] static std::string GetS(const char *Parameter,const Poco::JSON::Object::Ptr &Obj, const std::string & Default=""); | ||||||
| @@ -166,7 +166,7 @@ namespace uCentral { | |||||||
| 						   Poco::Net::HTTPServerResponse &Response) override { | 						   Poco::Net::HTTPServerResponse &Response) override { | ||||||
| 			if (!IsAuthorized(Request, Response)) | 			if (!IsAuthorized(Request, Response)) | ||||||
| 				return; | 				return; | ||||||
| 			BadRequest(Request, Response); | 			BadRequest(Request, Response, "Unknown API endpoint"); | ||||||
| 		} | 		} | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ | |||||||
|  |  | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
| 	void RESTAPI_oauth2Handler::handleRequest(Poco::Net::HTTPServerRequest &Request, | 	void RESTAPI_oauth2Handler::handleRequest(Poco::Net::HTTPServerRequest &Request, | ||||||
| 											  Poco::Net::HTTPServerResponse &Response) { | 											  Poco::Net::HTTPServerResponse &Response) { | ||||||
|  |  | ||||||
| @@ -29,9 +29,9 @@ namespace uCentral { | |||||||
| 				Poco::JSON::Parser parser; | 				Poco::JSON::Parser parser; | ||||||
| 				Poco::JSON::Object::Ptr Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); | 				Poco::JSON::Object::Ptr Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); | ||||||
|  |  | ||||||
| 				auto userId = GetS(uCentral::RESTAPI::Protocol::USERID, Obj); | 				auto userId = GetS(RESTAPI::Protocol::USERID, Obj); | ||||||
| 				auto password = GetS(uCentral::RESTAPI::Protocol::PASSWORD, Obj); | 				auto password = GetS(RESTAPI::Protocol::PASSWORD, Obj); | ||||||
| 				auto newPassword = GetS(uCentral::RESTAPI::Protocol::NEWPASSWORD, Obj); | 				auto newPassword = GetS(RESTAPI::Protocol::NEWPASSWORD, Obj); | ||||||
|  |  | ||||||
|                 if(GetBoolParameter(RESTAPI::Protocol::REQUIREMENTS, false)) { |                 if(GetBoolParameter(RESTAPI::Protocol::REQUIREMENTS, false)) { | ||||||
|                     Poco::JSON::Object  Answer; |                     Poco::JSON::Object  Answer; | ||||||
| @@ -79,7 +79,7 @@ namespace uCentral { | |||||||
|                     UnAuthorized(Request, Response, "Not authorized."); |                     UnAuthorized(Request, Response, "Not authorized."); | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				auto Token = GetBinding(uCentral::RESTAPI::Protocol::TOKEN, "..."); | 				auto Token = GetBinding(RESTAPI::Protocol::TOKEN, "..."); | ||||||
| 				if (Token == SessionToken_) { | 				if (Token == SessionToken_) { | ||||||
| 					AuthService()->Logout(Token); | 					AuthService()->Logout(Token); | ||||||
| 					ReturnStatus(Request, Response, Poco::Net::HTTPResponse::HTTP_NO_CONTENT, true); | 					ReturnStatus(Request, Response, Poco::Net::HTTPResponse::HTTP_NO_CONTENT, true); | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
| 	class RESTAPI_oauth2Handler : public RESTAPIHandler { | 	class RESTAPI_oauth2Handler : public RESTAPIHandler { | ||||||
| 	  public: | 	  public: | ||||||
| 		RESTAPI_oauth2Handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | 		RESTAPI_oauth2Handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| #ifndef UCENTRALGW_RESTAPI_PROTOCOL_H | #ifndef UCENTRALGW_RESTAPI_PROTOCOL_H | ||||||
| #define UCENTRALGW_RESTAPI_PROTOCOL_H | #define UCENTRALGW_RESTAPI_PROTOCOL_H | ||||||
|  |  | ||||||
| namespace uCentral::RESTAPI::Protocol { | namespace OpenWifi::RESTAPI::Protocol { | ||||||
| 	static const char * CAPABILITIES = "capabilities"; | 	static const char * CAPABILITIES = "capabilities"; | ||||||
| 	static const char * LOGS = "logs"; | 	static const char * LOGS = "logs"; | ||||||
| 	static const char * HEALTHCHECKS = "healthchecks"; | 	static const char * HEALTHCHECKS = "healthchecks"; | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ | |||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class RESTAPI_Server *RESTAPI_Server::instance_ = nullptr; |     class RESTAPI_Server *RESTAPI_Server::instance_ = nullptr; | ||||||
|  |  | ||||||
| @@ -59,7 +59,7 @@ namespace uCentral { | |||||||
|  |  | ||||||
|     Poco::Net::HTTPRequestHandler *RequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { |     Poco::Net::HTTPRequestHandler *RequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) { | ||||||
|  |  | ||||||
|         Logger_.debug(Poco::format("REQUEST(%s): %s %s", uCentral::Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI())); |         Logger_.debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI())); | ||||||
|  |  | ||||||
|         Poco::URI uri(Request.getURI()); |         Poco::URI uri(Request.getURI()); | ||||||
|         const auto & Path = uri.getPath(); |         const auto & Path = uri.getPath(); | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
| #include "Poco/Net/HTTPServerRequest.h" | #include "Poco/Net/HTTPServerRequest.h" | ||||||
| #include "Poco/Net/NetException.h" | #include "Poco/Net/NetException.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class RESTAPI_Server : public SubSystemServer { |     class RESTAPI_Server : public SubSystemServer { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
| #include "RESTAPI_SecurityObjects.h" | #include "RESTAPI_SecurityObjects.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     void RESTAPI_systemEndpoints_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, |     void RESTAPI_systemEndpoints_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, | ||||||
|                                                         Poco::Net::HTTPServerResponse &Response) { |                                                         Poco::Net::HTTPServerResponse &Response) { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| #define UCENTRALSEC_RESTAPI_SYSTEMENDPOINTS_HANDLER_H | #define UCENTRALSEC_RESTAPI_SYSTEMENDPOINTS_HANDLER_H | ||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class RESTAPI_systemEndpoints_handler : public RESTAPIHandler { |     class RESTAPI_systemEndpoints_handler : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
|         RESTAPI_systemEndpoints_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) |         RESTAPI_systemEndpoints_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
| #include "RESTAPI_protocol.h" | #include "RESTAPI_protocol.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
| 	void RESTAPI_system_command::handleRequest(Poco::Net::HTTPServerRequest &Request, | 	void RESTAPI_system_command::handleRequest(Poco::Net::HTTPServerRequest &Request, | ||||||
| 											   Poco::Net::HTTPServerResponse &Response) { | 											   Poco::Net::HTTPServerResponse &Response) { | ||||||
|  |  | ||||||
| @@ -27,8 +27,8 @@ namespace uCentral { | |||||||
| 			DoPost(Request, Response); | 			DoPost(Request, Response); | ||||||
| 		else if(Request.getMethod()==Poco::Net::HTTPRequest::HTTP_GET) | 		else if(Request.getMethod()==Poco::Net::HTTPRequest::HTTP_GET) | ||||||
| 			DoGet(Request, Response); | 			DoGet(Request, Response); | ||||||
|  | 		else | ||||||
| 		BadRequest(Request, Response); |             BadRequest(Request, Response, "Unsupported method."); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void RESTAPI_system_command::DoPost(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | 	void RESTAPI_system_command::DoPost(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | ||||||
| @@ -36,19 +36,19 @@ namespace uCentral { | |||||||
| 			Poco::JSON::Parser parser; | 			Poco::JSON::Parser parser; | ||||||
| 			auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); | 			auto Obj = parser.parse(Request.stream()).extract<Poco::JSON::Object::Ptr>(); | ||||||
|  |  | ||||||
| 			if (Obj->has(uCentral::RESTAPI::Protocol::COMMAND)) { | 			if (Obj->has(RESTAPI::Protocol::COMMAND)) { | ||||||
| 				auto Command = Poco::toLower(Obj->get(uCentral::RESTAPI::Protocol::COMMAND).toString()); | 				auto Command = Poco::toLower(Obj->get(RESTAPI::Protocol::COMMAND).toString()); | ||||||
| 				if (Command == uCentral::RESTAPI::Protocol::SETLOGLEVEL) { | 				if (Command == RESTAPI::Protocol::SETLOGLEVEL) { | ||||||
| 					if (Obj->has(uCentral::RESTAPI::Protocol::PARAMETERS) && | 					if (Obj->has(RESTAPI::Protocol::PARAMETERS) && | ||||||
| 						Obj->isArray(uCentral::RESTAPI::Protocol::PARAMETERS)) { | 						Obj->isArray(RESTAPI::Protocol::PARAMETERS)) { | ||||||
| 						auto ParametersBlock = Obj->getArray(uCentral::RESTAPI::Protocol::PARAMETERS); | 						auto ParametersBlock = Obj->getArray(RESTAPI::Protocol::PARAMETERS); | ||||||
| 						for (const auto &i:*ParametersBlock) { | 						for (const auto &i:*ParametersBlock) { | ||||||
| 							Poco::JSON::Parser pp; | 							Poco::JSON::Parser pp; | ||||||
| 							auto InnerObj = pp.parse(i).extract<Poco::JSON::Object::Ptr>(); | 							auto InnerObj = pp.parse(i).extract<Poco::JSON::Object::Ptr>(); | ||||||
| 							if (InnerObj->has(uCentral::RESTAPI::Protocol::TAG) && | 							if (InnerObj->has(RESTAPI::Protocol::TAG) && | ||||||
| 								InnerObj->has(uCentral::RESTAPI::Protocol::VALUE)) { | 								InnerObj->has(RESTAPI::Protocol::VALUE)) { | ||||||
| 								auto Name = GetS(uCentral::RESTAPI::Protocol::TAG, InnerObj); | 								auto Name = GetS(RESTAPI::Protocol::TAG, InnerObj); | ||||||
| 								auto Value = GetS(uCentral::RESTAPI::Protocol::VALUE, InnerObj); | 								auto Value = GetS(RESTAPI::Protocol::VALUE, InnerObj); | ||||||
| 								Daemon()->SetSubsystemLogLevel(Name, Value); | 								Daemon()->SetSubsystemLogLevel(Name, Value); | ||||||
| 								Logger_.information(Poco::format("Setting log level for %s at %s", Name, Value)); | 								Logger_.information(Poco::format("Setting log level for %s at %s", Name, Value)); | ||||||
| 							} | 							} | ||||||
| @@ -56,45 +56,45 @@ namespace uCentral { | |||||||
| 						OK(Request, Response); | 						OK(Request, Response); | ||||||
| 						return; | 						return; | ||||||
| 					} | 					} | ||||||
| 				} else if (Command == uCentral::RESTAPI::Protocol::GETLOGLEVELS) { | 				} else if (Command == RESTAPI::Protocol::GETLOGLEVELS) { | ||||||
| 					auto CurrentLogLevels = Daemon()->GetLogLevels(); | 					auto CurrentLogLevels = Daemon()->GetLogLevels(); | ||||||
| 					Poco::JSON::Object	Result; | 					Poco::JSON::Object	Result; | ||||||
| 					Poco::JSON::Array	Array; | 					Poco::JSON::Array	Array; | ||||||
| 					for(auto &[Name,Level]:CurrentLogLevels) { | 					for(auto &[Name,Level]:CurrentLogLevels) { | ||||||
| 						Poco::JSON::Object	Pair; | 						Poco::JSON::Object	Pair; | ||||||
| 						Pair.set( uCentral::RESTAPI::Protocol::TAG,Name); | 						Pair.set( RESTAPI::Protocol::TAG,Name); | ||||||
| 						Pair.set(uCentral::RESTAPI::Protocol::VALUE,Level); | 						Pair.set(RESTAPI::Protocol::VALUE,Level); | ||||||
| 						Array.add(Pair); | 						Array.add(Pair); | ||||||
| 					} | 					} | ||||||
| 					Result.set(uCentral::RESTAPI::Protocol::TAGLIST,Array); | 					Result.set(RESTAPI::Protocol::TAGLIST,Array); | ||||||
| 					ReturnObject(Request,Result,Response); | 					ReturnObject(Request,Result,Response); | ||||||
| 					return; | 					return; | ||||||
| 				} else if (Command == uCentral::RESTAPI::Protocol::GETLOGLEVELNAMES) { | 				} else if (Command == RESTAPI::Protocol::GETLOGLEVELNAMES) { | ||||||
| 					Poco::JSON::Object	Result; | 					Poco::JSON::Object	Result; | ||||||
| 					Poco::JSON::Array	LevelNamesArray; | 					Poco::JSON::Array	LevelNamesArray; | ||||||
| 					const Types::StringVec & LevelNames = Daemon()->GetLogLevelNames(); | 					const Types::StringVec & LevelNames = Daemon()->GetLogLevelNames(); | ||||||
| 					for(const auto &i:LevelNames) | 					for(const auto &i:LevelNames) | ||||||
| 						LevelNamesArray.add(i); | 						LevelNamesArray.add(i); | ||||||
| 					Result.set(uCentral::RESTAPI::Protocol::LIST,LevelNamesArray); | 					Result.set(RESTAPI::Protocol::LIST,LevelNamesArray); | ||||||
| 					ReturnObject(Request,Result,Response); | 					ReturnObject(Request,Result,Response); | ||||||
| 					return; | 					return; | ||||||
| 				} else if (Command == uCentral::RESTAPI::Protocol::GETSUBSYSTEMNAMES) { | 				} else if (Command == RESTAPI::Protocol::GETSUBSYSTEMNAMES) { | ||||||
| 					Poco::JSON::Object	Result; | 					Poco::JSON::Object	Result; | ||||||
| 					Poco::JSON::Array	LevelNamesArray; | 					Poco::JSON::Array	LevelNamesArray; | ||||||
| 					const Types::StringVec & SubSystemNames = Daemon()->GetSubSystems(); | 					const Types::StringVec & SubSystemNames = Daemon()->GetSubSystems(); | ||||||
| 					for(const auto &i:SubSystemNames) | 					for(const auto &i:SubSystemNames) | ||||||
| 						LevelNamesArray.add(i); | 						LevelNamesArray.add(i); | ||||||
| 					Result.set(uCentral::RESTAPI::Protocol::LIST,LevelNamesArray); | 					Result.set(RESTAPI::Protocol::LIST,LevelNamesArray); | ||||||
| 					ReturnObject(Request,Result,Response); | 					ReturnObject(Request,Result,Response); | ||||||
| 					return; | 					return; | ||||||
| 				} else if (Command == uCentral::RESTAPI::Protocol::STATS) { | 				} else if (Command == RESTAPI::Protocol::STATS) { | ||||||
|  |  | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} catch(const Poco::Exception &E) { | 		} catch(const Poco::Exception &E) { | ||||||
| 			Logger_.log(E); | 			Logger_.log(E); | ||||||
| 		} | 		} | ||||||
| 		BadRequest(Request, Response); | 		BadRequest(Request, Response, "Unsupported or missing parameters."); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	void RESTAPI_system_command::DoGet(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | 	void RESTAPI_system_command::DoGet(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | ||||||
| @@ -126,7 +126,7 @@ namespace uCentral { | |||||||
| 		} catch (const Poco::Exception &E) { | 		} catch (const Poco::Exception &E) { | ||||||
| 			Logger_.log(E); | 			Logger_.log(E); | ||||||
| 		} | 		} | ||||||
| 		BadRequest(Request, Response); | 		BadRequest(Request, Response, "Unsupported or missing parameters."); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -11,7 +11,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
| class RESTAPI_system_command : public RESTAPIHandler { | class RESTAPI_system_command : public RESTAPIHandler { | ||||||
|   public: |   public: | ||||||
| 	RESTAPI_system_command(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | 	RESTAPI_system_command(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
| #include "RESTAPI_utils.h" | #include "RESTAPI_utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     void RESTAPI_user_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { |     void RESTAPI_user_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | ||||||
|  |  | ||||||
|         if (!ContinueProcessing(Request, Response)) |         if (!ContinueProcessing(Request, Response)) | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class RESTAPI_user_handler : public RESTAPIHandler { |     class RESTAPI_user_handler : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
|         RESTAPI_user_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) |         RESTAPI_user_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| #include "RESTAPI_protocol.h" | #include "RESTAPI_protocol.h" | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     void RESTAPI_users_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { |     void RESTAPI_users_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, Poco::Net::HTTPServerResponse &Response) { | ||||||
|         if (!ContinueProcessing(Request, Response)) |         if (!ContinueProcessing(Request, Response)) | ||||||
|             return; |             return; | ||||||
| @@ -41,7 +41,7 @@ namespace uCentral { | |||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     Poco::JSON::Object RetObj; |                     Poco::JSON::Object RetObj; | ||||||
|                     RetObj.set(uCentral::RESTAPI::Protocol::USERS, ArrayObj); |                     RetObj.set(RESTAPI::Protocol::USERS, ArrayObj); | ||||||
|                     ReturnObject(Request, RetObj, Response); |                     ReturnObject(Request, RetObj, Response); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
| @@ -61,7 +61,7 @@ namespace uCentral { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 Poco::JSON::Object RetObj; |                 Poco::JSON::Object RetObj; | ||||||
|                 RetObj.set(uCentral::RESTAPI::Protocol::USERS, ArrayObj); |                 RetObj.set(RESTAPI::Protocol::USERS, ArrayObj); | ||||||
|                 ReturnObject(Request, RetObj, Response); |                 ReturnObject(Request, RetObj, Response); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class RESTAPI_users_handler : public RESTAPIHandler { |     class RESTAPI_users_handler : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
|         RESTAPI_users_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) |         RESTAPI_users_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_utils.h" | #include "RESTAPI_utils.h" | ||||||
|  |  | ||||||
| namespace uCentral::RESTAPI_utils { | namespace OpenWifi::RESTAPI_utils { | ||||||
|  |  | ||||||
| 	void EmbedDocument(const std::string & ObjName, Poco::JSON::Object & Obj, const std::string &ObjStr) { | 	void EmbedDocument(const std::string & ObjName, Poco::JSON::Object & Obj, const std::string &ObjStr) { | ||||||
| 		std::string D = ObjStr.empty() ? "{}" : ObjStr; | 		std::string D = ObjStr.empty() ? "{}" : ObjStr; | ||||||
|   | |||||||
| @@ -9,10 +9,10 @@ | |||||||
| #include "Poco/JSON/Object.h" | #include "Poco/JSON/Object.h" | ||||||
| #include "Poco/JSON/Parser.h" | #include "Poco/JSON/Parser.h" | ||||||
| #include "Poco/Net/HTTPServerRequest.h" | #include "Poco/Net/HTTPServerRequest.h" | ||||||
| #include "uCentralTypes.h" | #include "OpenWifiTypes.h" | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral::RESTAPI_utils { | namespace OpenWifi::RESTAPI_utils { | ||||||
|  |  | ||||||
| 	void EmbedDocument(const std::string & ObjName, Poco::JSON::Object & Obj, const std::string &ObjStr); | 	void EmbedDocument(const std::string & ObjName, Poco::JSON::Object & Obj, const std::string &ObjStr); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| #include "AuthService.h" | #include "AuthService.h" | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     void RESTAPI_validateToken_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, |     void RESTAPI_validateToken_handler::handleRequest(Poco::Net::HTTPServerRequest &Request, | ||||||
|                                                       Poco::Net::HTTPServerResponse &Response) { |                                                       Poco::Net::HTTPServerResponse &Response) { | ||||||
|  |  | ||||||
| @@ -33,6 +33,7 @@ namespace uCentral { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             NotFound(Request, Response); |             NotFound(Request, Response); | ||||||
|  |             return; | ||||||
|         } catch (const Poco::Exception &E) { |         } catch (const Poco::Exception &E) { | ||||||
|             Logger_.log(E); |             Logger_.log(E); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|  |  | ||||||
| #include "RESTAPI_handler.h" | #include "RESTAPI_handler.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     class RESTAPI_validateToken_handler : public RESTAPIHandler { |     class RESTAPI_validateToken_handler : public RESTAPIHandler { | ||||||
|     public: |     public: | ||||||
|         RESTAPI_validateToken_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) |         RESTAPI_validateToken_handler(const RESTAPIHandler::BindingMap &bindings, Poco::Logger &L, bool Internal) | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class SMTPMailerService * SMTPMailerService::instance_ = nullptr; |     class SMTPMailerService * SMTPMailerService::instance_ = nullptr; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|  |  | ||||||
| #include "Poco/File.h" | #include "Poco/File.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     enum MESSAGE_ATTRIBUTES { |     enum MESSAGE_ATTRIBUTES { | ||||||
|         RECIPIENT_EMAIL, |         RECIPIENT_EMAIL, | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
| #include "Poco/Util/Application.h" | #include "Poco/Util/Application.h" | ||||||
| #include "Utils.h" | #include "Utils.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     class Storage *Storage::instance_ = nullptr; |     class Storage *Storage::instance_ = nullptr; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ | |||||||
| #include "RESTAPI_SecurityObjects.h" | #include "RESTAPI_SecurityObjects.h" | ||||||
| #include "SubSystemServer.h" | #include "SubSystemServer.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     static const std::string AllActionLinksFieldsForSelect { |     static const std::string AllActionLinksFieldsForSelect { | ||||||
|             "Id, " |             "Id, " | ||||||
| @@ -179,6 +179,16 @@ namespace uCentral { | |||||||
|  |  | ||||||
|         int 	Setup_SQLite(); |         int 	Setup_SQLite(); | ||||||
| 		[[nodiscard]] std::string ConvertParams(const std::string &S) const; | 		[[nodiscard]] std::string ConvertParams(const std::string &S) const; | ||||||
|  | 		[[nodiscard]] inline std::string ComputeRange(uint64_t From, uint64_t HowMany) { | ||||||
|  | 		    if(dbType_==sqlite) { | ||||||
|  | 		        return " LIMIT " + std::to_string(From-1) + ", " + std::to_string(HowMany) + " "; | ||||||
|  | 		    } else if(dbType_==pgsql) { | ||||||
|  | 		        return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " "; | ||||||
|  | 		    } else if(dbType_==mysql) { | ||||||
|  | 		        return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " "; | ||||||
|  | 		    } | ||||||
|  | 		    return " LIMIT " + std::to_string(HowMany) + " OFFSET " + std::to_string(From-1) + " "; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| #ifndef SMALL_BUILD | #ifndef SMALL_BUILD | ||||||
|         int 	Setup_MySQL(); |         int 	Setup_MySQL(); | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ | |||||||
|  |  | ||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
| SubSystemServer::SubSystemServer(std::string Name, const std::string &LoggingPrefix, | SubSystemServer::SubSystemServer(std::string Name, const std::string &LoggingPrefix, | ||||||
| 								 std::string SubSystemConfigPrefix) | 								 std::string SubSystemConfigPrefix) | ||||||
| 	: Name_(std::move(Name)), Logger_(Poco::Logger::get(LoggingPrefix)), | 	: Name_(std::move(Name)), Logger_(Poco::Logger::get(LoggingPrefix)), | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ | |||||||
| using SubMutex = std::recursive_mutex; | using SubMutex = std::recursive_mutex; | ||||||
| using SubMutexGuard = std::lock_guard<SubMutex>; | using SubMutexGuard = std::lock_guard<SubMutex>; | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
| class PropertiesFileServerEntry { | class PropertiesFileServerEntry { | ||||||
|   public: |   public: | ||||||
| 	PropertiesFileServerEntry(std::string Address, uint32_t port, std::string Key_file, | 	PropertiesFileServerEntry(std::string Address, uint32_t port, std::string Key_file, | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ | |||||||
| #include "uCentralProtocol.h" | #include "uCentralProtocol.h" | ||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace uCentral::Utils { | namespace OpenWifi::Utils { | ||||||
|  |  | ||||||
| 	[[nodiscard]] bool ValidSerialNumber(const std::string &Serial) { | 	[[nodiscard]] bool ValidSerialNumber(const std::string &Serial) { | ||||||
| 		return ((Serial.size() < uCentralProtocol::SERIAL_NUMBER_LENGTH) && | 		return ((Serial.size() < uCentralProtocol::SERIAL_NUMBER_LENGTH) && | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								src/Utils.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/Utils.h
									
									
									
									
									
								
							| @@ -11,16 +11,18 @@ | |||||||
|  |  | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <string> | #include <string> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <sstream> | ||||||
|  |  | ||||||
| #include "Poco/Net/NetworkInterface.h" | #include "Poco/Net/NetworkInterface.h" | ||||||
| #include "Poco/Net/IPAddress.h" | #include "Poco/Net/IPAddress.h" | ||||||
| #include "Poco/String.h" | #include "Poco/String.h" | ||||||
| #include "Poco/File.h" | #include "Poco/File.h" | ||||||
| #include "uCentralTypes.h" | #include "OpenWifiTypes.h" | ||||||
|  |  | ||||||
| #define DBGLINE { std::cout << __FILE__ << ":" << __func__ << ":" << __LINE__ << std::endl; }; | #define DBGLINE { std::cout << __FILE__ << ":" << __func__ << ":" << __LINE__ << std::endl; }; | ||||||
|  |  | ||||||
| namespace uCentral::Utils { | namespace OpenWifi::Utils { | ||||||
|  |  | ||||||
|     enum MediaTypeEncodings { |     enum MediaTypeEncodings { | ||||||
|         PLAIN, |         PLAIN, | ||||||
| @@ -73,5 +75,16 @@ namespace uCentral::Utils { | |||||||
|     [[nodiscard]] std::string SecondsToNiceText(uint64_t Seconds); |     [[nodiscard]] std::string SecondsToNiceText(uint64_t Seconds); | ||||||
|  |  | ||||||
| 	[[nodiscard]] bool IPinRange(const std::string &Range, const Poco::Net::IPAddress &IP); | 	[[nodiscard]] bool IPinRange(const std::string &Range, const Poco::Net::IPAddress &IP); | ||||||
|  |  | ||||||
|  | 	template< typename T > | ||||||
|  | 	std::string int_to_hex( T i ) | ||||||
|  | 	{ | ||||||
|  | 		std::stringstream stream; | ||||||
|  | 		stream << std::setfill ('0') << std::setw(12) | ||||||
|  | 		<< std::hex << i; | ||||||
|  | 		return stream.str(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
| #endif // UCENTRALGW_UTILS_H | #endif // UCENTRALGW_UTILS_H | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
| #include "Poco/Data/LOBStream.h" | #include "Poco/Data/LOBStream.h" | ||||||
| #include "Daemon.h" | #include "Daemon.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|                             "Id			    VARCHAR(36) PRIMARY KEY, " |                             "Id			    VARCHAR(36) PRIMARY KEY, " | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| #ifndef WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H | #ifndef WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H | ||||||
| #define WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H | #define WLAN_CLOUD_UCENTRALSEC_STORAGE_AVATAR_H | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,46 +0,0 @@ | |||||||
| // |  | ||||||
| //	License type: BSD 3-Clause License |  | ||||||
| //	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE |  | ||||||
| // |  | ||||||
| //	Created by Stephane Bourque on 2021-03-04. |  | ||||||
| //	Arilia Wireless Inc. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include "Daemon.h" |  | ||||||
| #include "StorageService.h" |  | ||||||
|  |  | ||||||
| namespace uCentral { |  | ||||||
|  |  | ||||||
| #ifdef	SMALL_BUILD |  | ||||||
| 	int Service::Setup_MySQL() { uCentral::instance()->exit(Poco::Util::Application::EXIT_CONFIG);} |  | ||||||
| #else |  | ||||||
|  |  | ||||||
| 	int Storage::Setup_MySQL() { |  | ||||||
|  |  | ||||||
| 		dbType_ = mysql ; |  | ||||||
|  |  | ||||||
| 		Logger_.notice("MySQL Storage enabled."); |  | ||||||
| 		auto NumSessions = Daemon()->ConfigGetInt("storage.type.mysql.maxsessions", 64); |  | ||||||
| 		auto IdleTime = Daemon()->ConfigGetInt("storage.type.mysql.idletime", 60); |  | ||||||
| 		auto Host = Daemon()->ConfigGetString("storage.type.mysql.host"); |  | ||||||
| 		auto Username = Daemon()->ConfigGetString("storage.type.mysql.username"); |  | ||||||
| 		auto Password = Daemon()->ConfigGetString("storage.type.mysql.password"); |  | ||||||
| 		auto Database = Daemon()->ConfigGetString("storage.type.mysql.database"); |  | ||||||
| 		auto Port = Daemon()->ConfigGetString("storage.type.mysql.port"); |  | ||||||
|  |  | ||||||
| 		std::string ConnectionStr = |  | ||||||
| 			"host=" + Host + |  | ||||||
| 			";user=" + Username + |  | ||||||
| 			";password=" + Password + |  | ||||||
| 			";db=" + Database + |  | ||||||
| 			";port=" + Port + |  | ||||||
| 			";compress=true;auto-reconnect=true"; |  | ||||||
|  |  | ||||||
| 		MySQLConn_ = std::make_unique<Poco::Data::MySQL::Connector>(); |  | ||||||
| 		MySQLConn_->registerConnector(); |  | ||||||
| 		Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_->name(), ConnectionStr, 4, NumSessions, IdleTime); |  | ||||||
|  |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| @@ -1,47 +0,0 @@ | |||||||
| // |  | ||||||
| //	License type: BSD 3-Clause License |  | ||||||
| //	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE |  | ||||||
| // |  | ||||||
| //	Created by Stephane Bourque on 2021-03-04. |  | ||||||
| //	Arilia Wireless Inc. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include "Daemon.h" |  | ||||||
| #include "StorageService.h" |  | ||||||
|  |  | ||||||
| namespace uCentral { |  | ||||||
|  |  | ||||||
| #ifdef SMALL_BUILD |  | ||||||
| 	int Service::Setup_PostgreSQL() { uCentral::instance()->exit(Poco::Util::Application::EXIT_CONFIG);} |  | ||||||
| #else |  | ||||||
| 	int Storage::Setup_PostgreSQL() { |  | ||||||
| 		Logger_.notice("PostgreSQL Storage enabled."); |  | ||||||
|  |  | ||||||
| 		dbType_ = pgsql ; |  | ||||||
|  |  | ||||||
| 		auto NumSessions = Daemon()->ConfigGetInt("storage.type.postgresql.maxsessions", 64); |  | ||||||
| 		auto IdleTime = Daemon()->ConfigGetInt("storage.type.postgresql.idletime", 60); |  | ||||||
| 		auto Host = Daemon()->ConfigGetString("storage.type.postgresql.host"); |  | ||||||
| 		auto Username = Daemon()->ConfigGetString("storage.type.postgresql.username"); |  | ||||||
| 		auto Password = Daemon()->ConfigGetString("storage.type.postgresql.password"); |  | ||||||
| 		auto Database = Daemon()->ConfigGetString("storage.type.postgresql.database"); |  | ||||||
| 		auto Port = Daemon()->ConfigGetString("storage.type.postgresql.port"); |  | ||||||
| 		auto ConnectionTimeout = Daemon()->ConfigGetString("storage.type.postgresql.connectiontimeout"); |  | ||||||
|  |  | ||||||
| 		std::string ConnectionStr = |  | ||||||
| 			"host=" + Host + |  | ||||||
| 			" user=" + Username + |  | ||||||
| 			" password=" + Password + |  | ||||||
| 			" dbname=" + Database + |  | ||||||
| 			" port=" + Port + |  | ||||||
| 			" connect_timeout=" + ConnectionTimeout; |  | ||||||
|  |  | ||||||
| 		PostgresConn_ = std::make_unique<Poco::Data::PostgreSQL::Connector>(); |  | ||||||
| 		PostgresConn_->registerConnector(); |  | ||||||
| 		Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_->name(), ConnectionStr, 4, NumSessions, IdleTime); |  | ||||||
|  |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| } |  | ||||||
							
								
								
									
										82
									
								
								src/storage_setup.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/storage_setup.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | // | ||||||
|  | // Created by stephane bourque on 2021-08-22. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #include "StorageService.h" | ||||||
|  | #include "Daemon.h" | ||||||
|  |  | ||||||
|  | namespace OpenWifi { | ||||||
|  |  | ||||||
|  | #ifdef	SMALL_BUILD | ||||||
|  |     int Service::Setup_MySQL() { Daemon()->exit(Poco::Util::Application::EXIT_CONFIG); return 0; } | ||||||
|  |     int Service::Setup_PostgreSQL() { Daemon()->exit(Poco::Util::Application::EXIT_CONFIG); return 0; } | ||||||
|  | #else | ||||||
|  |  | ||||||
|  |     int Storage::Setup_SQLite() { | ||||||
|  |         Logger_.notice("SQLite Storage enabled."); | ||||||
|  |         auto DBName = Daemon()->DataDir() + "/" + Daemon()->ConfigGetString("storage.type.sqlite.db"); | ||||||
|  |         auto NumSessions = Daemon()->ConfigGetInt("storage.type.sqlite.maxsessions", 64); | ||||||
|  |         auto IdleTime = Daemon()->ConfigGetInt("storage.type.sqlite.idletime", 60); | ||||||
|  |         SQLiteConn_ = std::make_unique<Poco::Data::SQLite::Connector>(); | ||||||
|  |         SQLiteConn_->registerConnector(); | ||||||
|  |         Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_->name(), DBName, 4, NumSessions, IdleTime); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     int Storage::Setup_MySQL() { | ||||||
|  |  | ||||||
|  |         Logger_.notice("MySQL Storage enabled."); | ||||||
|  |         auto NumSessions = Daemon()->ConfigGetInt("storage.type.mysql.maxsessions", 64); | ||||||
|  |         auto IdleTime = Daemon()->ConfigGetInt("storage.type.mysql.idletime", 60); | ||||||
|  |         auto Host = Daemon()->ConfigGetString("storage.type.mysql.host"); | ||||||
|  |         auto Username = Daemon()->ConfigGetString("storage.type.mysql.username"); | ||||||
|  |         auto Password = Daemon()->ConfigGetString("storage.type.mysql.password"); | ||||||
|  |         auto Database = Daemon()->ConfigGetString("storage.type.mysql.database"); | ||||||
|  |         auto Port = Daemon()->ConfigGetString("storage.type.mysql.port"); | ||||||
|  |  | ||||||
|  |         std::string ConnectionStr = | ||||||
|  |                 "host=" + Host + | ||||||
|  |                 ";user=" + Username + | ||||||
|  |                 ";password=" + Password + | ||||||
|  |                 ";db=" + Database + | ||||||
|  |                 ";port=" + Port + | ||||||
|  |                 ";compress=true;auto-reconnect=true"; | ||||||
|  |  | ||||||
|  |         MySQLConn_ = std::make_unique<Poco::Data::MySQL::Connector>(); | ||||||
|  |         MySQLConn_->registerConnector(); | ||||||
|  |         Pool_ = std::make_unique<Poco::Data::SessionPool>(MySQLConn_->name(), ConnectionStr, 4, NumSessions, IdleTime); | ||||||
|  |  | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     int Storage::Setup_PostgreSQL() { | ||||||
|  |         Logger_.notice("PostgreSQL Storage enabled."); | ||||||
|  |  | ||||||
|  |         auto NumSessions = Daemon()->ConfigGetInt("storage.type.postgresql.maxsessions", 64); | ||||||
|  |         auto IdleTime = Daemon()->ConfigGetInt("storage.type.postgresql.idletime", 60); | ||||||
|  |         auto Host = Daemon()->ConfigGetString("storage.type.postgresql.host"); | ||||||
|  |         auto Username = Daemon()->ConfigGetString("storage.type.postgresql.username"); | ||||||
|  |         auto Password = Daemon()->ConfigGetString("storage.type.postgresql.password"); | ||||||
|  |         auto Database = Daemon()->ConfigGetString("storage.type.postgresql.database"); | ||||||
|  |         auto Port = Daemon()->ConfigGetString("storage.type.postgresql.port"); | ||||||
|  |         auto ConnectionTimeout = Daemon()->ConfigGetString("storage.type.postgresql.connectiontimeout"); | ||||||
|  |  | ||||||
|  |         std::string ConnectionStr = | ||||||
|  |                 "host=" + Host + | ||||||
|  |                 " user=" + Username + | ||||||
|  |                 " password=" + Password + | ||||||
|  |                 " dbname=" + Database + | ||||||
|  |                 " port=" + Port + | ||||||
|  |                 " connect_timeout=" + ConnectionTimeout; | ||||||
|  |  | ||||||
|  |         PostgresConn_ = std::make_unique<Poco::Data::PostgreSQL::Connector>(); | ||||||
|  |         PostgresConn_->registerConnector(); | ||||||
|  |         Pool_ = std::make_unique<Poco::Data::SessionPool>(PostgresConn_->name(), ConnectionStr, 4, NumSessions, IdleTime); | ||||||
|  |  | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| // |  | ||||||
| //	License type: BSD 3-Clause License |  | ||||||
| //	License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE |  | ||||||
| // |  | ||||||
| //	Created by Stephane Bourque on 2021-03-04. |  | ||||||
| //	Arilia Wireless Inc. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include "Daemon.h" |  | ||||||
| #include "StorageService.h" |  | ||||||
|  |  | ||||||
| namespace uCentral { |  | ||||||
| 	int Storage::Setup_SQLite() { |  | ||||||
| 		Logger_.notice("SQLite Storage enabled."); |  | ||||||
|  |  | ||||||
|         auto DBName = Daemon()->DataDir() + "/" + Daemon()->ConfigGetString("storage.type.sqlite.db"); |  | ||||||
| 		auto NumSessions = Daemon()->ConfigGetInt("storage.type.sqlite.maxsessions", 64); |  | ||||||
| 		auto IdleTime = Daemon()->ConfigGetInt("storage.type.sqlite.idletime", 60); |  | ||||||
|  |  | ||||||
| 		SQLiteConn_ = std::make_unique<Poco::Data::SQLite::Connector>(); |  | ||||||
| 		SQLiteConn_->registerConnector(); |  | ||||||
| 		Pool_ = std::make_unique<Poco::Data::SessionPool>(SQLiteConn_->name(), DBName, 4, NumSessions, IdleTime); |  | ||||||
|  |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -7,7 +7,7 @@ | |||||||
| #include "storage_users.h" | #include "storage_users.h" | ||||||
| #include "storage_avatar.h" | #include "storage_avatar.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     int Storage::Create_Tables() { |     int Storage::Create_Tables() { | ||||||
|         Create_UserTable(); |         Create_UserTable(); | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| #include "Poco/Tuple.h" | #include "Poco/Tuple.h" | ||||||
| #include "storage_users.h" | #include "storage_users.h" | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|  |  | ||||||
|     bool Convert(const UserInfoRecord &T, SecurityObjects::UserInfo &U) { |     bool Convert(const UserInfoRecord &T, SecurityObjects::UserInfo &U) { | ||||||
|         U.Id = T.get<0>(); |         U.Id = T.get<0>(); | ||||||
| @@ -221,17 +221,16 @@ namespace uCentral { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     bool Storage::GetUsers( uint64_t Offset, uint64_t Limit, SecurityObjects::UserInfoVec & Users) { |     bool Storage::GetUsers( uint64_t Offset, uint64_t HowMany, SecurityObjects::UserInfoVec & Users) { | ||||||
|         try { |         try { | ||||||
|             Poco::Data::Session Sess = Pool_->get(); |             Poco::Data::Session Sess = Pool_->get(); | ||||||
|             Poco::Data::Statement Select(Sess); |             Poco::Data::Statement Select(Sess); | ||||||
|             UserInfoRecordList Records; |             UserInfoRecordList Records; | ||||||
|  |  | ||||||
|             std::string St1{"select " + AllUsersFieldsForSelect + " from users"}; |             std::string St1{"select " + AllUsersFieldsForSelect + " from users order by id ASC "}; | ||||||
|  |  | ||||||
|             Select << ConvertParams(St1) , |             Select << ConvertParams(St1) + ComputeRange(Offset, HowMany), | ||||||
|                     Poco::Data::Keywords::into(Records), |                         Poco::Data::Keywords::into(Records); | ||||||
|                     Poco::Data::Keywords::range(Offset, Offset + Limit); |  | ||||||
|             Select.execute(); |             Select.execute(); | ||||||
|  |  | ||||||
|             for(const auto &R:Records) { |             for(const auto &R:Records) { | ||||||
|   | |||||||
| @@ -5,9 +5,9 @@ | |||||||
| #ifndef UCENTRALSEC_STORAGE_USERS_H | #ifndef UCENTRALSEC_STORAGE_USERS_H | ||||||
| #define UCENTRALSEC_STORAGE_USERS_H | #define UCENTRALSEC_STORAGE_USERS_H | ||||||
|  |  | ||||||
| namespace uCentral { | namespace OpenWifi { | ||||||
|     static const std::string AllUsersFieldsForCreation{ |     static const std::string AllUsersFieldsForCreation{ | ||||||
|             "Id             varchar(36)," |         " Id             varchar(36) UNIQUE PRIMARY KEY," | ||||||
|             "name           varchar," |             "name           varchar," | ||||||
|             "description    varchar," |             "description    varchar," | ||||||
|             "avatar         varchar," |             "avatar         varchar," | ||||||
| @@ -116,6 +116,9 @@ namespace uCentral { | |||||||
|             "canceled       bigint" |             "canceled       bigint" | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     typedef Poco::Tuple < |     typedef Poco::Tuple < | ||||||
|         std::string,    // Id = 0; |         std::string,    // Id = 0; | ||||||
|         std::string,    // name; |         std::string,    // name; | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|  |  | ||||||
| #include "Poco/String.h" | #include "Poco/String.h" | ||||||
|  |  | ||||||
| namespace uCentral::uCentralProtocol { | namespace OpenWifi::uCentralProtocol { | ||||||
|  |  | ||||||
| 	const int SERIAL_NUMBER_LENGTH = 30; | 	const int SERIAL_NUMBER_LENGTH = 30; | ||||||
|  |  | ||||||
| @@ -79,6 +79,15 @@ namespace uCentral::uCentralProtocol { | |||||||
| 	static const char * VERBOSE = "verbose"; | 	static const char * VERBOSE = "verbose"; | ||||||
| 	static const char * BANDS = "bands"; | 	static const char * BANDS = "bands"; | ||||||
| 	static const char * CHANNELS = "channels"; | 	static const char * CHANNELS = "channels"; | ||||||
|  | 	static const char * PASSWORD = "password"; | ||||||
|  | 	static const char * DEVICEUPDATE = "deviceupdate"; | ||||||
|  |  | ||||||
|  |     static const char * SERIALNUMBER = "serialNumber"; | ||||||
|  |     static const char * COMPATIBLE = "compatible"; | ||||||
|  |     static const char * DISCONNECTION = "disconnection"; | ||||||
|  |     static const char * TIMESTAMP = "timestamp"; | ||||||
|  |     static const char * SYSTEM = "system"; | ||||||
|  |     static const char * HOST = "host"; | ||||||
|  |  | ||||||
| 	enum EVENT_MSG { | 	enum EVENT_MSG { | ||||||
| 			ET_UNKNOWN, | 			ET_UNKNOWN, | ||||||
| @@ -89,7 +98,8 @@ namespace uCentral::uCentralProtocol { | |||||||
| 			ET_CRASHLOG, | 			ET_CRASHLOG, | ||||||
| 			ET_PING, | 			ET_PING, | ||||||
| 			ET_CFGPENDING, | 			ET_CFGPENDING, | ||||||
| 			ET_RECOVERY | 			ET_RECOVERY, | ||||||
|  | 			ET_DEVICEUPDATE | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
| 	static EVENT_MSG EventFromString(const std::string & Method) { | 	static EVENT_MSG EventFromString(const std::string & Method) { | ||||||
| @@ -109,6 +119,8 @@ namespace uCentral::uCentralProtocol { | |||||||
| 			return ET_CFGPENDING; | 			return ET_CFGPENDING; | ||||||
| 		} else if (!Poco::icompare(Method, RECOVERY)) { | 		} else if (!Poco::icompare(Method, RECOVERY)) { | ||||||
| 			return ET_RECOVERY; | 			return ET_RECOVERY; | ||||||
|  | 		} else if (!Poco::icompare(Method, DEVICEUPDATE)) { | ||||||
|  | 			return ET_DEVICEUPDATE; | ||||||
| 		} else | 		} else | ||||||
| 			return ET_UNKNOWN; | 			return ET_UNKNOWN; | ||||||
| 	}; | 	}; | ||||||
|   | |||||||
| @@ -73,7 +73,7 @@ ucentral.kafka.queue.buffering.max.ms = 50 | |||||||
|  |  | ||||||
| ucentral.document.policy.access = /wwwassets/access_policy.html | ucentral.document.policy.access = /wwwassets/access_policy.html | ||||||
| ucentral.document.policy.password = /wwwassets/password_policy.html | ucentral.document.policy.password = /wwwassets/password_policy.html | ||||||
|  | ucentral.avatar.maxsize = 2000000 | ||||||
| # | # | ||||||
| # This section select which form of persistence you need | # This section select which form of persistence you need | ||||||
| # Only one selected at a time. If you select multiple, this service will die if a horrible | # Only one selected at a time. If you select multiple, this service will die if a horrible | ||||||
|   | |||||||
| @@ -5,41 +5,18 @@ Wants=network-online.target | |||||||
|  |  | ||||||
| [Service] | [Service] | ||||||
| Type=simple | Type=simple | ||||||
| # the default is not to use systemd for cgroups because the delegate issues still |  | ||||||
| # exists and systemd currently does not support the cgroup feature set required |  | ||||||
| # for containers run by docker |  | ||||||
| Environment="UCENTRALSEC_ROOT=/home/admin/dev/wlan-cloud-ucentralsec" | Environment="UCENTRALSEC_ROOT=/home/admin/dev/wlan-cloud-ucentralsec" | ||||||
| ExecStart=/home/admin/dev/wlan-cloud-ucentralsec/cmake-build/ucentralsec | ExecStart=/home/admin/dev/wlan-cloud-ucentralsec/cmake-build/ucentralsec | ||||||
| WorkingDirectory=/home/admin/dev/wlan-cloud-ucentralsec | WorkingDirectory=/home/admin/dev/wlan-cloud-ucentralsec | ||||||
| ExecReload=/bin/kill -s HUP $MAINPID | # ExecReload=/bin/kill -s HUP $MAINPID | ||||||
| User=admin | User=admin | ||||||
| TimeoutSec=0 | # TimeoutSec=0 | ||||||
| RestartSec=2 | RestartSec=2 | ||||||
| Restart=always | Restart=always | ||||||
|  |  | ||||||
| # Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229. |  | ||||||
| # Both the old, and new location are accepted by systemd 229 and up, so using the old location |  | ||||||
| # to make them work for either version of systemd. |  | ||||||
| StartLimitBurst=3 | StartLimitBurst=3 | ||||||
|  | # KillMode=process | ||||||
|  | LimitNOFILE=500000 | ||||||
|  | LimitNPROC=500000 | ||||||
|  |  | ||||||
| # Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230. | [Install] | ||||||
| # Both the old, and new name are accepted by systemd 230 and up, so using the old name to make | WantedBy=multi-user.target | ||||||
| # this option work for either version of systemd. |  | ||||||
| # StartLimitInterval=60s |  | ||||||
|  |  | ||||||
| # Having non-zero Limit*s causes performance problems due to accounting overhead |  | ||||||
| # in the kernel. We recommend using cgroups to do container-local accounting. |  | ||||||
| LimitNOFILE=infinity |  | ||||||
| LimitNPROC=infinity |  | ||||||
| LimitCORE=infinity |  | ||||||
|  |  | ||||||
| # Comment TasksMax if your systemd version does not support it. |  | ||||||
| # Only systemd 226 and above support this option. |  | ||||||
| TasksMax=infinity |  | ||||||
|  |  | ||||||
| # set delegate yes so that systemd does not reset the cgroups of docker containers |  | ||||||
| Delegate=yes |  | ||||||
|  |  | ||||||
| # kill only the docker process, not all processes in the cgroup |  | ||||||
| KillMode=process |  | ||||||
| OOMScoreAdjust=-500 |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user