mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralsec.git
synced 2025-10-30 18:27:49 +00:00
Compare commits
13 Commits
v2.9.0-RC1
...
release/v2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aaebf74539 | ||
|
|
5a6baeca7d | ||
|
|
776ecabf81 | ||
|
|
5c6814852e | ||
|
|
90c700702e | ||
|
|
7c3ae1b5b9 | ||
|
|
15c2f6a4fc | ||
|
|
9d5855bc6e | ||
|
|
b7d72474da | ||
|
|
33650f5cea | ||
|
|
e8955454f7 | ||
|
|
6e0cf66008 | ||
|
|
6d305636a0 |
@@ -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: v2.9.0-RC1
|
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
|
||||||
|
|||||||
@@ -3092,6 +3092,20 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"metrics.wifi-scan": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"interval": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"verbose": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"information-elements": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"metrics.telemetry": {
|
"metrics.telemetry": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -3101,7 +3115,27 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"types": {
|
"types": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"ssh",
|
||||||
|
"health",
|
||||||
|
"health.dns",
|
||||||
|
"health.dhcp",
|
||||||
|
"health.radius",
|
||||||
|
"health.memory",
|
||||||
|
"client",
|
||||||
|
"client.join",
|
||||||
|
"client.leave",
|
||||||
|
"client.key-mismatch",
|
||||||
|
"wifi",
|
||||||
|
"wifi.start",
|
||||||
|
"wifi.stop",
|
||||||
|
"wired",
|
||||||
|
"wired.carrier-up",
|
||||||
|
"wired.carrier-down",
|
||||||
|
"unit",
|
||||||
|
"unit.boot-up"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3112,7 +3146,27 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"types": {
|
"types": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"ssh",
|
||||||
|
"health",
|
||||||
|
"health.dns",
|
||||||
|
"health.dhcp",
|
||||||
|
"health.radius",
|
||||||
|
"health.memory",
|
||||||
|
"client",
|
||||||
|
"client.join",
|
||||||
|
"client.leave",
|
||||||
|
"client.key-mismatch",
|
||||||
|
"wifi",
|
||||||
|
"wifi.start",
|
||||||
|
"wifi.stop",
|
||||||
|
"wired",
|
||||||
|
"wired.carrier-up",
|
||||||
|
"wired.carrier-down",
|
||||||
|
"unit",
|
||||||
|
"unit.boot-up"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3132,6 +3186,9 @@ static std::string DefaultUCentralSchema = R"foo(
|
|||||||
"dhcp-snooping": {
|
"dhcp-snooping": {
|
||||||
"$ref": "#/$defs/metrics.dhcp-snooping"
|
"$ref": "#/$defs/metrics.dhcp-snooping"
|
||||||
},
|
},
|
||||||
|
"wifi-scan": {
|
||||||
|
"$ref": "#/$defs/metrics.wifi-scan"
|
||||||
|
},
|
||||||
"telemetry": {
|
"telemetry": {
|
||||||
"$ref": "#/$defs/metrics.telemetry"
|
"$ref": "#/$defs/metrics.telemetry"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -483,6 +483,7 @@ namespace OpenWifi {
|
|||||||
Response->set("Content-Transfer-Encoding", "binary");
|
Response->set("Content-Transfer-Encoding", "binary");
|
||||||
Response->set("Accept-Ranges", "bytes");
|
Response->set("Accept-Ranges", "bytes");
|
||||||
}
|
}
|
||||||
|
Response->set("Access-Control-Expose-Headers", "Content-Disposition");
|
||||||
Response->set("Content-Disposition", "attachment; filename=" + Name);
|
Response->set("Content-Disposition", "attachment; filename=" + Name);
|
||||||
Response->set("Accept-Ranges", "bytes");
|
Response->set("Accept-Ranges", "bytes");
|
||||||
Response->set("Cache-Control", "no-store");
|
Response->set("Cache-Control", "no-store");
|
||||||
@@ -491,7 +492,7 @@ namespace OpenWifi {
|
|||||||
Response->sendFile(TempAvatar.path(), MT.ContentType);
|
Response->sendFile(TempAvatar.path(), MT.ContentType);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void SendFileContent(const std::string &Content, const std::string &Type,
|
inline void SendFileContent(const std::string &Content, [[maybe_unused]] const std::string &Type,
|
||||||
const std::string &Name) {
|
const std::string &Name) {
|
||||||
Response->setStatus(Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK);
|
Response->setStatus(Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK);
|
||||||
SetCommonHeaders();
|
SetCommonHeaders();
|
||||||
@@ -500,12 +501,13 @@ namespace OpenWifi {
|
|||||||
Response->set("Content-Transfer-Encoding", "binary");
|
Response->set("Content-Transfer-Encoding", "binary");
|
||||||
Response->set("Accept-Ranges", "bytes");
|
Response->set("Accept-Ranges", "bytes");
|
||||||
}
|
}
|
||||||
|
Response->set("Access-Control-Expose-Headers", "Content-Disposition");
|
||||||
Response->set("Content-Disposition", "attachment; filename=" + Name);
|
Response->set("Content-Disposition", "attachment; filename=" + Name);
|
||||||
Response->set("Accept-Ranges", "bytes");
|
Response->set("Accept-Ranges", "bytes");
|
||||||
Response->set("Cache-Control", "no-store");
|
Response->set("Cache-Control", "no-store");
|
||||||
Response->set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT");
|
Response->set("Expires", "Mon, 26 Jul 2027 05:00:00 GMT");
|
||||||
Response->setContentLength(Content.size());
|
Response->setContentLength(Content.size());
|
||||||
Response->setContentType(Type);
|
Response->setContentType(MT.ContentType);
|
||||||
auto &OutputStream = Response->send();
|
auto &OutputStream = Response->send();
|
||||||
OutputStream << Content;
|
OutputStream << Content;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -437,6 +441,15 @@ namespace OpenWifi::Utils {
|
|||||||
return MediaTypeEncoding{.Encoding = PLAIN, .ContentType = "text/css"};
|
return MediaTypeEncoding{.Encoding = PLAIN, .ContentType = "text/css"};
|
||||||
if (E == "js")
|
if (E == "js")
|
||||||
return MediaTypeEncoding{.Encoding = PLAIN, .ContentType = "application/javascript"};
|
return MediaTypeEncoding{.Encoding = PLAIN, .ContentType = "application/javascript"};
|
||||||
|
if (E == "pcap")
|
||||||
|
return MediaTypeEncoding{.Encoding = BINARY, .ContentType = "application/vnd.tcpdump.pcap"};
|
||||||
|
if (E == "txt")
|
||||||
|
return MediaTypeEncoding{.Encoding = PLAIN, .ContentType = "text/plain"};
|
||||||
|
if (E == "tgz")
|
||||||
|
return MediaTypeEncoding{.Encoding = BINARY, .ContentType = "application/tar+gzip"};
|
||||||
|
if (E == "gz" || E=="gzip")
|
||||||
|
return MediaTypeEncoding{.Encoding = BINARY, .ContentType = "application/gzip"};
|
||||||
|
|
||||||
return MediaTypeEncoding{.Encoding = BINARY, .ContentType = "application/octet-stream"};
|
return MediaTypeEncoding{.Encoding = BINARY, .ContentType = "application/octet-stream"};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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