mirror of
				https://github.com/Telecominfraproject/wlan-cloud-ucentralsec.git
				synced 2025-11-03 20:27:45 +00:00 
			
		
		
		
	Compare commits
	
		
			10 Commits
		
	
	
		
			v2.9.0
			...
			release/v2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					aaebf74539 | ||
| 
						 | 
					5a6baeca7d | ||
| 
						 | 
					776ecabf81 | ||
| 
						 | 
					5c6814852e | ||
| 
						 | 
					90c700702e | ||
| 
						 | 
					7c3ae1b5b9 | ||
| 
						 | 
					15c2f6a4fc | ||
| 
						 | 
					9d5855bc6e | ||
| 
						 | 
					b7d72474da | ||
| 
						 | 
					33650f5cea | 
@@ -1,5 +1,5 @@
 | 
				
			|||||||
cmake_minimum_required(VERSION 3.13)
 | 
					cmake_minimum_required(VERSION 3.13)
 | 
				
			||||||
project(owsec VERSION 2.9.0)
 | 
					project(owsec VERSION 2.10.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(CMAKE_CXX_STANDARD 17)
 | 
					set(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,7 +118,7 @@ add_executable( owsec
 | 
				
			|||||||
        src/framework/RESTAPI_PartHandler.h
 | 
					        src/framework/RESTAPI_PartHandler.h
 | 
				
			||||||
        src/framework/MicroService.cpp
 | 
					        src/framework/MicroService.cpp
 | 
				
			||||||
        src/framework/MicroServiceExtra.h
 | 
					        src/framework/MicroServiceExtra.h
 | 
				
			||||||
 | 
					        src/framework/default_device_types.h
 | 
				
			||||||
        src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
 | 
					        src/RESTObjects/RESTAPI_SecurityObjects.h src/RESTObjects/RESTAPI_SecurityObjects.cpp
 | 
				
			||||||
        src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
 | 
					        src/RESTObjects/RESTAPI_GWobjects.h src/RESTObjects/RESTAPI_GWobjects.cpp
 | 
				
			||||||
        src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
 | 
					        src/RESTObjects/RESTAPI_FMSObjects.h src/RESTObjects/RESTAPI_FMSObjects.cpp
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,16 @@ if [[ "$TEMPLATE_CONFIG" = 'true' ]]; then
 | 
				
			|||||||
  STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owsec"} \
 | 
					  STORAGE_TYPE_MYSQL_PASSWORD=${STORAGE_TYPE_MYSQL_PASSWORD:-"owsec"} \
 | 
				
			||||||
  STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owsec"} \
 | 
					  STORAGE_TYPE_MYSQL_DATABASE=${STORAGE_TYPE_MYSQL_DATABASE:-"owsec"} \
 | 
				
			||||||
  STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
 | 
					  STORAGE_TYPE_MYSQL_PORT=${STORAGE_TYPE_MYSQL_PORT:-"3306"} \
 | 
				
			||||||
 | 
					  USER_HELPER_EMAIL=${USER_HELPER_EMAIL:-"openwifi@telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  SUB_HELPER_EMAIL=${SUB_HELPER_EMAIL:-"openwifi@telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  GLOBAL_USER_HELPER_EMAIL=${GLOBAL_USER_HELPER_EMAIL:-"openwifi@telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  GLOBAL_SUB_HELPER_EMAIL=${GLOBAL_SUB_HELPER_EMAIL:-"openwifi@telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  USER_HELPER_SITE=${USER_HELPER_SITE:-"https://openwifi.telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  SUB_HELPER_SITE=${SUB_HELPER_SITE:-"https://openwifi.telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  USER_SYSTEM_LOGIN=${USER_SYSTEM_LOGIN:-"https://openwifi.telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  SUB_SYSTEM_LOGIN=${SUB_SYSTEM_LOGIN:-"https://openwifi.telecominfraproject.com"} \
 | 
				
			||||||
 | 
					  USER_SIGNATURE=${USER_SIGNATURE:-"Telecom Infra Project"} \
 | 
				
			||||||
 | 
					  SUB_SIGNATURE=${SUB_SIGNATURE:-"Telecom Infra Project"} \
 | 
				
			||||||
  envsubst < /owsec.properties.tmpl > $OWSEC_CONFIG/owsec.properties
 | 
					  envsubst < /owsec.properties.tmpl > $OWSEC_CONFIG/owsec.properties
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ fullnameOverride: ""
 | 
				
			|||||||
images:
 | 
					images:
 | 
				
			||||||
  owsec:
 | 
					  owsec:
 | 
				
			||||||
    repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owsec
 | 
					    repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owsec
 | 
				
			||||||
    tag: main
 | 
					    tag: v2.10.0
 | 
				
			||||||
    pullPolicy: Always
 | 
					    pullPolicy: Always
 | 
				
			||||||
#    regcred:
 | 
					#    regcred:
 | 
				
			||||||
#      registry: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
					#      registry: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1110,6 +1110,12 @@ paths:
 | 
				
			|||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
            format: uuid
 | 
					            format: uuid
 | 
				
			||||||
          required: true
 | 
					          required: true
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          description: When used, signifies the the id is actually the email address of the user, and not its uuid
 | 
				
			||||||
 | 
					          name: byEmail
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: boolean
 | 
				
			||||||
 | 
					          required: false
 | 
				
			||||||
      responses:
 | 
					      responses:
 | 
				
			||||||
        200:
 | 
					        200:
 | 
				
			||||||
          $ref: '#/components/schemas/UserInfo'
 | 
					          $ref: '#/components/schemas/UserInfo'
 | 
				
			||||||
@@ -1226,6 +1232,12 @@ paths:
 | 
				
			|||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
            format: uuid
 | 
					            format: uuid
 | 
				
			||||||
          required: true
 | 
					          required: true
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          description: When used, signifies the the id is actually the email address of the user, and not its uuid
 | 
				
			||||||
 | 
					          name: byEmail
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: boolean
 | 
				
			||||||
 | 
					          required: false
 | 
				
			||||||
      responses:
 | 
					      responses:
 | 
				
			||||||
        200:
 | 
					        200:
 | 
				
			||||||
          $ref: '#/components/schemas/UserInfo'
 | 
					          $ref: '#/components/schemas/UserInfo'
 | 
				
			||||||
@@ -1849,19 +1861,6 @@ paths:
 | 
				
			|||||||
  #########################################################################################
 | 
					  #########################################################################################
 | 
				
			||||||
  ##  The following calls are restricted to the private system side APIs
 | 
					  ##  The following calls are restricted to the private system side APIs
 | 
				
			||||||
  #########################################################################################
 | 
					  #########################################################################################
 | 
				
			||||||
  /systemServices:
 | 
					 | 
				
			||||||
    get:
 | 
					 | 
				
			||||||
      tags:
 | 
					 | 
				
			||||||
        - Security
 | 
					 | 
				
			||||||
      summary: Retrieve the basic system information. This information is used between services only.
 | 
					 | 
				
			||||||
      operationId: getSystemServices
 | 
					 | 
				
			||||||
      responses:
 | 
					 | 
				
			||||||
        200:
 | 
					 | 
				
			||||||
          $ref: '#/components/schemas/InternalSystemServices'
 | 
					 | 
				
			||||||
        403:
 | 
					 | 
				
			||||||
          $ref: '#/components/responses/Unauthorized'
 | 
					 | 
				
			||||||
        404:
 | 
					 | 
				
			||||||
          $ref: '#/components/responses/NotFound'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /validateToken:
 | 
					  /validateToken:
 | 
				
			||||||
    get:
 | 
					    get:
 | 
				
			||||||
@@ -1985,6 +1984,8 @@ paths:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /systemSecret/{secret}:
 | 
					  /systemSecret/{secret}:
 | 
				
			||||||
    get:
 | 
					    get:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - System Secrets
 | 
				
			||||||
      description: Retrieve a specific secret
 | 
					      description: Retrieve a specific secret
 | 
				
			||||||
      operationId: getSecret
 | 
					      operationId: getSecret
 | 
				
			||||||
      parameters:
 | 
					      parameters:
 | 
				
			||||||
@@ -2029,6 +2030,8 @@ paths:
 | 
				
			|||||||
          $ref: '#/components/responses/NotFound'
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    put:
 | 
					    put:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - System Secrets
 | 
				
			||||||
      description: Modify a specific secret
 | 
					      description: Modify a specific secret
 | 
				
			||||||
      operationId: modifySecret
 | 
					      operationId: modifySecret
 | 
				
			||||||
      parameters:
 | 
					      parameters:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,8 +34,8 @@ authentication.default.username = tip@ucentral.com
 | 
				
			|||||||
authentication.default.password = 13268b7daa751240369d125e79c873bd8dd3bef7981bdfd38ea03dbb1fbe7dcf
 | 
					authentication.default.password = 13268b7daa751240369d125e79c873bd8dd3bef7981bdfd38ea03dbb1fbe7dcf
 | 
				
			||||||
openwifi.system.data = $OWSEC_ROOT/data
 | 
					openwifi.system.data = $OWSEC_ROOT/data
 | 
				
			||||||
openwifi.system.uri.private = https://localhost:17001
 | 
					openwifi.system.uri.private = https://localhost:17001
 | 
				
			||||||
openwifi.system.uri.public = https://local.dpaas.arilia.com:16001
 | 
					openwifi.system.uri.public = https://main.server.com:16001
 | 
				
			||||||
openwifi.system.uri.ui = https://ucentral-ui.arilia.com
 | 
					openwifi.system.uri.ui = https://ucentral-ui.main.server.com
 | 
				
			||||||
openwifi.security.restapi.disable = false
 | 
					openwifi.security.restapi.disable = false
 | 
				
			||||||
openwifi.system.commandchannel = /tmp/app.ucentralsec
 | 
					openwifi.system.commandchannel = /tmp/app.ucentralsec
 | 
				
			||||||
openwifi.service.key = $OWSEC_ROOT/certs/restapi-key.pem
 | 
					openwifi.service.key = $OWSEC_ROOT/certs/restapi-key.pem
 | 
				
			||||||
@@ -64,9 +64,19 @@ mailer.loginmethod = login
 | 
				
			|||||||
mailer.port = 587
 | 
					mailer.port = 587
 | 
				
			||||||
mailer.templates = $OWSEC_ROOT/templates
 | 
					mailer.templates = $OWSEC_ROOT/templates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					helper.user.email = openwifi@telecominfraproject.com
 | 
				
			||||||
 | 
					helper.sub.email = openwifi@telecominfraproject.com
 | 
				
			||||||
 | 
					helper.user.global.email = openwifi@telecominfraproject.com
 | 
				
			||||||
 | 
					helper.sub.global.email = openwifi@telecominfraproject.com
 | 
				
			||||||
 | 
					helper.user.site = https://openwifi.telecominfraproject.com
 | 
				
			||||||
 | 
					helper.sub.site = https://openwifi.telecominfraproject.com
 | 
				
			||||||
 | 
					helper.user.login = https://openwifi.telecominfraproject.com
 | 
				
			||||||
 | 
					helper.sub.login = https://openwifi.telecominfraproject.com
 | 
				
			||||||
 | 
					helper.user.signature = Telecom Infra Project
 | 
				
			||||||
 | 
					helper.sub.signature = Telecom Infra Project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#############################
 | 
					#############################
 | 
				
			||||||
# Generic information for all micro services
 | 
					# Generic information for all micro-services
 | 
				
			||||||
#############################
 | 
					#############################
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# NLB Support
 | 
					# NLB Support
 | 
				
			||||||
@@ -80,7 +90,7 @@ alb.port = 16101
 | 
				
			|||||||
openwifi.kafka.group.id = security
 | 
					openwifi.kafka.group.id = security
 | 
				
			||||||
openwifi.kafka.client.id = security1
 | 
					openwifi.kafka.client.id = security1
 | 
				
			||||||
openwifi.kafka.enable = true
 | 
					openwifi.kafka.enable = true
 | 
				
			||||||
openwifi.kafka.brokerlist = a1.arilia.com:9092
 | 
					openwifi.kafka.brokerlist = kafka:9092
 | 
				
			||||||
openwifi.kafka.auto.commit = false
 | 
					openwifi.kafka.auto.commit = false
 | 
				
			||||||
openwifi.kafka.queue.buffering.max.ms = 50
 | 
					openwifi.kafka.queue.buffering.max.ms = 50
 | 
				
			||||||
openwifi.kafka.ssl.ca.location =
 | 
					openwifi.kafka.ssl.ca.location =
 | 
				
			||||||
@@ -110,18 +120,18 @@ storage.type.sqlite.maxsessions = 128
 | 
				
			|||||||
storage.type.postgresql.maxsessions = 64
 | 
					storage.type.postgresql.maxsessions = 64
 | 
				
			||||||
storage.type.postgresql.idletime = 60
 | 
					storage.type.postgresql.idletime = 60
 | 
				
			||||||
storage.type.postgresql.host = localhost
 | 
					storage.type.postgresql.host = localhost
 | 
				
			||||||
storage.type.postgresql.username = stephb
 | 
					storage.type.postgresql.username = owsec
 | 
				
			||||||
storage.type.postgresql.password = snoopy99
 | 
					storage.type.postgresql.password = owsec
 | 
				
			||||||
storage.type.postgresql.database = ucentral
 | 
					storage.type.postgresql.database = owsec
 | 
				
			||||||
storage.type.postgresql.port = 5432
 | 
					storage.type.postgresql.port = 5432
 | 
				
			||||||
storage.type.postgresql.connectiontimeout = 60
 | 
					storage.type.postgresql.connectiontimeout = 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
storage.type.mysql.maxsessions = 64
 | 
					storage.type.mysql.maxsessions = 64
 | 
				
			||||||
storage.type.mysql.idletime = 60
 | 
					storage.type.mysql.idletime = 60
 | 
				
			||||||
storage.type.mysql.host = localhost
 | 
					storage.type.mysql.host = localhost
 | 
				
			||||||
storage.type.mysql.username = stephb
 | 
					storage.type.mysql.username = owsec
 | 
				
			||||||
storage.type.mysql.password = snoopy99
 | 
					storage.type.mysql.password = owsec
 | 
				
			||||||
storage.type.mysql.database = ucentral
 | 
					storage.type.mysql.database = owsec
 | 
				
			||||||
storage.type.mysql.port = 3306
 | 
					storage.type.mysql.port = 3306
 | 
				
			||||||
storage.type.mysql.connectiontimeout = 60
 | 
					storage.type.mysql.connectiontimeout = 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,6 +64,16 @@ mailer.loginmethod = login
 | 
				
			|||||||
mailer.port = ${MAILER_PORT}
 | 
					mailer.port = ${MAILER_PORT}
 | 
				
			||||||
mailer.templates = ${MAILER_TEMPLATES}
 | 
					mailer.templates = ${MAILER_TEMPLATES}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					helper.user.email = ${USER_HELPER_EMAIL}
 | 
				
			||||||
 | 
					helper.sub.email = ${SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					helper.user.global.email = ${GLOBAL_USER_HELPER_EMAIL}
 | 
				
			||||||
 | 
					helper.sub.global.email = ${GLOBAL_SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					helper.user.site = ${USER_HELPER_SITE}
 | 
				
			||||||
 | 
					helper.sub.site = ${SUB_HELPER_SITE}
 | 
				
			||||||
 | 
					helper.user.login = ${USER_SYSTEM_LOGIN}
 | 
				
			||||||
 | 
					helper.sub.login = ${SUB_SYSTEM_LOGIN}
 | 
				
			||||||
 | 
					helper.user.signature = ${USER_SIGNATURE}
 | 
				
			||||||
 | 
					helper.sub.signature = ${SUB_SIGNATURE}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#############################
 | 
					#############################
 | 
				
			||||||
# Generic information for all micro services
 | 
					# Generic information for all micro services
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -345,7 +345,7 @@ namespace OpenWifi {
 | 
				
			|||||||
				std::stringstream ResultText;
 | 
									std::stringstream ResultText;
 | 
				
			||||||
				Poco::JSON::Stringifier::stringify(Obj, ResultText);
 | 
									Poco::JSON::Stringifier::stringify(Obj, ResultText);
 | 
				
			||||||
				KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,
 | 
									KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,
 | 
				
			||||||
											MicroServicePrivateEndPoint(), ResultText.str(), false);
 | 
																MicroServicePrivateEndPoint(), std::make_shared<std::string>(ResultText.str()), false);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
			Logger().log(E);
 | 
								Logger().log(E);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,7 @@
 | 
				
			|||||||
#ifdef TIP_GATEWAY_SERVICE
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
#include "AP_WS_Server.h"
 | 
					#include "AP_WS_Server.h"
 | 
				
			||||||
#include "CapabilitiesCache.h"
 | 
					#include "CapabilitiesCache.h"
 | 
				
			||||||
 | 
					#include "RADIUSSessionTracker.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTAPI_GWobjects.h"
 | 
					#include "RESTAPI_GWobjects.h"
 | 
				
			||||||
@@ -29,6 +30,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "serialNumber", SerialNumber);
 | 
							field_to_json(Obj, "serialNumber", SerialNumber);
 | 
				
			||||||
#ifdef TIP_GATEWAY_SERVICE
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
		field_to_json(Obj, "deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
 | 
							field_to_json(Obj, "deviceType", CapabilitiesCache::instance()->GetPlatform(Compatible));
 | 
				
			||||||
 | 
							field_to_json(Obj, "hasRADIUSSessions", RADIUSSessionTracker()->HasSessions(SerialNumber));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		field_to_json(Obj, "macAddress", MACAddress);
 | 
							field_to_json(Obj, "macAddress", MACAddress);
 | 
				
			||||||
		field_to_json(Obj, "manufacturer", Manufacturer);
 | 
							field_to_json(Obj, "manufacturer", Manufacturer);
 | 
				
			||||||
@@ -54,6 +56,9 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "pendingConfiguration", pendingConfiguration);
 | 
							field_to_json(Obj, "pendingConfiguration", pendingConfiguration);
 | 
				
			||||||
		field_to_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
 | 
							field_to_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
 | 
				
			||||||
		field_to_json(Obj, "restrictionDetails", restrictionDetails);
 | 
							field_to_json(Obj, "restrictionDetails", restrictionDetails);
 | 
				
			||||||
 | 
							field_to_json(Obj, "pendingUUID", pendingUUID);
 | 
				
			||||||
 | 
							field_to_json(Obj, "simulated", simulated);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastRecordedContact", lastRecordedContact);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
 | 
						void Device::to_json_with_status(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
@@ -63,7 +68,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		ConnectionState ConState;
 | 
							ConnectionState ConState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
 | 
							if (AP_WS_Server()->GetState(SerialNumber, ConState)) {
 | 
				
			||||||
			ConState.to_json(Obj);
 | 
								ConState.to_json(SerialNumber,Obj);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			field_to_json(Obj, "ipAddress", "");
 | 
								field_to_json(Obj, "ipAddress", "");
 | 
				
			||||||
			field_to_json(Obj, "txBytes", (uint64_t)0);
 | 
								field_to_json(Obj, "txBytes", (uint64_t)0);
 | 
				
			||||||
@@ -75,6 +80,13 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_to_json(Obj, "associations_2G", (uint64_t)0);
 | 
								field_to_json(Obj, "associations_2G", (uint64_t)0);
 | 
				
			||||||
			field_to_json(Obj, "associations_5G", (uint64_t)0);
 | 
								field_to_json(Obj, "associations_5G", (uint64_t)0);
 | 
				
			||||||
			field_to_json(Obj, "associations_6G", (uint64_t)0);
 | 
								field_to_json(Obj, "associations_6G", (uint64_t)0);
 | 
				
			||||||
 | 
								field_to_json(Obj, "hasRADIUSSessions", false);
 | 
				
			||||||
 | 
								field_to_json(Obj, "hasGPS", ConState.hasGPS);
 | 
				
			||||||
 | 
								field_to_json(Obj, "sanity", ConState.sanity);
 | 
				
			||||||
 | 
								field_to_json(Obj, "memoryUsed", ConState.memoryUsed);
 | 
				
			||||||
 | 
								field_to_json(Obj, "sanity", ConState.sanity);
 | 
				
			||||||
 | 
								field_to_json(Obj, "load", ConState.load);
 | 
				
			||||||
 | 
								field_to_json(Obj, "temperature", ConState.temperature);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -84,20 +96,32 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
			field_from_json(Obj, "serialNumber", SerialNumber);
 | 
								field_from_json(Obj, "serialNumber", SerialNumber);
 | 
				
			||||||
			field_from_json(Obj, "deviceType", DeviceType);
 | 
								field_from_json(Obj, "deviceType", DeviceType);
 | 
				
			||||||
			field_from_json(Obj, "macAddress", MACAddress);
 | 
								field_from_json(Obj, "macAddress", MACAddress);
 | 
				
			||||||
 | 
								field_from_json(Obj, "manufacturer", Manufacturer);
 | 
				
			||||||
 | 
								field_from_json(Obj, "UUID", UUID);
 | 
				
			||||||
			field_from_json(Obj, "configuration", Configuration);
 | 
								field_from_json(Obj, "configuration", Configuration);
 | 
				
			||||||
			field_from_json(Obj, "notes", Notes);
 | 
								field_from_json(Obj, "notes", Notes);
 | 
				
			||||||
			field_from_json(Obj, "manufacturer", Manufacturer);
 | 
								field_from_json(Obj, "createdTimestamp", CreationTimestamp);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastConfigurationChange", LastConfigurationChange);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastConfigurationDownload", LastConfigurationDownload);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastFWUpdate", LastFWUpdate);
 | 
				
			||||||
			field_from_json(Obj, "owner", Owner);
 | 
								field_from_json(Obj, "owner", Owner);
 | 
				
			||||||
			field_from_json(Obj, "location", Location);
 | 
								field_from_json(Obj, "location", Location);
 | 
				
			||||||
			field_from_json(Obj, "venue", Venue);
 | 
								field_from_json(Obj, "venue", Venue);
 | 
				
			||||||
 | 
								field_from_json(Obj, "firmware", Firmware);
 | 
				
			||||||
			field_from_json(Obj, "compatible", Compatible);
 | 
								field_from_json(Obj, "compatible", Compatible);
 | 
				
			||||||
 | 
								field_from_json(Obj, "fwUpdatePolicy", FWUpdatePolicy);
 | 
				
			||||||
 | 
								field_from_json(Obj, "devicePassword", DevicePassword);
 | 
				
			||||||
			field_from_json(Obj, "subscriber", subscriber);
 | 
								field_from_json(Obj, "subscriber", subscriber);
 | 
				
			||||||
			field_from_json(Obj, "entity", entity);
 | 
								field_from_json(Obj, "entity", entity);
 | 
				
			||||||
 | 
								field_from_json(Obj, "modified", modified);
 | 
				
			||||||
			field_from_json(Obj, "locale", locale);
 | 
								field_from_json(Obj, "locale", locale);
 | 
				
			||||||
			field_from_json(Obj, "restrictedDevice", restrictedDevice);
 | 
								field_from_json(Obj, "restrictedDevice", restrictedDevice);
 | 
				
			||||||
			field_from_json(Obj, "pendingConfiguration", pendingConfiguration);
 | 
								field_from_json(Obj, "pendingConfiguration", pendingConfiguration);
 | 
				
			||||||
			field_from_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
 | 
								field_from_json(Obj, "pendingConfigurationCmd", pendingConfigurationCmd);
 | 
				
			||||||
			field_from_json(Obj, "restrictionDetails", restrictionDetails);
 | 
								field_from_json(Obj, "restrictionDetails", restrictionDetails);
 | 
				
			||||||
 | 
								field_from_json(Obj, "pendingUUID", pendingUUID);
 | 
				
			||||||
 | 
								field_from_json(Obj, "simulated", simulated);
 | 
				
			||||||
 | 
								field_from_json(Obj, "lastRecordedContact", lastRecordedContact);
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		} catch (const Poco::Exception &E) {
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -165,6 +189,8 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "waitingForFile", WaitingForFile);
 | 
							field_to_json(Obj, "waitingForFile", WaitingForFile);
 | 
				
			||||||
		field_to_json(Obj, "attachFile", AttachDate);
 | 
							field_to_json(Obj, "attachFile", AttachDate);
 | 
				
			||||||
		field_to_json(Obj, "executionTime", executionTime);
 | 
							field_to_json(Obj, "executionTime", executionTime);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastTry", lastTry);
 | 
				
			||||||
 | 
							field_to_json(Obj, "deferred", deferred);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
						bool DefaultConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
@@ -198,7 +224,7 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void ConnectionState::to_json(Poco::JSON::Object &Obj) const {
 | 
						void ConnectionState::to_json([[maybe_unused]] const std::string &SerialNumber, Poco::JSON::Object &Obj)  {
 | 
				
			||||||
		field_to_json(Obj, "ipAddress", Address);
 | 
							field_to_json(Obj, "ipAddress", Address);
 | 
				
			||||||
		field_to_json(Obj, "txBytes", TX);
 | 
							field_to_json(Obj, "txBytes", TX);
 | 
				
			||||||
		field_to_json(Obj, "rxBytes", RX);
 | 
							field_to_json(Obj, "rxBytes", RX);
 | 
				
			||||||
@@ -220,6 +246,20 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
 | 
							field_to_json(Obj, "connectionCompletionTime", connectionCompletionTime);
 | 
				
			||||||
		field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
 | 
							field_to_json(Obj, "totalConnectionTime", Utils::Now() - started);
 | 
				
			||||||
		field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
 | 
							field_to_json(Obj, "certificateExpiryDate", certificateExpiryDate);
 | 
				
			||||||
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
 | 
							hasRADIUSSessions = RADIUSSessionTracker()->HasSessions(SerialNumber);
 | 
				
			||||||
 | 
							AP_WS_Server()->ExtendedAttributes(SerialNumber, hasGPS, sanity,
 | 
				
			||||||
 | 
															   memoryUsed,
 | 
				
			||||||
 | 
															   load,
 | 
				
			||||||
 | 
															   temperature);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							field_to_json(Obj, "hasRADIUSSessions", hasRADIUSSessions );
 | 
				
			||||||
 | 
							field_to_json(Obj, "hasGPS", hasGPS);
 | 
				
			||||||
 | 
							field_to_json(Obj, "sanity", sanity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "memoryUsed", memoryUsed);
 | 
				
			||||||
 | 
							field_to_json(Obj, "sanity", sanity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "load", load);
 | 
				
			||||||
 | 
							field_to_json(Obj, "temperature", temperature);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (VerifiedCertificate) {
 | 
							switch (VerifiedCertificate) {
 | 
				
			||||||
		case NO_CERTIFICATE:
 | 
							case NO_CERTIFICATE:
 | 
				
			||||||
@@ -234,6 +274,9 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		case VERIFIED:
 | 
							case VERIFIED:
 | 
				
			||||||
			field_to_json(Obj, "verifiedCertificate", "VERIFIED");
 | 
								field_to_json(Obj, "verifiedCertificate", "VERIFIED");
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case SIMULATED:
 | 
				
			||||||
 | 
								field_to_json(Obj, "verifiedCertificate", "SIMULATED");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
 | 
								field_to_json(Obj, "verifiedCertificate", "NO_CERTIFICATE");
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
@@ -490,6 +533,29 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RangeOptions::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "NO_IR", NO_IR);
 | 
				
			||||||
 | 
							field_to_json(Obj, "AUTO_BW", AUTO_BW);
 | 
				
			||||||
 | 
							field_to_json(Obj, "DFS", DFS);
 | 
				
			||||||
 | 
							field_to_json(Obj, "NO_OUTDOOR", NO_OUTDOOR);
 | 
				
			||||||
 | 
							field_to_json(Obj, "wmmrule_ETSI", wmmrule_ETSI);
 | 
				
			||||||
 | 
							field_to_json(Obj, "NO_OFDM", NO_OFDM);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void FrequencyRange::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "from", from);
 | 
				
			||||||
 | 
							field_to_json(Obj, "to", to);
 | 
				
			||||||
 | 
							field_to_json(Obj, "channelWidth", channelWidth);
 | 
				
			||||||
 | 
							field_to_json(Obj, "powerDb", powerDb);
 | 
				
			||||||
 | 
							field_to_json(Obj, "options", options);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RegulatoryCountryInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "country", country);
 | 
				
			||||||
 | 
							field_to_json(Obj, "domain", domain);
 | 
				
			||||||
 | 
							field_to_json(Obj, "ranges", ranges);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
						void DeviceRestrictionsKeyInfo::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
		field_to_json(Obj, "vendor", vendor);
 | 
							field_to_json(Obj, "vendor", vendor);
 | 
				
			||||||
		field_to_json(Obj, "algo", algo);
 | 
							field_to_json(Obj, "algo", algo);
 | 
				
			||||||
@@ -544,4 +610,42 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
				(T.commands != commands) || (T.developer != developer) || (T.ssh != ssh) ||
 | 
									(T.commands != commands) || (T.developer != developer) || (T.ssh != ssh) ||
 | 
				
			||||||
				(T.key_info != key_info) || (T.country != country));
 | 
									(T.key_info != key_info) || (T.country != country));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RADIUSSession::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "started", started);
 | 
				
			||||||
 | 
							field_to_json(Obj, "lastTransaction", lastTransaction);
 | 
				
			||||||
 | 
							field_to_json(Obj, "destination", destination);
 | 
				
			||||||
 | 
							field_to_json(Obj, "serialNumber", serialNumber);
 | 
				
			||||||
 | 
							field_to_json(Obj, "userName", userName);
 | 
				
			||||||
 | 
							field_to_json(Obj, "accountingSessionId", accountingSessionId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "inputPackets", inputPackets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "outputPackets", outputPackets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "inputOctets", inputOctets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "outputOctets", outputOctets);
 | 
				
			||||||
 | 
							field_to_json(Obj, "inputGigaWords", inputGigaWords);
 | 
				
			||||||
 | 
							field_to_json(Obj, "outputGigaWords", outputGigaWords);
 | 
				
			||||||
 | 
							field_to_json(Obj, "sessionTime", sessionTime);
 | 
				
			||||||
 | 
							field_to_json(Obj, "callingStationId", callingStationId);
 | 
				
			||||||
 | 
							field_to_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
 | 
				
			||||||
 | 
							field_to_json(Obj, "interface", interface);
 | 
				
			||||||
 | 
							field_to_json(Obj, "secret", secret);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void RADIUSSessionList::to_json(Poco::JSON::Object &Obj) const {
 | 
				
			||||||
 | 
							field_to_json(Obj, "sessions", sessions);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool RadiusCoADMParameters::from_json(const Poco::JSON::Object::Ptr &Obj) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								field_from_json(Obj, "accountingSessionId", accountingSessionId);
 | 
				
			||||||
 | 
								field_from_json(Obj, "accountingMultiSessionId", accountingMultiSessionId);
 | 
				
			||||||
 | 
								field_from_json(Obj, "callingStationId", callingStationId);
 | 
				
			||||||
 | 
								field_from_json(Obj, "chargeableUserIdentity", chargeableUserIdentity);
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace OpenWifi::GWObjects
 | 
					} // namespace OpenWifi::GWObjects
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,9 +11,13 @@
 | 
				
			|||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
#include "RESTAPI_SecurityObjects.h"
 | 
					#include "RESTAPI_SecurityObjects.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
 | 
					#include <RADIUS_helpers.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::GWObjects {
 | 
					namespace OpenWifi::GWObjects {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enum CertificateValidation { NO_CERTIFICATE, VALID_CERTIFICATE, MISMATCH_SERIAL, VERIFIED };
 | 
						enum CertificateValidation { NO_CERTIFICATE, VALID_CERTIFICATE, MISMATCH_SERIAL, VERIFIED, SIMULATED };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct ConnectionState {
 | 
						struct ConnectionState {
 | 
				
			||||||
		uint64_t MessageCount = 0;
 | 
							uint64_t MessageCount = 0;
 | 
				
			||||||
@@ -38,8 +42,14 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		uint64_t sessionId = 0;
 | 
							uint64_t sessionId = 0;
 | 
				
			||||||
		double connectionCompletionTime = 0.0;
 | 
							double connectionCompletionTime = 0.0;
 | 
				
			||||||
		std::uint64_t certificateExpiryDate = 0;
 | 
							std::uint64_t certificateExpiryDate = 0;
 | 
				
			||||||
 | 
							bool hasRADIUSSessions = false;
 | 
				
			||||||
 | 
							bool hasGPS = false;
 | 
				
			||||||
 | 
							std::uint64_t sanity=0;
 | 
				
			||||||
 | 
							std::double_t memoryUsed=0.0;
 | 
				
			||||||
 | 
							std::double_t load=0.0;
 | 
				
			||||||
 | 
							std::double_t temperature=0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(const std::string &SerialNumber, Poco::JSON::Object &Obj) ;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct DeviceRestrictionsKeyInfo {
 | 
						struct DeviceRestrictionsKeyInfo {
 | 
				
			||||||
@@ -96,6 +106,9 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		std::string pendingConfiguration;
 | 
							std::string pendingConfiguration;
 | 
				
			||||||
		std::string pendingConfigurationCmd;
 | 
							std::string pendingConfigurationCmd;
 | 
				
			||||||
		DeviceRestrictions restrictionDetails;
 | 
							DeviceRestrictions restrictionDetails;
 | 
				
			||||||
 | 
							std::uint64_t pendingUUID = 0;
 | 
				
			||||||
 | 
							bool simulated=false;
 | 
				
			||||||
 | 
							std::uint64_t lastRecordedContact=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void to_json(Poco::JSON::Object &Obj) const;
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
		void to_json_with_status(Poco::JSON::Object &Obj) const;
 | 
							void to_json_with_status(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
@@ -188,7 +201,11 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		uint64_t AttachSize = 0;
 | 
							uint64_t AttachSize = 0;
 | 
				
			||||||
		std::string AttachType;
 | 
							std::string AttachType;
 | 
				
			||||||
		double executionTime = 0.0;
 | 
							double executionTime = 0.0;
 | 
				
			||||||
 | 
							std::uint64_t lastTry = 0;
 | 
				
			||||||
 | 
							bool deferred = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		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);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct BlackListedDevice {
 | 
						struct BlackListedDevice {
 | 
				
			||||||
@@ -334,4 +351,76 @@ namespace OpenWifi::GWObjects {
 | 
				
			|||||||
		bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RangeOptions {
 | 
				
			||||||
 | 
							bool NO_IR=false;
 | 
				
			||||||
 | 
							bool AUTO_BW=false;
 | 
				
			||||||
 | 
							bool DFS=false;
 | 
				
			||||||
 | 
							bool NO_OUTDOOR=false;
 | 
				
			||||||
 | 
							bool wmmrule_ETSI=false;
 | 
				
			||||||
 | 
							bool NO_OFDM=false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct FrequencyRange {
 | 
				
			||||||
 | 
							float from = 0.0;
 | 
				
			||||||
 | 
							float to = 0.0;
 | 
				
			||||||
 | 
							int channelWidth = 0;
 | 
				
			||||||
 | 
							int powerDb = 0;
 | 
				
			||||||
 | 
							RangeOptions    options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RegulatoryCountryInfo {
 | 
				
			||||||
 | 
							std::string country;
 | 
				
			||||||
 | 
							std::string domain;
 | 
				
			||||||
 | 
							std::vector<FrequencyRange>   ranges;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						using RegulatoryInfoCountryMap = std::map<std::string,RegulatoryCountryInfo>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RADIUSSession {
 | 
				
			||||||
 | 
							std::uint64_t 			started=0,
 | 
				
			||||||
 | 
													lastTransaction=0;
 | 
				
			||||||
 | 
							std::string 			serialNumber,
 | 
				
			||||||
 | 
													destination,
 | 
				
			||||||
 | 
													userName,
 | 
				
			||||||
 | 
										 			accountingSessionId,
 | 
				
			||||||
 | 
													accountingMultiSessionId,
 | 
				
			||||||
 | 
										 			callingStationId,
 | 
				
			||||||
 | 
													chargeableUserIdentity,
 | 
				
			||||||
 | 
													secret,
 | 
				
			||||||
 | 
													interface;
 | 
				
			||||||
 | 
							std::uint64_t 			inputPackets = 0,
 | 
				
			||||||
 | 
													outputPackets = 0,
 | 
				
			||||||
 | 
													inputOctets = 0,
 | 
				
			||||||
 | 
													outputOctets = 0,
 | 
				
			||||||
 | 
													inputGigaWords = 0,
 | 
				
			||||||
 | 
													outputGigaWords = 0;
 | 
				
			||||||
 | 
							std::uint32_t 			sessionTime = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef TIP_GATEWAY_SERVICE
 | 
				
			||||||
 | 
							RADIUS::RadiusPacket	accountingPacket;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RADIUSSessionList {
 | 
				
			||||||
 | 
							std::vector<RADIUSSession>	sessions;
 | 
				
			||||||
 | 
							void to_json(Poco::JSON::Object &Obj) const;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct RadiusCoADMParameters {
 | 
				
			||||||
 | 
							std::string 			accountingSessionId,
 | 
				
			||||||
 | 
													accountingMultiSessionId,
 | 
				
			||||||
 | 
													callingStationId,
 | 
				
			||||||
 | 
													chargeableUserIdentity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool from_json(const Poco::JSON::Object::Ptr &Obj);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace OpenWifi::GWObjects
 | 
					} // namespace OpenWifi::GWObjects
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,18 +14,18 @@ namespace OpenWifi {
 | 
				
			|||||||
	void EventBusManager::run() {
 | 
						void EventBusManager::run() {
 | 
				
			||||||
		Running_ = true;
 | 
							Running_ = true;
 | 
				
			||||||
		Utils::SetThreadName("fmwk:EventMgr");
 | 
							Utils::SetThreadName("fmwk:EventMgr");
 | 
				
			||||||
		auto Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN);
 | 
							auto Msg = std::make_shared<std::string>(MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN));
 | 
				
			||||||
		KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
 | 
							KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
 | 
				
			||||||
									false);
 | 
														false);
 | 
				
			||||||
		while (Running_) {
 | 
							while (Running_) {
 | 
				
			||||||
			Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer());
 | 
								Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer());
 | 
				
			||||||
			if (!Running_)
 | 
								if (!Running_)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE);
 | 
								Msg = std::make_shared<std::string>(MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE));
 | 
				
			||||||
			KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(),
 | 
								KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(),
 | 
				
			||||||
										Msg, false);
 | 
															Msg, false);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		Msg = MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE);
 | 
							Msg = std::make_shared<std::string>(MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_LEAVE));
 | 
				
			||||||
		KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
 | 
							KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg,
 | 
				
			||||||
									false);
 | 
														false);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -180,7 +180,7 @@ namespace OpenWifi {
 | 
				
			|||||||
							Consumer.async_commit(Msg);
 | 
												Consumer.async_commit(Msg);
 | 
				
			||||||
						continue;
 | 
											continue;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					KafkaManager()->Dispatch(Msg.get_topic(), Msg.get_key(), Msg.get_payload());
 | 
										KafkaManager()->Dispatch(Msg.get_topic().c_str(), Msg.get_key(), std::make_shared<std::string>(Msg.get_payload()));
 | 
				
			||||||
					if (!AutoCommit)
 | 
										if (!AutoCommit)
 | 
				
			||||||
						Consumer.async_commit(Msg);
 | 
											Consumer.async_commit(Msg);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -212,8 +212,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void KafkaProducer::Produce(const std::string &Topic, const std::string &Key,
 | 
						void KafkaProducer::Produce(const char *Topic, const std::string &Key,
 | 
				
			||||||
								const std::string &Payload) {
 | 
													const std::shared_ptr<std::string> Payload) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
 | 
							Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -275,8 +275,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void KafkaDispatcher::Dispatch(const std::string &Topic, const std::string &Key,
 | 
						void KafkaDispatcher::Dispatch(const char *Topic, const std::string &Key,
 | 
				
			||||||
								   const std::string &Payload) {
 | 
													   const std::shared_ptr<std::string> Payload) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		auto It = Notifiers_.find(Topic);
 | 
							auto It = Notifiers_.find(Topic);
 | 
				
			||||||
		if (It != Notifiers_.end()) {
 | 
							if (It != Notifiers_.end()) {
 | 
				
			||||||
@@ -332,20 +332,21 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void KafkaManager::PostMessage(const std::string &topic, const std::string &key,
 | 
						void KafkaManager::PostMessage(const char *topic, const std::string &key,
 | 
				
			||||||
								   const std::string &PayLoad, bool WrapMessage) {
 | 
													   const std::shared_ptr<std::string> PayLoad, bool WrapMessage) {
 | 
				
			||||||
		if (KafkaEnabled_) {
 | 
							if (KafkaEnabled_) {
 | 
				
			||||||
			ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(PayLoad) : PayLoad);
 | 
								ProducerThr_.Produce(topic, key, WrapMessage ? WrapSystemId(PayLoad) : PayLoad);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void KafkaManager::Dispatch(const std::string &Topic, const std::string &Key,
 | 
						void KafkaManager::Dispatch(const char *Topic, const std::string &Key,
 | 
				
			||||||
								const std::string &Payload) {
 | 
													const std::shared_ptr<std::string> Payload) {
 | 
				
			||||||
		Dispatcher_.Dispatch(Topic, Key, Payload);
 | 
							Dispatcher_.Dispatch(Topic, Key, Payload);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] std::string KafkaManager::WrapSystemId(const std::string &PayLoad) {
 | 
						[[nodiscard]] const std::shared_ptr<std::string> KafkaManager::WrapSystemId(const std::shared_ptr<std::string> PayLoad) {
 | 
				
			||||||
		return SystemInfoWrapper_ + PayLoad + "}";
 | 
							*PayLoad = SystemInfoWrapper_ + *PayLoad + "}";
 | 
				
			||||||
 | 
							return PayLoad;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint64_t KafkaManager::RegisterTopicWatcher(const std::string &Topic,
 | 
						uint64_t KafkaManager::RegisterTopicWatcher(const std::string &Topic,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,17 +18,17 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	class KafkaMessage : public Poco::Notification {
 | 
						class KafkaMessage : public Poco::Notification {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
		KafkaMessage(const std::string &Topic, const std::string &Key, const std::string &Payload)
 | 
							KafkaMessage(const char * Topic, const std::string &Key, const std::shared_ptr<std::string> Payload)
 | 
				
			||||||
			: Topic_(Topic), Key_(Key), Payload_(Payload) {}
 | 
								: Topic_(Topic), Key_(Key), Payload_(std::move(Payload)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		inline const std::string &Topic() { return Topic_; }
 | 
							inline const char * Topic() { return Topic_; }
 | 
				
			||||||
		inline const std::string &Key() { return Key_; }
 | 
							inline const std::string &Key() { return Key_; }
 | 
				
			||||||
		inline const std::string &Payload() { return Payload_; }
 | 
							inline const std::string &Payload() { return *Payload_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::string Topic_;
 | 
							const char *Topic_;
 | 
				
			||||||
		std::string Key_;
 | 
							std::string Key_;
 | 
				
			||||||
		std::string Payload_;
 | 
							std::shared_ptr<std::string> Payload_;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class KafkaProducer : public Poco::Runnable {
 | 
						class KafkaProducer : public Poco::Runnable {
 | 
				
			||||||
@@ -36,7 +36,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		void run() override;
 | 
							void run() override;
 | 
				
			||||||
		void Start();
 | 
							void Start();
 | 
				
			||||||
		void Stop();
 | 
							void Stop();
 | 
				
			||||||
		void Produce(const std::string &Topic, const std::string &Key, const std::string &Payload);
 | 
							void Produce(const char *Topic, const std::string &Key, const std::shared_ptr<std::string> Payload);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::recursive_mutex Mutex_;
 | 
							std::recursive_mutex Mutex_;
 | 
				
			||||||
@@ -63,7 +63,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		void Stop();
 | 
							void Stop();
 | 
				
			||||||
		auto RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
 | 
							auto RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
 | 
				
			||||||
		void UnregisterTopicWatcher(const std::string &Topic, int Id);
 | 
							void UnregisterTopicWatcher(const std::string &Topic, int Id);
 | 
				
			||||||
		void Dispatch(const std::string &Topic, const std::string &Key, const std::string &Payload);
 | 
							void Dispatch(const char *Topic, const std::string &Key, const std::shared_ptr<std::string> Payload);
 | 
				
			||||||
		void run() override;
 | 
							void run() override;
 | 
				
			||||||
		void Topics(std::vector<std::string> &T);
 | 
							void Topics(std::vector<std::string> &T);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -91,10 +91,10 @@ namespace OpenWifi {
 | 
				
			|||||||
		int Start() override;
 | 
							int Start() override;
 | 
				
			||||||
		void Stop() override;
 | 
							void Stop() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void PostMessage(const std::string &topic, const std::string &key,
 | 
							void PostMessage(const char *topic, const std::string &key,
 | 
				
			||||||
						 const std::string &PayLoad, bool WrapMessage = true);
 | 
											 const std::shared_ptr<std::string> PayLoad, bool WrapMessage = true);
 | 
				
			||||||
		void Dispatch(const std::string &Topic, const std::string &Key, const std::string &Payload);
 | 
							void Dispatch(const char *Topic, const std::string &Key, const std::shared_ptr<std::string> Payload);
 | 
				
			||||||
		[[nodiscard]] std::string WrapSystemId(const std::string &PayLoad);
 | 
							[[nodiscard]] const std::shared_ptr<std::string> WrapSystemId(const std::shared_ptr<std::string> PayLoad);
 | 
				
			||||||
		[[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; }
 | 
							[[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; }
 | 
				
			||||||
		uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
 | 
							uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F);
 | 
				
			||||||
		void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id);
 | 
							void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,32 +10,32 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
namespace OpenWifi::KafkaTopics {
 | 
					namespace OpenWifi::KafkaTopics {
 | 
				
			||||||
	static const std::string HEALTHCHECK{"healthcheck"};
 | 
						inline const char * HEALTHCHECK = "healthcheck";
 | 
				
			||||||
	static const std::string STATE{"state"};
 | 
						inline const char * STATE = "state";
 | 
				
			||||||
	static const std::string CONNECTION{"connection"};
 | 
						inline const char * CONNECTION = "connection";
 | 
				
			||||||
	static const std::string WIFISCAN{"wifiscan"};
 | 
						inline const char * WIFISCAN = "wifiscan";
 | 
				
			||||||
	static const std::string ALERTS{"alerts"};
 | 
						inline const char * ALERTS = "alerts";
 | 
				
			||||||
	static const std::string COMMAND{"command"};
 | 
						inline const char * COMMAND = "command";
 | 
				
			||||||
	static const std::string SERVICE_EVENTS{"service_events"};
 | 
						inline const char * SERVICE_EVENTS = "service_events";
 | 
				
			||||||
	static const std::string DEVICE_EVENT_QUEUE{"device_event_queue"};
 | 
						inline const char * DEVICE_EVENT_QUEUE = "device_event_queue";
 | 
				
			||||||
	static const std::string DEVICE_TELEMETRY{"device_telemetry"};
 | 
						inline const char * DEVICE_TELEMETRY = "device_telemetry";
 | 
				
			||||||
	static const std::string PROVISIONING_CHANGE{"provisioning_change"};
 | 
						inline const char * PROVISIONING_CHANGE = "provisioning_change";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	namespace ServiceEvents {
 | 
						namespace ServiceEvents {
 | 
				
			||||||
		static const std::string EVENT_JOIN{"join"};
 | 
							inline const char * EVENT_JOIN = "join";
 | 
				
			||||||
		static const std::string EVENT_LEAVE{"leave"};
 | 
							inline const char * EVENT_LEAVE = "leave";
 | 
				
			||||||
		static const std::string EVENT_KEEP_ALIVE{"keep-alive"};
 | 
							inline const char * EVENT_KEEP_ALIVE = "keep-alive";
 | 
				
			||||||
		static const std::string EVENT_REMOVE_TOKEN{"remove-token"};
 | 
							inline const char * EVENT_REMOVE_TOKEN = "remove-token";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		namespace Fields {
 | 
							namespace Fields {
 | 
				
			||||||
			static const std::string EVENT{"event"};
 | 
								inline const char * EVENT = "event";
 | 
				
			||||||
			static const std::string ID{"id"};
 | 
								inline const char * ID = "id";
 | 
				
			||||||
			static const std::string TYPE{"type"};
 | 
								inline const char * TYPE = "type";
 | 
				
			||||||
			static const std::string PUBLIC{"publicEndPoint"};
 | 
								inline const char * PUBLIC = "publicEndPoint";
 | 
				
			||||||
			static const std::string PRIVATE{"privateEndPoint"};
 | 
								inline const char * PRIVATE = "privateEndPoint";
 | 
				
			||||||
			static const std::string KEY{"key"};
 | 
								inline const char * KEY = "key";
 | 
				
			||||||
			static const std::string VRSN{"version"};
 | 
								inline const char * VRSN = "version";
 | 
				
			||||||
			static const std::string TOKEN{"token"};
 | 
								inline const char * TOKEN = "token";
 | 
				
			||||||
		} // namespace Fields
 | 
							} // namespace Fields
 | 
				
			||||||
	}	  // namespace ServiceEvents
 | 
						}	  // namespace ServiceEvents
 | 
				
			||||||
} // namespace OpenWifi::KafkaTopics
 | 
					} // namespace OpenWifi::KafkaTopics
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,11 +47,11 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void MicroServiceReload(const std::string &Type) { MicroService::instance().Reload(Type); }
 | 
						void MicroServiceReload(const std::string &Type) { MicroService::instance().Reload(Type); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const Types::StringVec MicroServiceGetLogLevelNames() {
 | 
						Types::StringVec MicroServiceGetLogLevelNames() {
 | 
				
			||||||
		return MicroService::instance().GetLogLevelNames();
 | 
							return MicroService::instance().GetLogLevelNames();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const Types::StringVec MicroServiceGetSubSystems() {
 | 
						Types::StringVec MicroServiceGetSubSystems() {
 | 
				
			||||||
		return MicroService::instance().GetSubSystems();
 | 
							return MicroService::instance().GetSubSystems();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -79,7 +79,7 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	std::string MicroServiceGetUIURI() { return MicroService::instance().GetUIURI(); }
 | 
						std::string MicroServiceGetUIURI() { return MicroService::instance().GetUIURI(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const SubSystemVec MicroServiceGetFullSubSystems() {
 | 
						SubSystemVec MicroServiceGetFullSubSystems() {
 | 
				
			||||||
		return MicroService::instance().GetFullSubSystems();
 | 
							return MicroService::instance().GetFullSubSystems();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87,7 +87,7 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	std::uint64_t MicroServiceDaemonBusTimer() { return MicroService::instance().DaemonBusTimer(); }
 | 
						std::uint64_t MicroServiceDaemonBusTimer() { return MicroService::instance().DaemonBusTimer(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string MicroServiceMakeSystemEventMessage(const std::string &Type) {
 | 
						std::string MicroServiceMakeSystemEventMessage(const char *Type) {
 | 
				
			||||||
		return MicroService::instance().MakeSystemEventMessage(Type);
 | 
							return MicroService::instance().MakeSystemEventMessage(Type);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,8 +31,8 @@ namespace OpenWifi {
 | 
				
			|||||||
	void MicroServiceLoadConfigurationFile();
 | 
						void MicroServiceLoadConfigurationFile();
 | 
				
			||||||
	void MicroServiceReload();
 | 
						void MicroServiceReload();
 | 
				
			||||||
	void MicroServiceReload(const std::string &Type);
 | 
						void MicroServiceReload(const std::string &Type);
 | 
				
			||||||
	const Types::StringVec MicroServiceGetLogLevelNames();
 | 
						Types::StringVec MicroServiceGetLogLevelNames();
 | 
				
			||||||
	const Types::StringVec MicroServiceGetSubSystems();
 | 
						Types::StringVec MicroServiceGetSubSystems();
 | 
				
			||||||
	Types::StringPairVec MicroServiceGetLogLevels();
 | 
						Types::StringPairVec MicroServiceGetLogLevels();
 | 
				
			||||||
	bool MicroServiceSetSubsystemLogLevel(const std::string &SubSystem, const std::string &Level);
 | 
						bool MicroServiceSetSubsystemLogLevel(const std::string &SubSystem, const std::string &Level);
 | 
				
			||||||
	void MicroServiceGetExtraConfiguration(Poco::JSON::Object &Answer);
 | 
						void MicroServiceGetExtraConfiguration(Poco::JSON::Object &Answer);
 | 
				
			||||||
@@ -40,10 +40,10 @@ namespace OpenWifi {
 | 
				
			|||||||
	std::uint64_t MicroServiceUptimeTotalSeconds();
 | 
						std::uint64_t MicroServiceUptimeTotalSeconds();
 | 
				
			||||||
	std::uint64_t MicroServiceStartTimeEpochTime();
 | 
						std::uint64_t MicroServiceStartTimeEpochTime();
 | 
				
			||||||
	std::string MicroServiceGetUIURI();
 | 
						std::string MicroServiceGetUIURI();
 | 
				
			||||||
	const SubSystemVec MicroServiceGetFullSubSystems();
 | 
						SubSystemVec MicroServiceGetFullSubSystems();
 | 
				
			||||||
	std::string MicroServiceCreateUUID();
 | 
						std::string MicroServiceCreateUUID();
 | 
				
			||||||
	std::uint64_t MicroServiceDaemonBusTimer();
 | 
						std::uint64_t MicroServiceDaemonBusTimer();
 | 
				
			||||||
	std::string MicroServiceMakeSystemEventMessage(const std::string &Type);
 | 
						std::string MicroServiceMakeSystemEventMessage(const char *Type);
 | 
				
			||||||
	Poco::ThreadPool &MicroServiceTimerPool();
 | 
						Poco::ThreadPool &MicroServiceTimerPool();
 | 
				
			||||||
	std::string MicroServiceConfigPath(const std::string &Key, const std::string &DefaultValue);
 | 
						std::string MicroServiceConfigPath(const std::string &Key, const std::string &DefaultValue);
 | 
				
			||||||
	std::string MicroServiceWWWAssetsDir();
 | 
						std::string MicroServiceWWWAssetsDir();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,8 +14,15 @@
 | 
				
			|||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
#include "framework/utils.h"
 | 
					#include "framework/utils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <RESTObjects/RESTAPI_SecurityObjects.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::RESTAPI_utils {
 | 
					namespace OpenWifi::RESTAPI_utils {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inline bool IsRootOrAdmin(const SecurityObjects::UserInfo &UI) {
 | 
				
			||||||
 | 
							return 	UI.userRole==SecurityObjects::ROOT ||
 | 
				
			||||||
 | 
									UI.userRole==SecurityObjects::ADMIN;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline void EmbedDocument(const std::string &ObjName, Poco::JSON::Object &Obj,
 | 
						inline void EmbedDocument(const std::string &ObjName, Poco::JSON::Object &Obj,
 | 
				
			||||||
							  const std::string &ObjStr) {
 | 
												  const std::string &ObjStr) {
 | 
				
			||||||
		std::string D = ObjStr.empty() ? "{}" : ObjStr;
 | 
							std::string D = ObjStr.empty() ? "{}" : ObjStr;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										63
									
								
								src/framework/default_device_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/framework/default_device_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					// Created by stephane bourque on 2023-04-19.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
						inline  const std::vector<std::pair<std::string, std::string>> DefaultDeviceTypeList{
 | 
				
			||||||
 | 
							{"actiontec_web7200", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf186w", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf188n", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf194c4", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf196", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf196-ca", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf196-ca-ath12", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf196-us", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf610d", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf660a", "AP"},
 | 
				
			||||||
 | 
							{"cig_wf808", "AP"},
 | 
				
			||||||
 | 
							{"cybertan_eww622-a1", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap101", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap101-ath12", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap102", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap104", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap104-ath12", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_ecs4100-12ph", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_ecw5211", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_ecw5410", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_oap100", "AP"},
 | 
				
			||||||
 | 
							{"edgecore_spw2ac1200", "SWITCH"},
 | 
				
			||||||
 | 
							{"edgecore_spw2ac1200-lan-poe", "SWITCH"},
 | 
				
			||||||
 | 
							{"edgecore_ssw2ac2600", "SWITCH"},
 | 
				
			||||||
 | 
							{"hfcl_ion4", "AP"},
 | 
				
			||||||
 | 
							{"hfcl_ion4x", "AP"},
 | 
				
			||||||
 | 
							{"hfcl_ion4x_2", "AP"},
 | 
				
			||||||
 | 
							{"hfcl_ion4xe", "AP"},
 | 
				
			||||||
 | 
							{"hfcl_ion4xi", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-305ac", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-305ax", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-310ax-v1", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-325ac", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-510ac-v3", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-510axm-v1", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-510axp-v1", "AP"},
 | 
				
			||||||
 | 
							{"indio_um-550ac", "AP"},
 | 
				
			||||||
 | 
							{"linksys_e8450-ubi", "AP"},
 | 
				
			||||||
 | 
							{"linksys_ea6350-v4", "AP"},
 | 
				
			||||||
 | 
							{"linksys_ea8300", "AP"},
 | 
				
			||||||
 | 
							{"liteon_wpx8324", "AP"},
 | 
				
			||||||
 | 
							{"meshpp_s618_cp01", "AP"},
 | 
				
			||||||
 | 
							{"meshpp_s618_cp03", "AP"},
 | 
				
			||||||
 | 
							{"udaya_a5-id2", "AP"},
 | 
				
			||||||
 | 
							{"wallys_dr40x9", "AP"},
 | 
				
			||||||
 | 
							{"wallys_dr6018", "AP"},
 | 
				
			||||||
 | 
							{"wallys_dr6018_v4", "AP"},
 | 
				
			||||||
 | 
							{"x64_vm", "AP"},
 | 
				
			||||||
 | 
							{"yuncore_ax840", "AP"},
 | 
				
			||||||
 | 
							{"yuncore_fap640", "AP"},
 | 
				
			||||||
 | 
							{"yuncore_fap650", "AP"}};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -397,6 +397,18 @@ namespace OpenWifi::RESTAPI::Errors {
 | 
				
			|||||||
	static const struct msg FirmwareBDInProgress {
 | 
						static const struct msg FirmwareBDInProgress {
 | 
				
			||||||
		1170, "Firmware DB update already in progress."
 | 
							1170, "Firmware DB update already in progress."
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
						static const struct msg SimulatedDeviceNotSupported {
 | 
				
			||||||
 | 
							1171, "Command not supported on simulated device."
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static const struct msg SimulationDoesNotExist {
 | 
				
			||||||
 | 
					        7000, "Simulation Instance ID does not exist."
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static const struct msg SimulationIsAlreadyRunning {
 | 
				
			||||||
 | 
					        7001, "There is an instance of this simulation already running.."
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace OpenWifi::RESTAPI::Errors
 | 
					} // namespace OpenWifi::RESTAPI::Errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -554,6 +566,7 @@ namespace OpenWifi::uCentralProtocol {
 | 
				
			|||||||
	static const char *HEALTHCHECK = "healthcheck";
 | 
						static const char *HEALTHCHECK = "healthcheck";
 | 
				
			||||||
	static const char *LOG = "log";
 | 
						static const char *LOG = "log";
 | 
				
			||||||
	static const char *CRASHLOG = "crashlog";
 | 
						static const char *CRASHLOG = "crashlog";
 | 
				
			||||||
 | 
						static const char *REBOOTLOG = "rebootLog";
 | 
				
			||||||
	static const char *PING = "ping";
 | 
						static const char *PING = "ping";
 | 
				
			||||||
	static const char *CFGPENDING = "cfgpending";
 | 
						static const char *CFGPENDING = "cfgpending";
 | 
				
			||||||
	static const char *RECOVERY = "recovery";
 | 
						static const char *RECOVERY = "recovery";
 | 
				
			||||||
@@ -612,6 +625,8 @@ namespace OpenWifi::uCentralProtocol {
 | 
				
			|||||||
	static const char *DEVICEUPDATE = "deviceupdate";
 | 
						static const char *DEVICEUPDATE = "deviceupdate";
 | 
				
			||||||
	static const char *FWSIGNATURE = "FWsignature";
 | 
						static const char *FWSIGNATURE = "FWsignature";
 | 
				
			||||||
	static const char *SIGNATURE = "signature";
 | 
						static const char *SIGNATURE = "signature";
 | 
				
			||||||
 | 
						static const char *INFO = "info";
 | 
				
			||||||
 | 
						static const char *DATE = "date";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static const char *SERIALNUMBER = "serialNumber";
 | 
						static const char *SERIALNUMBER = "serialNumber";
 | 
				
			||||||
	static const char *COMPATIBLE = "compatible";
 | 
						static const char *COMPATIBLE = "compatible";
 | 
				
			||||||
@@ -642,6 +657,7 @@ namespace OpenWifi::uCentralProtocol::Events {
 | 
				
			|||||||
	static const char *HEALTHCHECK = "healthcheck";
 | 
						static const char *HEALTHCHECK = "healthcheck";
 | 
				
			||||||
	static const char *LOG = "log";
 | 
						static const char *LOG = "log";
 | 
				
			||||||
	static const char *CRASHLOG = "crashlog";
 | 
						static const char *CRASHLOG = "crashlog";
 | 
				
			||||||
 | 
						static const char *REBOOTLOG = "rebootLog";
 | 
				
			||||||
	static const char *PING = "ping";
 | 
						static const char *PING = "ping";
 | 
				
			||||||
	static const char *CFGPENDING = "cfgpending";
 | 
						static const char *CFGPENDING = "cfgpending";
 | 
				
			||||||
	static const char *RECOVERY = "recovery";
 | 
						static const char *RECOVERY = "recovery";
 | 
				
			||||||
@@ -665,7 +681,8 @@ namespace OpenWifi::uCentralProtocol::Events {
 | 
				
			|||||||
		ET_VENUEBROADCAST,
 | 
							ET_VENUEBROADCAST,
 | 
				
			||||||
		ET_EVENT,
 | 
							ET_EVENT,
 | 
				
			||||||
		ET_WIFISCAN,
 | 
							ET_WIFISCAN,
 | 
				
			||||||
		ET_ALARM
 | 
							ET_ALARM,
 | 
				
			||||||
 | 
							ET_REBOOTLOG
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline EVENT_MSG EventFromString(const std::string &Method) {
 | 
						inline EVENT_MSG EventFromString(const std::string &Method) {
 | 
				
			||||||
@@ -696,8 +713,10 @@ namespace OpenWifi::uCentralProtocol::Events {
 | 
				
			|||||||
		else if (strcmp(WIFISCAN, Method.c_str()) == 0)
 | 
							else if (strcmp(WIFISCAN, Method.c_str()) == 0)
 | 
				
			||||||
			return ET_WIFISCAN;
 | 
								return ET_WIFISCAN;
 | 
				
			||||||
		else if (strcmp(ALARM, Method.c_str()) == 0)
 | 
							else if (strcmp(ALARM, Method.c_str()) == 0)
 | 
				
			||||||
			return ET_WIFISCAN;
 | 
								return ET_ALARM;
 | 
				
			||||||
		return ET_ALARM;
 | 
							else if (strcmp(REBOOTLOG, Method.c_str()) == 0)
 | 
				
			||||||
 | 
								return ET_REBOOTLOG;
 | 
				
			||||||
 | 
							return ET_UNKNOWN;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
} // namespace OpenWifi::uCentralProtocol::Events
 | 
					} // namespace OpenWifi::uCentralProtocol::Events
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,10 @@ namespace OpenWifi::Utils {
 | 
				
			|||||||
				std::all_of(Serial.begin(), Serial.end(), [](auto i) { return std::isxdigit(i); }));
 | 
									std::all_of(Serial.begin(), Serial.end(), [](auto i) { return std::isxdigit(i); }));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[[nodiscard]] bool ValidSerialNumbers(const std::vector<std::string> &numbers) {
 | 
				
			||||||
 | 
							return std::all_of(numbers.begin(),numbers.end(),[](auto &number) {return ValidSerialNumber(number);});
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] bool ValidUUID(const std::string &UUID) {
 | 
						[[nodiscard]] bool ValidUUID(const std::string &UUID) {
 | 
				
			||||||
		if (UUID.size() > 36)
 | 
							if (UUID.size() > 36)
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,6 +68,7 @@ namespace OpenWifi::Utils {
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	[[nodiscard]] bool ValidSerialNumber(const std::string &Serial);
 | 
						[[nodiscard]] bool ValidSerialNumber(const std::string &Serial);
 | 
				
			||||||
 | 
						[[nodiscard]] bool ValidSerialNumbers(const std::vector<std::string> &Serial);
 | 
				
			||||||
	[[nodiscard]] bool ValidUUID(const std::string &UUID);
 | 
						[[nodiscard]] bool ValidUUID(const std::string &UUID);
 | 
				
			||||||
	[[nodiscard]] bool ValidHostname(const std::string &hostname);
 | 
						[[nodiscard]] bool ValidHostname(const std::string &hostname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -146,4 +147,38 @@ namespace OpenWifi::Utils {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	bool ExtractBase64CompressedData(const std::string &CompressedData,
 | 
						bool ExtractBase64CompressedData(const std::string &CompressedData,
 | 
				
			||||||
									 std::string &UnCompressedData, uint64_t compress_sz);
 | 
														 std::string &UnCompressedData, uint64_t compress_sz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inline bool match(const char* first, const char* second)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// If we reach at the end of both strings, we are done
 | 
				
			||||||
 | 
							if (*first == '\0' && *second == '\0')
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Make sure to eliminate consecutive '*'
 | 
				
			||||||
 | 
							if (*first == '*') {
 | 
				
			||||||
 | 
								while (*(first + 1) == '*')
 | 
				
			||||||
 | 
									first++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Make sure that the characters after '*' are present
 | 
				
			||||||
 | 
							// in second string. This function assumes that the
 | 
				
			||||||
 | 
							// first string will not contain two consecutive '*'
 | 
				
			||||||
 | 
							if (*first == '*' && *(first + 1) != '\0'
 | 
				
			||||||
 | 
								&& *second == '\0')
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// If the first string contains '?', or current
 | 
				
			||||||
 | 
							// characters of both strings match
 | 
				
			||||||
 | 
							if (*first == '?' || *first == *second)
 | 
				
			||||||
 | 
								return match(first + 1, second + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// If there is *, then there are two possibilities
 | 
				
			||||||
 | 
							// a) We consider current character of second string
 | 
				
			||||||
 | 
							// b) We ignore current character of second string.
 | 
				
			||||||
 | 
							if (*first == '*')
 | 
				
			||||||
 | 
								return match(first + 1, second)
 | 
				
			||||||
 | 
									   || match(first, second + 1);
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace OpenWifi::Utils
 | 
					} // namespace OpenWifi::Utils
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -435,18 +435,18 @@
 | 
				
			|||||||
                                                    regarding this application,
 | 
					                                                    regarding this application,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:tip-keys@arilia.com"
 | 
					                                                        href="mailto:${USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                        target="_blank"
 | 
					                                                        target="_blank"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        tip-keys@arilia.com
 | 
					                                                        ${USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    . For question regarding the
 | 
					                                                    . For question regarding the
 | 
				
			||||||
                                                    Telecom Infra Project,
 | 
					                                                    Telecom Infra Project,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:info@telecominfraproject.com"
 | 
					                                                        href="mailto:${GLOBAL_USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        info@telecominfraproject.com
 | 
					                                                        ${GLOBAL_USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    .
 | 
					                                                    .
 | 
				
			||||||
                                                </p>
 | 
					                                                </p>
 | 
				
			||||||
@@ -456,7 +456,7 @@
 | 
				
			|||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
                                            <td>
 | 
					                                            <td>
 | 
				
			||||||
                                                <p>Thank You!</p>
 | 
					                                                <p>Thank You!</p>
 | 
				
			||||||
                                                <p>Arilia Wireless Inc.</p>
 | 
					                                                <p>${USER_SIGNATURE}</p>
 | 
				
			||||||
                                            </td>
 | 
					                                            </td>
 | 
				
			||||||
                                        </tr>
 | 
					                                        </tr>
 | 
				
			||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
@@ -502,13 +502,13 @@
 | 
				
			|||||||
                                                    <tr>
 | 
					                                                    <tr>
 | 
				
			||||||
                                                        <p class="align-center">
 | 
					                                                        <p class="align-center">
 | 
				
			||||||
                                                            Copyright 2023
 | 
					                                                            Copyright 2023
 | 
				
			||||||
                                                            Arilia Wireless Inc,
 | 
					                                                            ${USER_SIGNATURE},
 | 
				
			||||||
                                                            All rights reserved.
 | 
					                                                            All rights reserved.
 | 
				
			||||||
                                                        </p>
 | 
					                                                        </p>
 | 
				
			||||||
                                                        <a
 | 
					                                                        <a
 | 
				
			||||||
                                                            href="https://arilia.com"
 | 
					                                                            href="https://${USER_HELPER_SITE}"
 | 
				
			||||||
                                                            target="_blank"
 | 
					                                                            target="_blank"
 | 
				
			||||||
                                                            >www.arilia.com</a
 | 
					                                                            >${USER_HELPER_SITE}</a
 | 
				
			||||||
                                                        >
 | 
					                                                        >
 | 
				
			||||||
                                                    </tr>
 | 
					                                                    </tr>
 | 
				
			||||||
                                                </tbody>
 | 
					                                                </tbody>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -431,18 +431,18 @@
 | 
				
			|||||||
                                                    regarding this application,
 | 
					                                                    regarding this application,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:tip-keys@arilia.com"
 | 
					                                                            href="mailto:${USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                        target="_blank"
 | 
					                                                            target="_blank"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        tip-keys@arilia.com
 | 
					                                                        ${USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    . For question regarding the
 | 
					                                                    . For question regarding the
 | 
				
			||||||
                                                    Telecom Infra Project,
 | 
					                                                    Telecom Infra Project,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:info@telecominfraproject.com"
 | 
					                                                            href="mailto:${GLOBAL_USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        info@telecominfraproject.com
 | 
					                                                        ${GLOBAL_USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    .
 | 
					                                                    .
 | 
				
			||||||
                                                </p>
 | 
					                                                </p>
 | 
				
			||||||
@@ -452,7 +452,7 @@
 | 
				
			|||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
                                            <td>
 | 
					                                            <td>
 | 
				
			||||||
                                                <p>Thank You!</p>
 | 
					                                                <p>Thank You!</p>
 | 
				
			||||||
                                                <p>Arilia Wireless Inc.</p>
 | 
					                                                <p>${USER_SIGNATURE}</p>
 | 
				
			||||||
                                            </td>
 | 
					                                            </td>
 | 
				
			||||||
                                        </tr>
 | 
					                                        </tr>
 | 
				
			||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
@@ -494,19 +494,19 @@
 | 
				
			|||||||
                                                style="min-width: 100%"
 | 
					                                                style="min-width: 100%"
 | 
				
			||||||
                                            >
 | 
					                                            >
 | 
				
			||||||
                                                <tbody>
 | 
					                                                <tbody>
 | 
				
			||||||
                                                    <tr></tr>
 | 
					                                                <tr></tr>
 | 
				
			||||||
                                                    <tr>
 | 
					                                                <tr>
 | 
				
			||||||
                                                        <p class="align-center">
 | 
					                                                    <p class="align-center">
 | 
				
			||||||
                                                            Copyright 2023
 | 
					                                                        Copyright 2023
 | 
				
			||||||
                                                            Arilia Wireless Inc,
 | 
					                                                        ${USER_SIGNATURE},
 | 
				
			||||||
                                                            All rights reserved.
 | 
					                                                        All rights reserved.
 | 
				
			||||||
                                                        </p>
 | 
					                                                    </p>
 | 
				
			||||||
                                                        <a
 | 
					                                                    <a
 | 
				
			||||||
                                                            href="https://arilia.com"
 | 
					                                                            href="https://${USER_HELPER_SITE}"
 | 
				
			||||||
                                                            target="_blank"
 | 
					                                                            target="_blank"
 | 
				
			||||||
                                                            >www.arilia.com</a
 | 
					                                                    >${USER_HELPER_SITE}</a
 | 
				
			||||||
                                                        >
 | 
					                                                    >
 | 
				
			||||||
                                                    </tr>
 | 
					                                                </tr>
 | 
				
			||||||
                                                </tbody>
 | 
					                                                </tbody>
 | 
				
			||||||
                                            </table>
 | 
					                                            </table>
 | 
				
			||||||
                                        </td>
 | 
					                                        </td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -435,18 +435,18 @@
 | 
				
			|||||||
                                                    regarding this application,
 | 
					                                                    regarding this application,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:tip-keys@arilia.com"
 | 
					                                                            href="mailto:${USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                        target="_blank"
 | 
					                                                            target="_blank"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        tip-keys@arilia.com
 | 
					                                                        ${USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    . For question regarding the
 | 
					                                                    . For question regarding the
 | 
				
			||||||
                                                    Telecom Infra Project,
 | 
					                                                    Telecom Infra Project,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:info@telecominfraproject.com"
 | 
					                                                            href="mailto:${GLOBAL_USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        info@telecominfraproject.com
 | 
					                                                        ${GLOBAL_USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    .
 | 
					                                                    .
 | 
				
			||||||
                                                </p>
 | 
					                                                </p>
 | 
				
			||||||
@@ -456,7 +456,7 @@
 | 
				
			|||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
                                            <td>
 | 
					                                            <td>
 | 
				
			||||||
                                                <p>Thank You!</p>
 | 
					                                                <p>Thank You!</p>
 | 
				
			||||||
                                                <p>Arilia Wireless Inc.</p>
 | 
					                                                <p>${USER_SIGNATURE}</p>
 | 
				
			||||||
                                            </td>
 | 
					                                            </td>
 | 
				
			||||||
                                        </tr>
 | 
					                                        </tr>
 | 
				
			||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
@@ -498,19 +498,19 @@
 | 
				
			|||||||
                                                style="min-width: 100%"
 | 
					                                                style="min-width: 100%"
 | 
				
			||||||
                                            >
 | 
					                                            >
 | 
				
			||||||
                                                <tbody>
 | 
					                                                <tbody>
 | 
				
			||||||
                                                    <tr></tr>
 | 
					                                                <tr></tr>
 | 
				
			||||||
                                                    <tr>
 | 
					                                                <tr>
 | 
				
			||||||
                                                        <p class="align-center">
 | 
					                                                    <p class="align-center">
 | 
				
			||||||
                                                            Copyright 2023
 | 
					                                                        Copyright 2023
 | 
				
			||||||
                                                            Arilia Wireless Inc,
 | 
					                                                        ${USER_SIGNATURE},
 | 
				
			||||||
                                                            All rights reserved.
 | 
					                                                        All rights reserved.
 | 
				
			||||||
                                                        </p>
 | 
					                                                    </p>
 | 
				
			||||||
                                                        <a
 | 
					                                                    <a
 | 
				
			||||||
                                                            href="https://arilia.com"
 | 
					                                                            href="https://${USER_HELPER_SITE}"
 | 
				
			||||||
                                                            target="_blank"
 | 
					                                                            target="_blank"
 | 
				
			||||||
                                                            >www.arilia.com</a
 | 
					                                                    >${USER_HELPER_SITE}</a
 | 
				
			||||||
                                                        >
 | 
					                                                    >
 | 
				
			||||||
                                                    </tr>
 | 
					                                                </tr>
 | 
				
			||||||
                                                </tbody>
 | 
					                                                </tbody>
 | 
				
			||||||
                                            </table>
 | 
					                                            </table>
 | 
				
			||||||
                                        </td>
 | 
					                                        </td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,527 @@
 | 
				
			|||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <title>Email Confirmation</title>
 | 
				
			||||||
 | 
					    <style>
 | 
				
			||||||
 | 
					        img {
 | 
				
			||||||
 | 
					            border: none;
 | 
				
			||||||
 | 
					            -ms-interpolation-mode: bicubic;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        body {
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            background-color: #f6f6f6;
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            -webkit-font-smoothing: antialiased;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            line-height: 1.4;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            padding: 0;
 | 
				
			||||||
 | 
					            -ms-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					            -webkit-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table {
 | 
				
			||||||
 | 
					            border-collapse: separate;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table td {
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            vertical-align: top;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .body {
 | 
				
			||||||
 | 
					            background-color: white;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .container {
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            margin: 0 auto !important;
 | 
				
			||||||
 | 
					            max-width: 580px;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					            width: 580px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .content {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            margin: 0 auto;
 | 
				
			||||||
 | 
					            max-width: 580px;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .main {
 | 
				
			||||||
 | 
					            background: #ffffff;
 | 
				
			||||||
 | 
					            border-radius: 0px;
 | 
				
			||||||
 | 
					            width: 600px;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					            border: 1px solid #d4d4d4;
 | 
				
			||||||
 | 
					            padding-left: 45px;
 | 
				
			||||||
 | 
					            padding-right: 45px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .wrapper {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            padding: 40px 20px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .content-block {
 | 
				
			||||||
 | 
					            padding-bottom: 10px;
 | 
				
			||||||
 | 
					            padding-top: 10px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer {
 | 
				
			||||||
 | 
					            clear: both;
 | 
				
			||||||
 | 
					            margin-top: 10px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer td,
 | 
				
			||||||
 | 
					        .footer p,
 | 
				
			||||||
 | 
					        .footer span,
 | 
				
			||||||
 | 
					        .footer a {
 | 
				
			||||||
 | 
					            color: #999999;
 | 
				
			||||||
 | 
					            font-size: 12px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            TYPOGRAPHY
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1,
 | 
				
			||||||
 | 
					        h2,
 | 
				
			||||||
 | 
					        h3,
 | 
				
			||||||
 | 
					        h4 {
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-weight: 400;
 | 
				
			||||||
 | 
					            line-height: 1.4;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            margin-bottom: 30px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h2 {
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1 {
 | 
				
			||||||
 | 
					            font-size: 35px;
 | 
				
			||||||
 | 
					            font-weight: 300;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            text-transform: capitalize;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        p,
 | 
				
			||||||
 | 
					        ul,
 | 
				
			||||||
 | 
					        ol {
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            font-weight: normal;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            margin-bottom: 15px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        p li,
 | 
				
			||||||
 | 
					        ul li,
 | 
				
			||||||
 | 
					        ol li {
 | 
				
			||||||
 | 
					            list-style-position: inside;
 | 
				
			||||||
 | 
					            margin-left: 5px;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        a {
 | 
				
			||||||
 | 
					            color: #29818c !important;
 | 
				
			||||||
 | 
					            text-decoration: none;
 | 
				
			||||||
 | 
					            border-bottom: 1px solid #d2d2d2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer a {
 | 
				
			||||||
 | 
					            color: #999999 !important;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            BUTTONS
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tbody {
 | 
				
			||||||
 | 
					            text-align: left;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn > tbody > tr > td {
 | 
				
			||||||
 | 
					            padding-bottom: 15px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn table {
 | 
				
			||||||
 | 
					            width: auto;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn table td {
 | 
				
			||||||
 | 
					            background-color: #ffffff;
 | 
				
			||||||
 | 
					            border-radius: 20px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn a {
 | 
				
			||||||
 | 
					            background-color: #ffffff;
 | 
				
			||||||
 | 
					            border: solid 1px #489e94;
 | 
				
			||||||
 | 
					            border-radius: 5px;
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            color: #29818c;
 | 
				
			||||||
 | 
					            cursor: pointer;
 | 
				
			||||||
 | 
					            display: inline-block;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            font-weight: bold;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            padding: 12px 120px;
 | 
				
			||||||
 | 
					            text-decoration: none;
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					            text-transform: uppercase;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn-primary a {
 | 
				
			||||||
 | 
					            transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1)
 | 
				
			||||||
 | 
					            0ms,
 | 
				
			||||||
 | 
					            box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,
 | 
				
			||||||
 | 
					            border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
 | 
				
			||||||
 | 
					            margin: auto;
 | 
				
			||||||
 | 
					            background-color: #29818c;
 | 
				
			||||||
 | 
					            border-color: #29818c;
 | 
				
			||||||
 | 
					            color: #ffffff !important;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            OTHER STYLES THAT MIGHT BE USEFUL
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .align-center {
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .preheader {
 | 
				
			||||||
 | 
					            color: transparent;
 | 
				
			||||||
 | 
					            display: none;
 | 
				
			||||||
 | 
					            height: 0;
 | 
				
			||||||
 | 
					            max-height: 0;
 | 
				
			||||||
 | 
					            max-width: 0;
 | 
				
			||||||
 | 
					            opacity: 0;
 | 
				
			||||||
 | 
					            overflow: hidden;
 | 
				
			||||||
 | 
					            visibility: hidden;
 | 
				
			||||||
 | 
					            width: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        hr {
 | 
				
			||||||
 | 
					            border: 0;
 | 
				
			||||||
 | 
					            border-bottom: 1px solid #d4d4d4;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .grayFont {
 | 
				
			||||||
 | 
					            color: #999999;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .bold {
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            RESPONSIVE AND MOBILE FRIENDLY STYLES
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media only screen and (max-width: 620px) {
 | 
				
			||||||
 | 
					            table[class='body'] h1 {
 | 
				
			||||||
 | 
					                font-size: 28px !important;
 | 
				
			||||||
 | 
					                margin-bottom: 10px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] p,
 | 
				
			||||||
 | 
					            table[class='body'] ul,
 | 
				
			||||||
 | 
					            table[class='body'] ol,
 | 
				
			||||||
 | 
					            table[class='body'] td,
 | 
				
			||||||
 | 
					            table[class='body'] span,
 | 
				
			||||||
 | 
					            table[class='body'] a {
 | 
				
			||||||
 | 
					                font-size: 16px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .wrapper,
 | 
				
			||||||
 | 
					            table[class='body'] .article {
 | 
				
			||||||
 | 
					                padding: 10px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .content {
 | 
				
			||||||
 | 
					                padding: 0 !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .container {
 | 
				
			||||||
 | 
					                padding: 0 !important;
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .main {
 | 
				
			||||||
 | 
					                border-left-width: 0 !important;
 | 
				
			||||||
 | 
					                border-radius: 0 !important;
 | 
				
			||||||
 | 
					                border-right-width: 0 !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .btn table {
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .btn a {
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .img-responsive {
 | 
				
			||||||
 | 
					                height: auto !important;
 | 
				
			||||||
 | 
					                max-width: 100% !important;
 | 
				
			||||||
 | 
					                width: auto !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            PRESERVE THESE STYLES IN THE HEAD
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media all {
 | 
				
			||||||
 | 
					            .ExternalClass {
 | 
				
			||||||
 | 
					                width: 100%;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .ExternalClass,
 | 
				
			||||||
 | 
					            .ExternalClass p,
 | 
				
			||||||
 | 
					            .ExternalClass span,
 | 
				
			||||||
 | 
					            .ExternalClass font,
 | 
				
			||||||
 | 
					            .ExternalClass td,
 | 
				
			||||||
 | 
					            .ExternalClass div {
 | 
				
			||||||
 | 
					                line-height: 100%;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .apple-link a {
 | 
				
			||||||
 | 
					                color: inherit !important;
 | 
				
			||||||
 | 
					                font-family: inherit !important;
 | 
				
			||||||
 | 
					                font-size: inherit !important;
 | 
				
			||||||
 | 
					                font-weight: inherit !important;
 | 
				
			||||||
 | 
					                line-height: inherit !important;
 | 
				
			||||||
 | 
					                text-decoration: none !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .btn-primary a:hover {
 | 
				
			||||||
 | 
					                background-color: rgb(50, 110, 103) !important;
 | 
				
			||||||
 | 
					                border-color: rgb(50, 110, 103) !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body class="">
 | 
				
			||||||
 | 
					<span class="preheader"></span>
 | 
				
			||||||
 | 
					<table
 | 
				
			||||||
 | 
					        d=""
 | 
				
			||||||
 | 
					        role="presentation"
 | 
				
			||||||
 | 
					        border="0"
 | 
				
			||||||
 | 
					        cellpadding="0"
 | 
				
			||||||
 | 
					        cellspacing="0"
 | 
				
			||||||
 | 
					        class="body"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					    <tr>
 | 
				
			||||||
 | 
					        <td class="container">
 | 
				
			||||||
 | 
					            <div class="content">
 | 
				
			||||||
 | 
					                <!-- START CENTERED WHITE CONTAINER -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <table
 | 
				
			||||||
 | 
					                        border="0"
 | 
				
			||||||
 | 
					                        cellpadding="0"
 | 
				
			||||||
 | 
					                        cellspacing="0"
 | 
				
			||||||
 | 
					                        width="100%"
 | 
				
			||||||
 | 
					                        style="min-width: 100%"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    <tbody>
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <td valign="top" style="padding: 0px">
 | 
				
			||||||
 | 
					                            <table
 | 
				
			||||||
 | 
					                                    align="center"
 | 
				
			||||||
 | 
					                                    style="text-align: center"
 | 
				
			||||||
 | 
					                                    width="100%"
 | 
				
			||||||
 | 
					                                    border="0"
 | 
				
			||||||
 | 
					                                    cellpadding="0"
 | 
				
			||||||
 | 
					                                    cellspacing="0"
 | 
				
			||||||
 | 
					                                    style="min-width: 100%"
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <tbody>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td
 | 
				
			||||||
 | 
					                                            valign="top"
 | 
				
			||||||
 | 
					                                            class="align-center"
 | 
				
			||||||
 | 
					                                            style="
 | 
				
			||||||
 | 
					                                                            padding-right: 0px;
 | 
				
			||||||
 | 
					                                                            padding-left: 48px;
 | 
				
			||||||
 | 
					                                                            padding-top: 0;
 | 
				
			||||||
 | 
					                                                            padding-bottom: 0;
 | 
				
			||||||
 | 
					                                                        "
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <img
 | 
				
			||||||
 | 
					                                                align="center"
 | 
				
			||||||
 | 
					                                                alt="OpenWifi"
 | 
				
			||||||
 | 
					                                                src="${LOGO}"
 | 
				
			||||||
 | 
					                                                style="
 | 
				
			||||||
 | 
					                                                                max-width: 100%;
 | 
				
			||||||
 | 
					                                                                padding-bottom: 0;
 | 
				
			||||||
 | 
					                                                                display: inline !important;
 | 
				
			||||||
 | 
					                                                                vertical-align: bottom;
 | 
				
			||||||
 | 
					                                                            "
 | 
				
			||||||
 | 
					                                        />
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                </tbody>
 | 
				
			||||||
 | 
					                            </table>
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    </tbody>
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					                <table role="presentation" class="main">
 | 
				
			||||||
 | 
					                    <!-- START MAIN CONTENT AREA -->
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <td class="wrapper">
 | 
				
			||||||
 | 
					                            <table
 | 
				
			||||||
 | 
					                                    role="presentation"
 | 
				
			||||||
 | 
					                                    border="0"
 | 
				
			||||||
 | 
					                                    cellpadding="0"
 | 
				
			||||||
 | 
					                                    cellspacing="0"
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <h2>
 | 
				
			||||||
 | 
					                                            Confirm Your Email Address
 | 
				
			||||||
 | 
					                                            to Get Started
 | 
				
			||||||
 | 
					                                        </h2>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>Dear ${RECIPIENT_EMAIL} ,</p>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            Before you can access the
 | 
				
			||||||
 | 
					                                            system, you must validate
 | 
				
			||||||
 | 
					                                            your e-mail address. Please
 | 
				
			||||||
 | 
					                                            click on the button below to
 | 
				
			||||||
 | 
					                                            complete this task.
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td
 | 
				
			||||||
 | 
					                                            style="
 | 
				
			||||||
 | 
					                                                    padding-top: 15px;
 | 
				
			||||||
 | 
					                                                    padding-bottom: 40px;
 | 
				
			||||||
 | 
					                                                "
 | 
				
			||||||
 | 
					                                            class="btn btn-primary"
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <a
 | 
				
			||||||
 | 
					                                                href="${ACTION_LINK}"
 | 
				
			||||||
 | 
					                                                target="_blank"
 | 
				
			||||||
 | 
					                                        >Confirm Email Address</a
 | 
				
			||||||
 | 
					                                        >
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <hr
 | 
				
			||||||
 | 
					                                                style="
 | 
				
			||||||
 | 
					                                                        margin-top: 0px;
 | 
				
			||||||
 | 
					                                                        margin-bottom: 30px;
 | 
				
			||||||
 | 
					                                                    "
 | 
				
			||||||
 | 
					                                        />
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            For questions & support
 | 
				
			||||||
 | 
					                                            regarding this application,
 | 
				
			||||||
 | 
					                                            please contact us at
 | 
				
			||||||
 | 
					                                            <a
 | 
				
			||||||
 | 
					                                                    href="mailto:${SUB_HELPER_EMAIL}"
 | 
				
			||||||
 | 
					                                                    target="_blank"
 | 
				
			||||||
 | 
					                                            >
 | 
				
			||||||
 | 
					                                                ${SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					                                            </a>
 | 
				
			||||||
 | 
					                                            . For question regarding the
 | 
				
			||||||
 | 
					                                            Telecom Infra Project,
 | 
				
			||||||
 | 
					                                            please contact us at
 | 
				
			||||||
 | 
					                                            <a
 | 
				
			||||||
 | 
					                                                    href="mailto:${GLOBAL_SUB_HELPER_EMAIL}"
 | 
				
			||||||
 | 
					                                            >
 | 
				
			||||||
 | 
					                                                ${GLOBAL_SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					                                            </a>
 | 
				
			||||||
 | 
					                                            .
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>Thank You!</p>
 | 
				
			||||||
 | 
					                                        <p>${SUB_SIGNATURE}</p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <table
 | 
				
			||||||
 | 
					                                            role="presentation"
 | 
				
			||||||
 | 
					                                            border="0"
 | 
				
			||||||
 | 
					                                            cellpadding="0"
 | 
				
			||||||
 | 
					                                            cellspacing="0"
 | 
				
			||||||
 | 
					                                            class="btn btn-primary"
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <tbody></tbody>
 | 
				
			||||||
 | 
					                                    </table>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                            </table>
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    <!-- END MAIN CONTENT AREA -->
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <!-- END CENTERED WHITE CONTAINER -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div class="footer">
 | 
				
			||||||
 | 
					                    <table
 | 
				
			||||||
 | 
					                            border="0"
 | 
				
			||||||
 | 
					                            cellpadding="0"
 | 
				
			||||||
 | 
					                            cellspacing="0"
 | 
				
			||||||
 | 
					                            width="100%"
 | 
				
			||||||
 | 
					                            style="min-width: 100; margin-top: 30px"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        <tbody>
 | 
				
			||||||
 | 
					                        <tr>
 | 
				
			||||||
 | 
					                            <td valign="top" style="padding: 0px">
 | 
				
			||||||
 | 
					                                <table
 | 
				
			||||||
 | 
					                                        align="left"
 | 
				
			||||||
 | 
					                                        width="100%"
 | 
				
			||||||
 | 
					                                        border="0"
 | 
				
			||||||
 | 
					                                        cellpadding="0"
 | 
				
			||||||
 | 
					                                        cellspacing="0"
 | 
				
			||||||
 | 
					                                        style="min-width: 100%"
 | 
				
			||||||
 | 
					                                >
 | 
				
			||||||
 | 
					                                    <tbody>
 | 
				
			||||||
 | 
					                                    <tr></tr>
 | 
				
			||||||
 | 
					                                    <tr>
 | 
				
			||||||
 | 
					                                        <p class="align-center">
 | 
				
			||||||
 | 
					                                            Copyright 2023
 | 
				
			||||||
 | 
					                                            ${SUB_SIGNATURE},
 | 
				
			||||||
 | 
					                                            All rights reserved.
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                        <a
 | 
				
			||||||
 | 
					                                                href="https://${SUB_HELPER_SITE}"
 | 
				
			||||||
 | 
					                                                target="_blank"
 | 
				
			||||||
 | 
					                                        >${SUB_HELPER_SITE}</a
 | 
				
			||||||
 | 
					                                        >
 | 
				
			||||||
 | 
					                                    </tr>
 | 
				
			||||||
 | 
					                                    </tbody>
 | 
				
			||||||
 | 
					                                </table>
 | 
				
			||||||
 | 
					                            </td>
 | 
				
			||||||
 | 
					                        </tr>
 | 
				
			||||||
 | 
					                        </tbody>
 | 
				
			||||||
 | 
					                    </table>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </td>
 | 
				
			||||||
 | 
					        <td> </td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					Dear ${RECIPIENT_EMAIL},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Before you can access the system, you must validate your e-mail address. Please click on the link below to complete this task.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ${ACTION_LINK}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    And follow the instructions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thank you!
 | 
				
			||||||
@@ -0,0 +1,523 @@
 | 
				
			|||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <title>Password Reset</title>
 | 
				
			||||||
 | 
					    <style>
 | 
				
			||||||
 | 
					        img {
 | 
				
			||||||
 | 
					            border: none;
 | 
				
			||||||
 | 
					            -ms-interpolation-mode: bicubic;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        body {
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            background-color: #f6f6f6;
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            -webkit-font-smoothing: antialiased;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            line-height: 1.4;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            padding: 0;
 | 
				
			||||||
 | 
					            -ms-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					            -webkit-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table {
 | 
				
			||||||
 | 
					            border-collapse: separate;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table td {
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            vertical-align: top;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .body {
 | 
				
			||||||
 | 
					            background-color: white;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .container {
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            margin: 0 auto !important;
 | 
				
			||||||
 | 
					            max-width: 580px;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					            width: 580px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .content {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            margin: 0 auto;
 | 
				
			||||||
 | 
					            max-width: 580px;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .main {
 | 
				
			||||||
 | 
					            background: #ffffff;
 | 
				
			||||||
 | 
					            border-radius: 0px;
 | 
				
			||||||
 | 
					            width: 600px;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					            border: 1px solid #d4d4d4;
 | 
				
			||||||
 | 
					            padding-left: 45px;
 | 
				
			||||||
 | 
					            padding-right: 45px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .wrapper {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            padding: 40px 20px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .content-block {
 | 
				
			||||||
 | 
					            padding-bottom: 10px;
 | 
				
			||||||
 | 
					            padding-top: 10px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer {
 | 
				
			||||||
 | 
					            clear: both;
 | 
				
			||||||
 | 
					            margin-top: 10px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer td,
 | 
				
			||||||
 | 
					        .footer p,
 | 
				
			||||||
 | 
					        .footer span,
 | 
				
			||||||
 | 
					        .footer a {
 | 
				
			||||||
 | 
					            color: #999999;
 | 
				
			||||||
 | 
					            font-size: 12px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            TYPOGRAPHY
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1,
 | 
				
			||||||
 | 
					        h2,
 | 
				
			||||||
 | 
					        h3,
 | 
				
			||||||
 | 
					        h4 {
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-weight: 400;
 | 
				
			||||||
 | 
					            line-height: 1.4;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            margin-bottom: 30px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h2 {
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1 {
 | 
				
			||||||
 | 
					            font-size: 35px;
 | 
				
			||||||
 | 
					            font-weight: 300;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            text-transform: capitalize;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        p,
 | 
				
			||||||
 | 
					        ul,
 | 
				
			||||||
 | 
					        ol {
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            font-weight: normal;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            margin-bottom: 15px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        p li,
 | 
				
			||||||
 | 
					        ul li,
 | 
				
			||||||
 | 
					        ol li {
 | 
				
			||||||
 | 
					            list-style-position: inside;
 | 
				
			||||||
 | 
					            margin-left: 5px;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        a {
 | 
				
			||||||
 | 
					            color: #29818c !important;
 | 
				
			||||||
 | 
					            text-decoration: none;
 | 
				
			||||||
 | 
					            border-bottom: 1px solid #d2d2d2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer a {
 | 
				
			||||||
 | 
					            color: #999999 !important;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            BUTTONS
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tbody {
 | 
				
			||||||
 | 
					            text-align: left;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn > tbody > tr > td {
 | 
				
			||||||
 | 
					            padding-bottom: 15px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn table {
 | 
				
			||||||
 | 
					            width: auto;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn table td {
 | 
				
			||||||
 | 
					            background-color: #ffffff;
 | 
				
			||||||
 | 
					            border-radius: 20px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn a {
 | 
				
			||||||
 | 
					            background-color: #ffffff;
 | 
				
			||||||
 | 
					            border: solid 1px #489e94;
 | 
				
			||||||
 | 
					            border-radius: 5px;
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            color: #29818c;
 | 
				
			||||||
 | 
					            cursor: pointer;
 | 
				
			||||||
 | 
					            display: inline-block;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            font-weight: bold;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            padding: 12px 120px;
 | 
				
			||||||
 | 
					            text-decoration: none;
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					            text-transform: uppercase;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn-primary a {
 | 
				
			||||||
 | 
					            transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1)
 | 
				
			||||||
 | 
					            0ms,
 | 
				
			||||||
 | 
					            box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,
 | 
				
			||||||
 | 
					            border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
 | 
				
			||||||
 | 
					            margin: auto;
 | 
				
			||||||
 | 
					            background-color: #29818c;
 | 
				
			||||||
 | 
					            border-color: #29818c;
 | 
				
			||||||
 | 
					            color: #ffffff !important;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            OTHER STYLES THAT MIGHT BE USEFUL
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .align-center {
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .preheader {
 | 
				
			||||||
 | 
					            color: transparent;
 | 
				
			||||||
 | 
					            display: none;
 | 
				
			||||||
 | 
					            height: 0;
 | 
				
			||||||
 | 
					            max-height: 0;
 | 
				
			||||||
 | 
					            max-width: 0;
 | 
				
			||||||
 | 
					            opacity: 0;
 | 
				
			||||||
 | 
					            overflow: hidden;
 | 
				
			||||||
 | 
					            visibility: hidden;
 | 
				
			||||||
 | 
					            width: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        hr {
 | 
				
			||||||
 | 
					            border: 0;
 | 
				
			||||||
 | 
					            border-bottom: 1px solid #d4d4d4;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .grayFont {
 | 
				
			||||||
 | 
					            color: #999999;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .bold {
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            RESPONSIVE AND MOBILE FRIENDLY STYLES
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media only screen and (max-width: 620px) {
 | 
				
			||||||
 | 
					            table[class='body'] h1 {
 | 
				
			||||||
 | 
					                font-size: 28px !important;
 | 
				
			||||||
 | 
					                margin-bottom: 10px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] p,
 | 
				
			||||||
 | 
					            table[class='body'] ul,
 | 
				
			||||||
 | 
					            table[class='body'] ol,
 | 
				
			||||||
 | 
					            table[class='body'] td,
 | 
				
			||||||
 | 
					            table[class='body'] span,
 | 
				
			||||||
 | 
					            table[class='body'] a {
 | 
				
			||||||
 | 
					                font-size: 16px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .wrapper,
 | 
				
			||||||
 | 
					            table[class='body'] .article {
 | 
				
			||||||
 | 
					                padding: 10px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .content {
 | 
				
			||||||
 | 
					                padding: 0 !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .container {
 | 
				
			||||||
 | 
					                padding: 0 !important;
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .main {
 | 
				
			||||||
 | 
					                border-left-width: 0 !important;
 | 
				
			||||||
 | 
					                border-radius: 0 !important;
 | 
				
			||||||
 | 
					                border-right-width: 0 !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .btn table {
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .btn a {
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .img-responsive {
 | 
				
			||||||
 | 
					                height: auto !important;
 | 
				
			||||||
 | 
					                max-width: 100% !important;
 | 
				
			||||||
 | 
					                width: auto !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            PRESERVE THESE STYLES IN THE HEAD
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media all {
 | 
				
			||||||
 | 
					            .ExternalClass {
 | 
				
			||||||
 | 
					                width: 100%;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .ExternalClass,
 | 
				
			||||||
 | 
					            .ExternalClass p,
 | 
				
			||||||
 | 
					            .ExternalClass span,
 | 
				
			||||||
 | 
					            .ExternalClass font,
 | 
				
			||||||
 | 
					            .ExternalClass td,
 | 
				
			||||||
 | 
					            .ExternalClass div {
 | 
				
			||||||
 | 
					                line-height: 100%;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .apple-link a {
 | 
				
			||||||
 | 
					                color: inherit !important;
 | 
				
			||||||
 | 
					                font-family: inherit !important;
 | 
				
			||||||
 | 
					                font-size: inherit !important;
 | 
				
			||||||
 | 
					                font-weight: inherit !important;
 | 
				
			||||||
 | 
					                line-height: inherit !important;
 | 
				
			||||||
 | 
					                text-decoration: none !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .btn-primary a:hover {
 | 
				
			||||||
 | 
					                background-color: rgb(50, 110, 103) !important;
 | 
				
			||||||
 | 
					                border-color: rgb(50, 110, 103) !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body class="">
 | 
				
			||||||
 | 
					<span class="preheader"></span>
 | 
				
			||||||
 | 
					<table
 | 
				
			||||||
 | 
					        d=""
 | 
				
			||||||
 | 
					        role="presentation"
 | 
				
			||||||
 | 
					        border="0"
 | 
				
			||||||
 | 
					        cellpadding="0"
 | 
				
			||||||
 | 
					        cellspacing="0"
 | 
				
			||||||
 | 
					        class="body"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					    <tr>
 | 
				
			||||||
 | 
					        <td class="container">
 | 
				
			||||||
 | 
					            <div class="content">
 | 
				
			||||||
 | 
					                <!-- START CENTERED WHITE CONTAINER -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <table
 | 
				
			||||||
 | 
					                        border="0"
 | 
				
			||||||
 | 
					                        cellpadding="0"
 | 
				
			||||||
 | 
					                        cellspacing="0"
 | 
				
			||||||
 | 
					                        width="100%"
 | 
				
			||||||
 | 
					                        style="min-width: 100%"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    <tbody>
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <td valign="top" style="padding: 0px">
 | 
				
			||||||
 | 
					                            <table
 | 
				
			||||||
 | 
					                                    align="center"
 | 
				
			||||||
 | 
					                                    style="text-align: center"
 | 
				
			||||||
 | 
					                                    width="100%"
 | 
				
			||||||
 | 
					                                    border="0"
 | 
				
			||||||
 | 
					                                    cellpadding="0"
 | 
				
			||||||
 | 
					                                    cellspacing="0"
 | 
				
			||||||
 | 
					                                    style="min-width: 100%"
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <tbody>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td
 | 
				
			||||||
 | 
					                                            valign="top"
 | 
				
			||||||
 | 
					                                            class="align-center"
 | 
				
			||||||
 | 
					                                            style="
 | 
				
			||||||
 | 
					                                                            padding-right: 0px;
 | 
				
			||||||
 | 
					                                                            padding-left: 48px;
 | 
				
			||||||
 | 
					                                                            padding-top: 0;
 | 
				
			||||||
 | 
					                                                            padding-bottom: 0;
 | 
				
			||||||
 | 
					                                                        "
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <img
 | 
				
			||||||
 | 
					                                                align="center"
 | 
				
			||||||
 | 
					                                                alt="OpenWifi"
 | 
				
			||||||
 | 
					                                                src="${LOGO}"
 | 
				
			||||||
 | 
					                                                style="
 | 
				
			||||||
 | 
					                                                                max-width: 100%;
 | 
				
			||||||
 | 
					                                                                padding-bottom: 0;
 | 
				
			||||||
 | 
					                                                                display: inline !important;
 | 
				
			||||||
 | 
					                                                                vertical-align: bottom;
 | 
				
			||||||
 | 
					                                                            "
 | 
				
			||||||
 | 
					                                        />
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                </tbody>
 | 
				
			||||||
 | 
					                            </table>
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    </tbody>
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					                <table role="presentation" class="main">
 | 
				
			||||||
 | 
					                    <!-- START MAIN CONTENT AREA -->
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <td class="wrapper">
 | 
				
			||||||
 | 
					                            <table
 | 
				
			||||||
 | 
					                                    role="presentation"
 | 
				
			||||||
 | 
					                                    border="0"
 | 
				
			||||||
 | 
					                                    cellpadding="0"
 | 
				
			||||||
 | 
					                                    cellspacing="0"
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <h2>Password Reset</h2>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>Dear ${RECIPIENT_EMAIL} ,</p>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            You have requested us to
 | 
				
			||||||
 | 
					                                            reset your password. Please
 | 
				
			||||||
 | 
					                                            click on the link below and
 | 
				
			||||||
 | 
					                                            follow the instructions.
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td
 | 
				
			||||||
 | 
					                                            style="
 | 
				
			||||||
 | 
					                                                    padding-top: 15px;
 | 
				
			||||||
 | 
					                                                    padding-bottom: 40px;
 | 
				
			||||||
 | 
					                                                "
 | 
				
			||||||
 | 
					                                            class="btn btn-primary"
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <a
 | 
				
			||||||
 | 
					                                                href="${ACTION_LINK}"
 | 
				
			||||||
 | 
					                                                target="_blank"
 | 
				
			||||||
 | 
					                                        >Reset Password</a
 | 
				
			||||||
 | 
					                                        >
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <hr
 | 
				
			||||||
 | 
					                                                style="
 | 
				
			||||||
 | 
					                                                        margin-top: 0px;
 | 
				
			||||||
 | 
					                                                        margin-bottom: 30px;
 | 
				
			||||||
 | 
					                                                    "
 | 
				
			||||||
 | 
					                                        />
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            For questions & support
 | 
				
			||||||
 | 
					                                            regarding this application,
 | 
				
			||||||
 | 
					                                            please contact us at
 | 
				
			||||||
 | 
					                                            <a
 | 
				
			||||||
 | 
					                                                    href="mailto:${SUB_HELPER_EMAIL}"
 | 
				
			||||||
 | 
					                                                    target="_blank"
 | 
				
			||||||
 | 
					                                            >
 | 
				
			||||||
 | 
					                                                ${SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					                                            </a>
 | 
				
			||||||
 | 
					                                            . For question regarding the
 | 
				
			||||||
 | 
					                                            Telecom Infra Project,
 | 
				
			||||||
 | 
					                                            please contact us at
 | 
				
			||||||
 | 
					                                            <a
 | 
				
			||||||
 | 
					                                                    href="mailto:${GLOBAL_SUB_HELPER_EMAIL}"
 | 
				
			||||||
 | 
					                                            >
 | 
				
			||||||
 | 
					                                                ${GLOBAL_SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					                                            </a>
 | 
				
			||||||
 | 
					                                            .
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>Thank You!</p>
 | 
				
			||||||
 | 
					                                        <p>${SUB_SIGNATURE}</p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <table
 | 
				
			||||||
 | 
					                                            role="presentation"
 | 
				
			||||||
 | 
					                                            border="0"
 | 
				
			||||||
 | 
					                                            cellpadding="0"
 | 
				
			||||||
 | 
					                                            cellspacing="0"
 | 
				
			||||||
 | 
					                                            class="btn btn-primary"
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <tbody></tbody>
 | 
				
			||||||
 | 
					                                    </table>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                            </table>
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    <!-- END MAIN CONTENT AREA -->
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <!-- END CENTERED WHITE CONTAINER -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div class="footer">
 | 
				
			||||||
 | 
					                    <table
 | 
				
			||||||
 | 
					                            border="0"
 | 
				
			||||||
 | 
					                            cellpadding="0"
 | 
				
			||||||
 | 
					                            cellspacing="0"
 | 
				
			||||||
 | 
					                            width="100%"
 | 
				
			||||||
 | 
					                            style="min-width: 100; margin-top: 30px"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        <tbody>
 | 
				
			||||||
 | 
					                        <tr>
 | 
				
			||||||
 | 
					                            <td valign="top" style="padding: 0px">
 | 
				
			||||||
 | 
					                                <table
 | 
				
			||||||
 | 
					                                        align="left"
 | 
				
			||||||
 | 
					                                        width="100%"
 | 
				
			||||||
 | 
					                                        border="0"
 | 
				
			||||||
 | 
					                                        cellpadding="0"
 | 
				
			||||||
 | 
					                                        cellspacing="0"
 | 
				
			||||||
 | 
					                                        style="min-width: 100%"
 | 
				
			||||||
 | 
					                                >
 | 
				
			||||||
 | 
					                                    <tbody>
 | 
				
			||||||
 | 
					                                    <tr></tr>
 | 
				
			||||||
 | 
					                                    <tr>
 | 
				
			||||||
 | 
					                                        <p class="align-center">
 | 
				
			||||||
 | 
					                                            Copyright 2023
 | 
				
			||||||
 | 
					                                            ${SUB_SIGNATURE},
 | 
				
			||||||
 | 
					                                            All rights reserved.
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                        <a
 | 
				
			||||||
 | 
					                                                href="https://${SUB_HELPER_SITE}"
 | 
				
			||||||
 | 
					                                                target="_blank"
 | 
				
			||||||
 | 
					                                        >${SUB_HELPER_SITE}</a
 | 
				
			||||||
 | 
					                                        >
 | 
				
			||||||
 | 
					                                    </tr>
 | 
				
			||||||
 | 
					                                    </tbody>
 | 
				
			||||||
 | 
					                                </table>
 | 
				
			||||||
 | 
					                            </td>
 | 
				
			||||||
 | 
					                        </tr>
 | 
				
			||||||
 | 
					                        </tbody>
 | 
				
			||||||
 | 
					                    </table>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </td>
 | 
				
			||||||
 | 
					        <td> </td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					Dear ${RECIPIENT_EMAIL},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You have requested us to reset your password. Please click on the link below
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ${ACTION_LINK}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    And follow the instructions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thank you!
 | 
				
			||||||
@@ -0,0 +1,515 @@
 | 
				
			|||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <title>Verification Code</title>
 | 
				
			||||||
 | 
					    <style>
 | 
				
			||||||
 | 
					        img {
 | 
				
			||||||
 | 
					            border: none;
 | 
				
			||||||
 | 
					            -ms-interpolation-mode: bicubic;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        body {
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            background-color: #f6f6f6;
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            -webkit-font-smoothing: antialiased;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            line-height: 1.4;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            padding: 0;
 | 
				
			||||||
 | 
					            -ms-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					            -webkit-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table {
 | 
				
			||||||
 | 
					            border-collapse: separate;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table td {
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            vertical-align: top;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .body {
 | 
				
			||||||
 | 
					            background-color: white;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .container {
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            margin: 0 auto !important;
 | 
				
			||||||
 | 
					            max-width: 580px;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					            width: 580px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .content {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            margin: 0 auto;
 | 
				
			||||||
 | 
					            max-width: 580px;
 | 
				
			||||||
 | 
					            padding: 10px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .main {
 | 
				
			||||||
 | 
					            background: #ffffff;
 | 
				
			||||||
 | 
					            border-radius: 0px;
 | 
				
			||||||
 | 
					            width: 600px;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					            border: 1px solid #d4d4d4;
 | 
				
			||||||
 | 
					            padding-left: 45px;
 | 
				
			||||||
 | 
					            padding-right: 45px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .wrapper {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            padding: 40px 20px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .content-block {
 | 
				
			||||||
 | 
					            padding-bottom: 10px;
 | 
				
			||||||
 | 
					            padding-top: 10px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer {
 | 
				
			||||||
 | 
					            clear: both;
 | 
				
			||||||
 | 
					            margin-top: 10px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer td,
 | 
				
			||||||
 | 
					        .footer p,
 | 
				
			||||||
 | 
					        .footer span,
 | 
				
			||||||
 | 
					        .footer a {
 | 
				
			||||||
 | 
					            color: #999999;
 | 
				
			||||||
 | 
					            font-size: 12px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            TYPOGRAPHY
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1,
 | 
				
			||||||
 | 
					        h2,
 | 
				
			||||||
 | 
					        h3,
 | 
				
			||||||
 | 
					        h4 {
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-weight: 400;
 | 
				
			||||||
 | 
					            line-height: 1.4;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            margin-bottom: 30px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h2 {
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1 {
 | 
				
			||||||
 | 
					            font-size: 35px;
 | 
				
			||||||
 | 
					            font-weight: 300;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            text-transform: capitalize;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        p,
 | 
				
			||||||
 | 
					        ul,
 | 
				
			||||||
 | 
					        ol {
 | 
				
			||||||
 | 
					            font-family: sans-serif;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            font-weight: normal;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					            margin-bottom: 15px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        p li,
 | 
				
			||||||
 | 
					        ul li,
 | 
				
			||||||
 | 
					        ol li {
 | 
				
			||||||
 | 
					            list-style-position: inside;
 | 
				
			||||||
 | 
					            margin-left: 5px;
 | 
				
			||||||
 | 
					            color: #414141;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        a {
 | 
				
			||||||
 | 
					            color: #29818c !important;
 | 
				
			||||||
 | 
					            text-decoration: none;
 | 
				
			||||||
 | 
					            border-bottom: 1px solid #d2d2d2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .footer a {
 | 
				
			||||||
 | 
					            color: #999999 !important;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            BUTTONS
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn {
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tbody {
 | 
				
			||||||
 | 
					            text-align: left;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn > tbody > tr > td {
 | 
				
			||||||
 | 
					            padding-bottom: 15px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn table {
 | 
				
			||||||
 | 
					            width: auto;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn table td {
 | 
				
			||||||
 | 
					            background-color: #ffffff;
 | 
				
			||||||
 | 
					            border-radius: 20px;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn a {
 | 
				
			||||||
 | 
					            background-color: #ffffff;
 | 
				
			||||||
 | 
					            border: solid 1px #489e94;
 | 
				
			||||||
 | 
					            border-radius: 5px;
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            color: #29818c;
 | 
				
			||||||
 | 
					            cursor: pointer;
 | 
				
			||||||
 | 
					            display: inline-block;
 | 
				
			||||||
 | 
					            font-size: 14px;
 | 
				
			||||||
 | 
					            font-weight: bold;
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            padding: 12px 120px;
 | 
				
			||||||
 | 
					            text-decoration: none;
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					            text-transform: uppercase;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .btn-primary a {
 | 
				
			||||||
 | 
					            transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1)
 | 
				
			||||||
 | 
					            0ms,
 | 
				
			||||||
 | 
					            box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,
 | 
				
			||||||
 | 
					            border 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
 | 
				
			||||||
 | 
					            margin: auto;
 | 
				
			||||||
 | 
					            background-color: #29818c;
 | 
				
			||||||
 | 
					            border-color: #29818c;
 | 
				
			||||||
 | 
					            color: #ffffff !important;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            OTHER STYLES THAT MIGHT BE USEFUL
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .align-center {
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .preheader {
 | 
				
			||||||
 | 
					            color: transparent;
 | 
				
			||||||
 | 
					            display: none;
 | 
				
			||||||
 | 
					            height: 0;
 | 
				
			||||||
 | 
					            max-height: 0;
 | 
				
			||||||
 | 
					            max-width: 0;
 | 
				
			||||||
 | 
					            opacity: 0;
 | 
				
			||||||
 | 
					            overflow: hidden;
 | 
				
			||||||
 | 
					            visibility: hidden;
 | 
				
			||||||
 | 
					            width: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        hr {
 | 
				
			||||||
 | 
					            border: 0;
 | 
				
			||||||
 | 
					            border-bottom: 1px solid #d4d4d4;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .grayFont {
 | 
				
			||||||
 | 
					            color: #999999;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .bold {
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            RESPONSIVE AND MOBILE FRIENDLY STYLES
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media only screen and (max-width: 620px) {
 | 
				
			||||||
 | 
					            table[class='body'] h1 {
 | 
				
			||||||
 | 
					                font-size: 28px !important;
 | 
				
			||||||
 | 
					                margin-bottom: 10px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] p,
 | 
				
			||||||
 | 
					            table[class='body'] ul,
 | 
				
			||||||
 | 
					            table[class='body'] ol,
 | 
				
			||||||
 | 
					            table[class='body'] td,
 | 
				
			||||||
 | 
					            table[class='body'] span,
 | 
				
			||||||
 | 
					            table[class='body'] a {
 | 
				
			||||||
 | 
					                font-size: 16px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .wrapper,
 | 
				
			||||||
 | 
					            table[class='body'] .article {
 | 
				
			||||||
 | 
					                padding: 10px !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .content {
 | 
				
			||||||
 | 
					                padding: 0 !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .container {
 | 
				
			||||||
 | 
					                padding: 0 !important;
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .main {
 | 
				
			||||||
 | 
					                border-left-width: 0 !important;
 | 
				
			||||||
 | 
					                border-radius: 0 !important;
 | 
				
			||||||
 | 
					                border-right-width: 0 !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .btn table {
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .btn a {
 | 
				
			||||||
 | 
					                width: 100% !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            table[class='body'] .img-responsive {
 | 
				
			||||||
 | 
					                height: auto !important;
 | 
				
			||||||
 | 
					                max-width: 100% !important;
 | 
				
			||||||
 | 
					                width: auto !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* -------------------------------------
 | 
				
			||||||
 | 
					            PRESERVE THESE STYLES IN THE HEAD
 | 
				
			||||||
 | 
					        ------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media all {
 | 
				
			||||||
 | 
					            .ExternalClass {
 | 
				
			||||||
 | 
					                width: 100%;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .ExternalClass,
 | 
				
			||||||
 | 
					            .ExternalClass p,
 | 
				
			||||||
 | 
					            .ExternalClass span,
 | 
				
			||||||
 | 
					            .ExternalClass font,
 | 
				
			||||||
 | 
					            .ExternalClass td,
 | 
				
			||||||
 | 
					            .ExternalClass div {
 | 
				
			||||||
 | 
					                line-height: 100%;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .apple-link a {
 | 
				
			||||||
 | 
					                color: inherit !important;
 | 
				
			||||||
 | 
					                font-family: inherit !important;
 | 
				
			||||||
 | 
					                font-size: inherit !important;
 | 
				
			||||||
 | 
					                font-weight: inherit !important;
 | 
				
			||||||
 | 
					                line-height: inherit !important;
 | 
				
			||||||
 | 
					                text-decoration: none !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .btn-primary a:hover {
 | 
				
			||||||
 | 
					                background-color: rgb(50, 110, 103) !important;
 | 
				
			||||||
 | 
					                border-color: rgb(50, 110, 103) !important;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body class="">
 | 
				
			||||||
 | 
					<span class="preheader"></span>
 | 
				
			||||||
 | 
					<table
 | 
				
			||||||
 | 
					        d=""
 | 
				
			||||||
 | 
					        role="presentation"
 | 
				
			||||||
 | 
					        border="0"
 | 
				
			||||||
 | 
					        cellpadding="0"
 | 
				
			||||||
 | 
					        cellspacing="0"
 | 
				
			||||||
 | 
					        class="body"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					    <tr>
 | 
				
			||||||
 | 
					        <td class="container">
 | 
				
			||||||
 | 
					            <div class="content">
 | 
				
			||||||
 | 
					                <!-- START CENTERED WHITE CONTAINER -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <table
 | 
				
			||||||
 | 
					                        border="0"
 | 
				
			||||||
 | 
					                        cellpadding="0"
 | 
				
			||||||
 | 
					                        cellspacing="0"
 | 
				
			||||||
 | 
					                        width="100%"
 | 
				
			||||||
 | 
					                        style="min-width: 100%"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                    <tbody>
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <td valign="top" style="padding: 0px">
 | 
				
			||||||
 | 
					                            <table
 | 
				
			||||||
 | 
					                                    align="center"
 | 
				
			||||||
 | 
					                                    style="text-align: center"
 | 
				
			||||||
 | 
					                                    width="100%"
 | 
				
			||||||
 | 
					                                    border="0"
 | 
				
			||||||
 | 
					                                    cellpadding="0"
 | 
				
			||||||
 | 
					                                    cellspacing="0"
 | 
				
			||||||
 | 
					                                    style="min-width: 100%"
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <tbody>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td
 | 
				
			||||||
 | 
					                                            valign="top"
 | 
				
			||||||
 | 
					                                            class="align-center"
 | 
				
			||||||
 | 
					                                            style="
 | 
				
			||||||
 | 
					                                                            padding-right: 0px;
 | 
				
			||||||
 | 
					                                                            padding-left: 48px;
 | 
				
			||||||
 | 
					                                                            padding-top: 0;
 | 
				
			||||||
 | 
					                                                            padding-bottom: 0;
 | 
				
			||||||
 | 
					                                                        "
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <img
 | 
				
			||||||
 | 
					                                                align="center"
 | 
				
			||||||
 | 
					                                                alt="OpenWifi"
 | 
				
			||||||
 | 
					                                                src="${LOGO}"
 | 
				
			||||||
 | 
					                                                style="
 | 
				
			||||||
 | 
					                                                                max-width: 100%;
 | 
				
			||||||
 | 
					                                                                padding-bottom: 0;
 | 
				
			||||||
 | 
					                                                                display: inline !important;
 | 
				
			||||||
 | 
					                                                                vertical-align: bottom;
 | 
				
			||||||
 | 
					                                                            "
 | 
				
			||||||
 | 
					                                        />
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                </tbody>
 | 
				
			||||||
 | 
					                            </table>
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    </tbody>
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					                <table role="presentation" class="main">
 | 
				
			||||||
 | 
					                    <!-- START MAIN CONTENT AREA -->
 | 
				
			||||||
 | 
					                    <tr>
 | 
				
			||||||
 | 
					                        <td class="wrapper">
 | 
				
			||||||
 | 
					                            <table
 | 
				
			||||||
 | 
					                                    role="presentation"
 | 
				
			||||||
 | 
					                                    border="0"
 | 
				
			||||||
 | 
					                                    cellpadding="0"
 | 
				
			||||||
 | 
					                                    cellspacing="0"
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <h2>Your Login Validation Code</h2>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>Dear ${RECIPIENT_EMAIL} ,</p>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            You have requested your login validation. Please enter the following code on the login screen:
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                        <div style="text-align: center;">
 | 
				
			||||||
 | 
					                                            <h3 style="margin-bottom: 0px; font-weight: bold;">${CHALLENGE_CODE}</h3>
 | 
				
			||||||
 | 
					                                        </div>
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            If you are not trying to login, please login and change your password. Someone may be trying to
 | 
				
			||||||
 | 
					                                            access your account illegally.
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <hr
 | 
				
			||||||
 | 
					                                                style="
 | 
				
			||||||
 | 
					                                                        margin-top: 0px;
 | 
				
			||||||
 | 
					                                                        margin-bottom: 30px;
 | 
				
			||||||
 | 
					                                                    "
 | 
				
			||||||
 | 
					                                        />
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>
 | 
				
			||||||
 | 
					                                            For questions & support
 | 
				
			||||||
 | 
					                                            regarding this application,
 | 
				
			||||||
 | 
					                                            please contact us at
 | 
				
			||||||
 | 
					                                            <a
 | 
				
			||||||
 | 
					                                                    href="mailto:${SUB_HELPER_EMAIL}"
 | 
				
			||||||
 | 
					                                                    target="_blank"
 | 
				
			||||||
 | 
					                                            >
 | 
				
			||||||
 | 
					                                                ${SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					                                            </a>
 | 
				
			||||||
 | 
					                                            . For question regarding the
 | 
				
			||||||
 | 
					                                            Telecom Infra Project,
 | 
				
			||||||
 | 
					                                            please contact us at
 | 
				
			||||||
 | 
					                                            <a
 | 
				
			||||||
 | 
					                                                    href="mailto:${GLOBAL_SUB_HELPER_EMAIL}"
 | 
				
			||||||
 | 
					                                            >
 | 
				
			||||||
 | 
					                                                ${GLOBAL_SUB_HELPER_EMAIL}
 | 
				
			||||||
 | 
					                                            </a>
 | 
				
			||||||
 | 
					                                            .
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <td>
 | 
				
			||||||
 | 
					                                        <p>Thank You!</p>
 | 
				
			||||||
 | 
					                                        <p>${SUB_SIGNATURE}</p>
 | 
				
			||||||
 | 
					                                    </td>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                                <tr>
 | 
				
			||||||
 | 
					                                    <table
 | 
				
			||||||
 | 
					                                            role="presentation"
 | 
				
			||||||
 | 
					                                            border="0"
 | 
				
			||||||
 | 
					                                            cellpadding="0"
 | 
				
			||||||
 | 
					                                            cellspacing="0"
 | 
				
			||||||
 | 
					                                            class="btn btn-primary"
 | 
				
			||||||
 | 
					                                    >
 | 
				
			||||||
 | 
					                                        <tbody></tbody>
 | 
				
			||||||
 | 
					                                    </table>
 | 
				
			||||||
 | 
					                                </tr>
 | 
				
			||||||
 | 
					                            </table>
 | 
				
			||||||
 | 
					                        </td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                    <!-- END MAIN CONTENT AREA -->
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <!-- END CENTERED WHITE CONTAINER -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div class="footer">
 | 
				
			||||||
 | 
					                    <table
 | 
				
			||||||
 | 
					                            border="0"
 | 
				
			||||||
 | 
					                            cellpadding="0"
 | 
				
			||||||
 | 
					                            cellspacing="0"
 | 
				
			||||||
 | 
					                            width="100%"
 | 
				
			||||||
 | 
					                            style="min-width: 100; margin-top: 30px"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        <tbody>
 | 
				
			||||||
 | 
					                        <tr>
 | 
				
			||||||
 | 
					                            <td valign="top" style="padding: 0px">
 | 
				
			||||||
 | 
					                                <table
 | 
				
			||||||
 | 
					                                        align="left"
 | 
				
			||||||
 | 
					                                        width="100%"
 | 
				
			||||||
 | 
					                                        border="0"
 | 
				
			||||||
 | 
					                                        cellpadding="0"
 | 
				
			||||||
 | 
					                                        cellspacing="0"
 | 
				
			||||||
 | 
					                                        style="min-width: 100%"
 | 
				
			||||||
 | 
					                                >
 | 
				
			||||||
 | 
					                                    <tbody>
 | 
				
			||||||
 | 
					                                    <tr></tr>
 | 
				
			||||||
 | 
					                                    <tr>
 | 
				
			||||||
 | 
					                                        <p class="align-center">
 | 
				
			||||||
 | 
					                                            Copyright 2023
 | 
				
			||||||
 | 
					                                            ${SUB_SIGNATURE},
 | 
				
			||||||
 | 
					                                            All rights reserved.
 | 
				
			||||||
 | 
					                                        </p>
 | 
				
			||||||
 | 
					                                        <a
 | 
				
			||||||
 | 
					                                                href="https://${SUB_HELPER_SITE}"
 | 
				
			||||||
 | 
					                                                target="_blank"
 | 
				
			||||||
 | 
					                                        >${SUB_HELPER_SITE}</a
 | 
				
			||||||
 | 
					                                        >
 | 
				
			||||||
 | 
					                                    </tr>
 | 
				
			||||||
 | 
					                                    </tbody>
 | 
				
			||||||
 | 
					                                </table>
 | 
				
			||||||
 | 
					                            </td>
 | 
				
			||||||
 | 
					                        </tr>
 | 
				
			||||||
 | 
					                        </tbody>
 | 
				
			||||||
 | 
					                    </table>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </td>
 | 
				
			||||||
 | 
					        <td> </td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					Dear ${RECIPIENT_EMAIL},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You have requested your login validation. Please enter the following code on the login screen:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ${CHALLENGE_CODE}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If you are not trying to login, please login and change your password. Someone may be trying to
 | 
				
			||||||
 | 
					    access your account illegally.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thank you!
 | 
				
			||||||
@@ -423,18 +423,18 @@
 | 
				
			|||||||
                                                    regarding this application,
 | 
					                                                    regarding this application,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:tip-keys@arilia.com"
 | 
					                                                            href="mailto:${USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                        target="_blank"
 | 
					                                                            target="_blank"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        tip-keys@arilia.com
 | 
					                                                        ${USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    . For question regarding the
 | 
					                                                    . For question regarding the
 | 
				
			||||||
                                                    Telecom Infra Project,
 | 
					                                                    Telecom Infra Project,
 | 
				
			||||||
                                                    please contact us at
 | 
					                                                    please contact us at
 | 
				
			||||||
                                                    <a
 | 
					                                                    <a
 | 
				
			||||||
                                                        href="mailto:info@telecominfraproject.com"
 | 
					                                                            href="mailto:${GLOBAL_USER_HELPER_EMAIL}"
 | 
				
			||||||
                                                    >
 | 
					                                                    >
 | 
				
			||||||
                                                        info@telecominfraproject.com
 | 
					                                                        ${GLOBAL_USER_HELPER_EMAIL}
 | 
				
			||||||
                                                    </a>
 | 
					                                                    </a>
 | 
				
			||||||
                                                    .
 | 
					                                                    .
 | 
				
			||||||
                                                </p>
 | 
					                                                </p>
 | 
				
			||||||
@@ -444,7 +444,7 @@
 | 
				
			|||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
                                            <td>
 | 
					                                            <td>
 | 
				
			||||||
                                                <p>Thank You!</p>
 | 
					                                                <p>Thank You!</p>
 | 
				
			||||||
                                                <p>Arilia Wireless Inc.</p>
 | 
					                                                <p>${USER_SIGNATURE}</p>
 | 
				
			||||||
                                            </td>
 | 
					                                            </td>
 | 
				
			||||||
                                        </tr>
 | 
					                                        </tr>
 | 
				
			||||||
                                        <tr>
 | 
					                                        <tr>
 | 
				
			||||||
@@ -490,13 +490,13 @@
 | 
				
			|||||||
                                                    <tr>
 | 
					                                                    <tr>
 | 
				
			||||||
                                                        <p class="align-center">
 | 
					                                                        <p class="align-center">
 | 
				
			||||||
                                                            Copyright 2023
 | 
					                                                            Copyright 2023
 | 
				
			||||||
                                                            Arilia Wireless Inc,
 | 
					                                                            ${USER_SIGNATURE},
 | 
				
			||||||
                                                            All rights reserved.
 | 
					                                                            All rights reserved.
 | 
				
			||||||
                                                        </p>
 | 
					                                                        </p>
 | 
				
			||||||
                                                        <a
 | 
					                                                        <a
 | 
				
			||||||
                                                            href="https://arilia.com"
 | 
					                                                                href="https://${USER_HELPER_SITE}"
 | 
				
			||||||
                                                            target="_blank"
 | 
					                                                                target="_blank"
 | 
				
			||||||
                                                            >www.arilia.com</a
 | 
					                                                        >${USER_HELPER_SITE}</a
 | 
				
			||||||
                                                        >
 | 
					                                                        >
 | 
				
			||||||
                                                    </tr>
 | 
					                                                    </tr>
 | 
				
			||||||
                                                </tbody>
 | 
					                                                </tbody>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
<div class="footer">
 | 
					<div class="footer">
 | 
				
			||||||
  <p>
 | 
					  <p>
 | 
				
			||||||
    For questions & support regarding this application, please contact us at
 | 
					    For questions & support regarding this application, please contact us at
 | 
				
			||||||
    <a href="mailto:tip-keys@arilia.com" target="_blank">tip-keys@arilia.com</a>.
 | 
					    <a href="mailto:${USER_HELPER_EMAIL}" target="_blank">${USER_HELPER_EMAIL}</a>.
 | 
				
			||||||
    For question regarding the Telecom Infra Project, please contact us at
 | 
					    For question regarding the Telecom Infra Project, please contact us at
 | 
				
			||||||
    <a href="mailto:info@telecominfraproject.com">
 | 
					    <a href="mailto:${GLOBAL_USER_HELPER_EMAIL}">
 | 
				
			||||||
        info@telecominfraproject.com
 | 
					      ${GLOBAL_USER_HELPER_EMAIL}
 | 
				
			||||||
    </a>.
 | 
					    </a>.
 | 
				
			||||||
  </p>
 | 
					  </p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
@@ -16,6 +16,7 @@
 | 
				
			|||||||
<div class="info-card">
 | 
					<div class="info-card">
 | 
				
			||||||
    <h2 class="info-title">Reset Password</h2>
 | 
					    <h2 class="info-title">Reset Password</h2>
 | 
				
			||||||
    <form action="/api/v1/actionLink?action=password_reset" method="post" onsubmit="return validatePassword()" class="form-container">
 | 
					    <form action="/api/v1/actionLink?action=password_reset" method="post" onsubmit="return validatePassword()" class="form-container">
 | 
				
			||||||
 | 
					        <input type="hidden" id="custId" name="id" value="${UUID}">
 | 
				
			||||||
        <div class="form-control">
 | 
					        <div class="form-control">
 | 
				
			||||||
            <label class="form-label" for="password1" ><b>New Password</b></label>
 | 
					            <label class="form-label" for="password1" ><b>New Password</b></label>
 | 
				
			||||||
            <input class="form-input" id="password1" type="password" placeholder="New password" name="password1" pattern="${PASSWORD_VALIDATION}" required>
 | 
					            <input class="form-input" id="password1" type="password" placeholder="New password" name="password1" pattern="${PASSWORD_VALIDATION}" required>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										171
									
								
								wwwassets/sub_common.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								wwwassets/sub_common.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					body {font-family: Arial, Helvetica, sans-serif;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input[type=text], input[type=password] {
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  padding: 12px 20px;
 | 
				
			||||||
 | 
					  margin: 8px 0;
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					  border: 1px solid #ccc;
 | 
				
			||||||
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button {
 | 
				
			||||||
 | 
					  background-color: #04AA6D;
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					  padding: 14px 20px;
 | 
				
			||||||
 | 
					  margin: 8px 0;
 | 
				
			||||||
 | 
					  border: none;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button:hover {
 | 
				
			||||||
 | 
					  opacity: 0.8;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.logo-grid {
 | 
				
			||||||
 | 
					  display: grid;
 | 
				
			||||||
 | 
					  grid-template-columns: 20% 60% 20%;
 | 
				
			||||||
 | 
					  margin-top: calc(10vh)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.logo-grid > div > img {
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					  max-height: 200px;
 | 
				
			||||||
 | 
					  object-fit: contain;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.info-card {
 | 
				
			||||||
 | 
					  padding: 30px;
 | 
				
			||||||
 | 
					  box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  width: 50%;
 | 
				
			||||||
 | 
					  min-width: 400px;
 | 
				
			||||||
 | 
					  border: 1em;
 | 
				
			||||||
 | 
					  background-color: white;
 | 
				
			||||||
 | 
					  width: 40%;
 | 
				
			||||||
 | 
					  height: auto;
 | 
				
			||||||
 | 
					  margin-left: auto;
 | 
				
			||||||
 | 
					  margin-right: auto;
 | 
				
			||||||
 | 
					  margin-bottom: auto;
 | 
				
			||||||
 | 
					  margin-top: 50px;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  border-radius: 15px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.info-list {
 | 
				
			||||||
 | 
					  margin-left: 5%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.info-title {
 | 
				
			||||||
 | 
					  margin-left: 5%;
 | 
				
			||||||
 | 
					  color: #63B3ED;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.flex-box {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: row;
 | 
				
			||||||
 | 
					  justify-content: left;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					  margin-left: 5%;
 | 
				
			||||||
 | 
					  margin-top: 6px;
 | 
				
			||||||
 | 
					  margin-bottom: 6px;
 | 
				
			||||||
 | 
					  min-height: 30px
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.flex-box > h3 {
 | 
				
			||||||
 | 
					  margin-right: 4px;
 | 
				
			||||||
 | 
					  margin-top: 5px;
 | 
				
			||||||
 | 
					  margin-bottom: 5px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.container {
 | 
				
			||||||
 | 
					  padding: 16px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					span.password1 {
 | 
				
			||||||
 | 
					  float: right;
 | 
				
			||||||
 | 
					  padding-top: 16px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body {
 | 
				
			||||||
 | 
					  background-color: #ebedef;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Change styles for span and cancel button on extra small screens */
 | 
				
			||||||
 | 
					@media screen and (max-width: 300px) {
 | 
				
			||||||
 | 
					  span.password1 {
 | 
				
			||||||
 | 
					    display: block;
 | 
				
			||||||
 | 
					    float: none;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  .cancelbtn {
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-container {
 | 
				
			||||||
 | 
					  border: 0px;
 | 
				
			||||||
 | 
					  margin-left: 5%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-label {
 | 
				
			||||||
 | 
					    float: left;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-input {
 | 
				
			||||||
 | 
					  border-radius: 15px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-control {
 | 
				
			||||||
 | 
					  margin-bottom: 6px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-submit-btn {
 | 
				
			||||||
 | 
					    display: inline-flex;
 | 
				
			||||||
 | 
					    appearance: none;
 | 
				
			||||||
 | 
					    -webkit-box-align: center;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    -webkit-box-pack: center;
 | 
				
			||||||
 | 
					    justify-content: center;
 | 
				
			||||||
 | 
					    -webkit-user-select: none;
 | 
				
			||||||
 | 
					    position: relative;
 | 
				
			||||||
 | 
					    white-space: nowrap;
 | 
				
			||||||
 | 
					    vertical-align: middle;
 | 
				
			||||||
 | 
					    outline-color: transparent;
 | 
				
			||||||
 | 
					    outline-style: solid;
 | 
				
			||||||
 | 
					    outline-width: 2px;
 | 
				
			||||||
 | 
					    outline-offset: 2px;
 | 
				
			||||||
 | 
					    line-height: 1.2;
 | 
				
			||||||
 | 
					    border-top-left-radius: 15px;
 | 
				
			||||||
 | 
					    border-top-right-radius: 15px;
 | 
				
			||||||
 | 
					    border-bottom-right-radius: 15px;
 | 
				
			||||||
 | 
					    border-bottom-left-radius: 15px;
 | 
				
			||||||
 | 
					    height: 45px;
 | 
				
			||||||
 | 
					    background-color:#4299E1;
 | 
				
			||||||
 | 
					    font-size: 15px;
 | 
				
			||||||
 | 
					    padding-inline-start: 16px;
 | 
				
			||||||
 | 
					    padding-inline-end: 16px;
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    margin-bottom: 20px;
 | 
				
			||||||
 | 
					    color: white;
 | 
				
			||||||
 | 
					    margin-top: 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.footer{
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: row;
 | 
				
			||||||
 | 
					  justify-content: left;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					  margin-left: 5%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hr.rounded {
 | 
				
			||||||
 | 
					  margin-top: 40px;
 | 
				
			||||||
 | 
					  margin-bottom: 0px;
 | 
				
			||||||
 | 
					  margin-left: 5%;
 | 
				
			||||||
 | 
					  margin-right: 5%;
 | 
				
			||||||
 | 
					  border-top: 1px solid #bbb;
 | 
				
			||||||
 | 
					  border-radius: 5px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
<div class="footer">
 | 
					<div class="footer">
 | 
				
			||||||
  <p>
 | 
					  <p>
 | 
				
			||||||
    For questions & support regarding this application, please contact us at
 | 
					    For questions & support regarding this application, please contact us at
 | 
				
			||||||
    <a href="mailto:tip-keys@arilia.com" target="_blank">tip-keys@arilia.com</a>.
 | 
					    <a href="mailto:${SUB_HELPER_EMAIL}" target="_blank">${SUB_HELPER_EMAIL}</a>.
 | 
				
			||||||
    For question regarding the Telecom Infra Project, please contact us at
 | 
					    For question regarding the Telecom Infra Project, please contact us at
 | 
				
			||||||
    <a href="mailto:info@telecominfraproject.com">
 | 
					    <a href="mailto:${GLOBAL_SUB_HELPER_EMAIL}">
 | 
				
			||||||
        info@telecominfraproject.com
 | 
					      ${GLOBAL_SUB_HELPER_EMAIL}
 | 
				
			||||||
    </a>.
 | 
					    </a>.
 | 
				
			||||||
  </p>
 | 
					  </p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
@@ -16,6 +16,7 @@
 | 
				
			|||||||
<div class="info-card">
 | 
					<div class="info-card">
 | 
				
			||||||
    <h2 class="info-title">Reset Password</h2>
 | 
					    <h2 class="info-title">Reset Password</h2>
 | 
				
			||||||
    <form action="/api/v1/actionLink?action=password_reset" method="post" onsubmit="return validatePassword()" class="form-container">
 | 
					    <form action="/api/v1/actionLink?action=password_reset" method="post" onsubmit="return validatePassword()" class="form-container">
 | 
				
			||||||
 | 
					        <input type="hidden" id="custId" name="id" value="${UUID}">
 | 
				
			||||||
        <div class="form-control">
 | 
					        <div class="form-control">
 | 
				
			||||||
            <label class="form-label" for="password1" ><b>New Password</b></label>
 | 
					            <label class="form-label" for="password1" ><b>New Password</b></label>
 | 
				
			||||||
            <input class="form-input" id="password1" type="password" placeholder="New password" name="password1" pattern="${PASSWORD_VALIDATION}" required>
 | 
					            <input class="form-input" id="password1" type="password" placeholder="New password" name="password1" pattern="${PASSWORD_VALIDATION}" required>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user