From b0f1ecbbe4d8028dcf63bf13c8d44d72f153b4f1 Mon Sep 17 00:00:00 2001
From: stephb9959
Date: Mon, 16 Jan 2023 22:31:36 -0800
Subject: [PATCH] https://telecominfraproject.atlassian.net/browse/WIFI-12094
Signed-off-by: stephb9959
---
src/RESTObjects/RESTAPI_CertObjects.cpp | 2 +
src/RESTObjects/RESTAPI_CertObjects.h | 1 +
src/SMTPMailerService.cpp | 14 +-
src/SMTPMailerService.h | 3 +-
src/framework/orm.h | 12 +-
src/framework/ow_constants.h | 8 +
src/framework/utils.cpp | 12 +
src/framework/utils.h | 3 +
templates/email_invitation.html | 8 +-
templates/email_verification.html | 6 +-
templates/password_reset.html | 6 +-
templates/signup_verification.html | 6 +-
templates/sub_email_verification.html | 527 ------------------
templates/sub_email_verification.txt | 9 -
templates/sub_password_reset.html | 523 -----------------
templates/sub_password_reset.txt | 9 -
templates/sub_verification_code.html | 515 -----------------
templates/sub_verification_code.txt | 10 -
templates/verification_code.html | 6 +-
wwwassets/404_error.html | 4 +-
wwwassets/access_policy.html | 4 +-
wwwassets/email_verification_error.html | 4 +-
wwwassets/email_verification_success.html | 4 +-
wwwassets/password_policy.html | 4 +-
wwwassets/password_reset.html | 4 +-
wwwassets/password_reset_error.html | 4 +-
wwwassets/password_reset_success.html | 4 +-
wwwassets/sub_404_error.css | 308 ++++++++++
wwwassets/sub_404_error.html | 4 +-
wwwassets/sub_access_policy.html | 4 +-
wwwassets/sub_email_verification_error.html | 4 +-
wwwassets/sub_email_verification_success.html | 4 +-
wwwassets/sub_password_policy.html | 4 +-
wwwassets/sub_password_reset.html | 4 +-
wwwassets/sub_password_reset_error.html | 4 +-
wwwassets/sub_password_reset_success.html | 4 +-
wwwassets/sub_signup_verification.html | 4 +-
wwwassets/sub_signup_verification_error.html | 4 +-
.../sub_signup_verification_success.html | 4 +-
39 files changed, 408 insertions(+), 1656 deletions(-)
diff --git a/src/RESTObjects/RESTAPI_CertObjects.cpp b/src/RESTObjects/RESTAPI_CertObjects.cpp
index 71ed5af..6b30005 100644
--- a/src/RESTObjects/RESTAPI_CertObjects.cpp
+++ b/src/RESTObjects/RESTAPI_CertObjects.cpp
@@ -30,6 +30,7 @@ namespace OpenWifi::CertObjects {
field_to_json(Obj,"revoked", revoked);
field_to_json(Obj,"revokeCount", revokeCount);
field_to_json(Obj,"synched", synched);
+ field_to_json(Obj,"expiryDate", expiryDate);
}
bool CertificateEntry::from_json(const Poco::JSON::Object::Ptr &Obj) {
@@ -54,6 +55,7 @@ namespace OpenWifi::CertObjects {
field_from_json(Obj,"revoked", revoked);
field_from_json(Obj,"revokeCount", revokeCount);
field_from_json(Obj,"synched", synched);
+ field_from_json(Obj,"expiryDate", expiryDate);
return true;
} catch (...) {
}
diff --git a/src/RESTObjects/RESTAPI_CertObjects.h b/src/RESTObjects/RESTAPI_CertObjects.h
index 29b902f..4baeafa 100644
--- a/src/RESTObjects/RESTAPI_CertObjects.h
+++ b/src/RESTObjects/RESTAPI_CertObjects.h
@@ -31,6 +31,7 @@ namespace OpenWifi::CertObjects {
uint64_t revoked = 0;
uint64_t revokeCount = 0;
uint64_t synched = 0;
+ uint64_t expiryDate = 0 ;
void to_json(Poco::JSON::Object &Obj) const;
bool from_json(const Poco::JSON::Object::Ptr &Obj);
diff --git a/src/SMTPMailerService.cpp b/src/SMTPMailerService.cpp
index 9572305..e29ec75 100644
--- a/src/SMTPMailerService.cpp
+++ b/src/SMTPMailerService.cpp
@@ -35,7 +35,8 @@ namespace OpenWifi {
MailAbandon_ = MicroServiceConfigGetInt("mailer.abandon",2*60*60);
UseHTML_ = MicroServiceConfigGetBool("mailer.html",false);
Enabled_ = (!MailHost_.empty() && !SenderLoginPassword_.empty() && !SenderLoginUserName_.empty());
- EmailLogo_ = TemplateDir_ + "/" + MicroServiceConfigGetString("mailer.logo","logo.png");
+ LogoFilename = AuthService()->GetLogoAssetURI();
+ SubLogoFilename = AuthService()->GetSubLogoAssetURI();
}
}
@@ -76,7 +77,6 @@ namespace OpenWifi {
Poco::Thread::trySleep(10000);
if(!Running_)
break;
-
{
std::lock_guard G(Mutex_);
Messages_.splice(Messages_.end(),PendingMessages_);
@@ -139,6 +139,7 @@ namespace OpenWifi {
Message->setSender( TheSender );
Message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, Recipient));
Message->setSubject(Msg.Attrs.find(SUBJECT)->second);
+ Message->setContentType("multipart/alternative");
poco_information(Logger(),fmt::format("Sending message to:{} from {}",Recipient,TheSender));
@@ -146,7 +147,7 @@ namespace OpenWifi {
std::string Content = Msg.Attrs.find(TEXT)->second;
Message->addContent(new Poco::Net::StringPartSource(Content));
} else {
- for(const auto &format:{"html","txt"}) {
+ for(const auto &format:{"txt","html"}) {
std::string Content = Utils::LoadFile(TemplateDir_ + Msg.TemplateName + "." + format );
Types::StringPairVec Variables;
FillVariables(Msg.Attrs, Variables);
@@ -156,8 +157,10 @@ namespace OpenWifi {
}
}
+ /*
auto Logo = Msg.Attrs.find(LOGO);
if(Logo!=Msg.Attrs.end()) {
+ std::cout << "... >" << Logo->second << std::endl;
try {
Poco::File LogoFile( Msg.Subscriber ? AuthService::GetSubLogoAssetFileName() : AuthService::GetLogoAssetFileName ());
std::ifstream IF(LogoFile.path());
@@ -168,6 +171,7 @@ namespace OpenWifi {
poco_warning(Logger(),fmt::format("Cannot add '{}' logo in email",AuthService::GetLogoAssetFileName()));
}
}
+ */
Poco::SharedPtr ptrHandler_ = new Poco::Net::AcceptCertificateHandler(false);
@@ -186,6 +190,10 @@ namespace OpenWifi {
SenderLoginUserName_,
SenderLoginPassword_
);
+/* std::ofstream of(MicroServiceDataDirectory()+"/message.txt",std::ios_base::out|std::ios_base::trunc);
+ Message->write(of);
+ of.close();
+*/
session.sendMessage(*Message);
session.close();
return MessageSendStatus::msg_sent;
diff --git a/src/SMTPMailerService.h b/src/SMTPMailerService.h
index d82906f..bf4d012 100644
--- a/src/SMTPMailerService.h
+++ b/src/SMTPMailerService.h
@@ -105,7 +105,8 @@ namespace OpenWifi {
std::atomic_bool Running_=false;
bool Enabled_=false;
bool UseHTML_=false;
- std::string EmailLogo_{"logo.png"};
+ std::string LogoFilename;
+ std::string SubLogoFilename;
SMTPMailerService() noexcept:
SubSystemServer("SMTPMailer", "MAILER-SVR", "smtpmailer")
diff --git a/src/framework/orm.h b/src/framework/orm.h
index 6b7604f..744cf1f 100644
--- a/src/framework/orm.h
+++ b/src/framework/orm.h
@@ -25,6 +25,8 @@
#include "Poco/StringTokenizer.h"
#include "StorageClass.h"
+#include "fmt/format.h"
+
namespace ORM {
enum FieldType {
@@ -149,12 +151,14 @@ namespace ORM {
Result += Escape(Value);
Result += "'";
}
- } else {
+ return WHERE_AND_(Result,args...);
+ } else if constexpr (std::is_arithmetic_v) {
if(!Result.empty())
Result += " and ";
Result += fieldName ;
Result += '=';
Result += std::to_string(Value);
+ return WHERE_AND_(Result,args...);
}
return WHERE_AND_(Result,args...);
}
@@ -483,15 +487,13 @@ namespace ORM {
return false;
}
- template bool GetRecordExt(RecordType & T , Args... args) {
+ bool GetRecord(RecordType & T , const std::string &WhereClause) {
try {
Poco::Data::Session Session = Pool_.get();
Poco::Data::Statement Select(Session);
RecordTuple RT;
- auto WhereClause = WHERE_AND(args...);
-
- std::string St = "select " + SelectFields_ + " from " + TableName_ + WhereClause + " limit 1";
+ std::string St = "select " + SelectFields_ + " from " + TableName_ + " where " + WhereClause + " limit 1";
Select << ConvertParams(St) ,
Poco::Data::Keywords::into(RT);
diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h
index ceaf163..e62ffcf 100644
--- a/src/framework/ow_constants.h
+++ b/src/framework/ow_constants.h
@@ -233,6 +233,14 @@ namespace OpenWifi::RESTAPI::Errors {
static const struct msg InvalidScriptSelection{1153,"Only script or scriptId must be specified. Not both."};
static const struct msg NoDeviceStatisticsYet{1154,"Device statistics not available yet."};
+ static const struct msg AccountSuspended{1155,"You account was suspended. You can only use this site in read-only mode for now."};
+ static const struct msg BatchNameAlreadyExists{1156,"Batch name must be unique."};
+ static const struct msg RedirectorNameIsInvalid{1157,"Redirector name is invalid."};
+ static const struct msg CertificateAlreadyBelongsToYou{1158,"The serial number already belongs to you. Please use the certificate modification API to change the redirector."};
+ static const struct msg RelocationDisabledForThisDevice{1159,"Relocation disabled for this device."};
+ static const struct msg CannotModifyServerCertificates{1160,"Server certificates cannot be modified."};
+
+
}
diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp
index 2b0e16f..a03f0a5 100644
--- a/src/framework/utils.cpp
+++ b/src/framework/utils.cpp
@@ -109,6 +109,11 @@ uint64_t MACToInt(const std::string &MAC) {
return Result;
}
+[[nodiscard]] bool ValidHostname(const std::string &Hostname) {
+ static std::regex HostNameRegex("^(?!-)[A-Za-z0-9-]+([\\-\\.]{1}[a-z0-9]+)*\\.[A-Za-z]{2,6}$");
+ return std::regex_match(Hostname,HostNameRegex);
+}
+
[[nodiscard]] std::string ToHex(const std::vector & B) {
std::string R;
R.reserve(B.size()*2);
@@ -560,4 +565,11 @@ bool ExtractBase64CompressedData(const std::string &CompressedData,
return false;
}
+ [[nodiscard]] std::uint64_t ConvertDate(const std::string &Date) {
+ Poco::DateTime DT;
+ int TZ;
+ Poco::DateTimeParser::parse(Poco::DateTimeFormat::ISO8601_FORMAT,Date,DT,TZ);
+ return DT.timestamp().epochTime();
+ }
+
}
diff --git a/src/framework/utils.h b/src/framework/utils.h
index b587837..7a8255a 100644
--- a/src/framework/utils.h
+++ b/src/framework/utils.h
@@ -73,6 +73,7 @@ namespace OpenWifi::Utils {
[[nodiscard]] bool ValidSerialNumber(const std::string &Serial);
[[nodiscard]] bool ValidUUID(const std::string &UUID);
+ [[nodiscard]] bool ValidHostname(const std::string &hostname);
template std::string ComputeHash(Args&&... args) {
Poco::SHA2Engine E;
@@ -121,6 +122,8 @@ namespace OpenWifi::Utils {
[[nodiscard]] std::string SanitizeToken(const std::string &Token);
[[nodiscard]] bool ValidateURI(const std::string &uri);
+ [[nodiscard]] std::uint64_t ConvertDate(const std::string &d);
+
template< typename T >
std::string int_to_hex( T i )
{
diff --git a/templates/email_invitation.html b/templates/email_invitation.html
index 330b661..e076cea 100644
--- a/templates/email_invitation.html
+++ b/templates/email_invitation.html
@@ -356,8 +356,8 @@
>
- Copyright 2022
+ Copyright 2023
Arilia Wireless Inc,
All rights reserved.
diff --git a/templates/email_verification.html b/templates/email_verification.html
index b3a025b..9f78bb2 100644
--- a/templates/email_verification.html
+++ b/templates/email_verification.html
@@ -356,8 +356,8 @@
>
- Copyright 2022
+ Copyright 2023
Arilia Wireless Inc,
All rights reserved.
diff --git a/templates/password_reset.html b/templates/password_reset.html
index 1377671..7e7be7b 100644
--- a/templates/password_reset.html
+++ b/templates/password_reset.html
@@ -356,8 +356,8 @@
>
- Copyright 2022
+ Copyright 2023
Arilia Wireless Inc,
All rights reserved.
diff --git a/templates/signup_verification.html b/templates/signup_verification.html
index f501ce1..3b9b538 100644
--- a/templates/signup_verification.html
+++ b/templates/signup_verification.html
@@ -356,8 +356,8 @@
>
- Copyright 2022
+ Copyright 2023
Arilia Wireless Inc,
All rights reserved.
diff --git a/templates/sub_email_verification.html b/templates/sub_email_verification.html
index 85864a7..e69de29 100644
--- a/templates/sub_email_verification.html
+++ b/templates/sub_email_verification.html
@@ -1,527 +0,0 @@
-
-
- Email Confirmation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Confirm Your Email Address
- to Get Started
-
-
-
-
-
- Dear ${RECIPIENT_EMAIL} ,
-
- Before you can access the
- system, you must validate
- your e-mail address. Please
- click on the button below to
- complete this task.
-
-
-
-
-
- Confirm Email Address
-
-
-
-
-
-
-
-
-
-
- For questions & support
- regarding this application,
- please contact us at
-
- tip-keys@arilia.com
-
- . For question regarding the
- Telecom Infra Project,
- please contact us at
-
- info@telecominfraproject.com
-
- .
-
-
-
-
-
-
- Thank You!
- Arilia Wireless Inc.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/templates/sub_email_verification.txt b/templates/sub_email_verification.txt
index f251762..e69de29 100644
--- a/templates/sub_email_verification.txt
+++ b/templates/sub_email_verification.txt
@@ -1,9 +0,0 @@
-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!
\ No newline at end of file
diff --git a/templates/sub_password_reset.html b/templates/sub_password_reset.html
index 27afa52..e69de29 100644
--- a/templates/sub_password_reset.html
+++ b/templates/sub_password_reset.html
@@ -1,523 +0,0 @@
-
-
- Password Reset
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Password Reset
-
-
-
-
- Dear ${RECIPIENT_EMAIL} ,
-
- You have requested us to
- reset your password. Please
- click on the link below and
- follow the instructions.
-
-
-
-
-
- Reset Password
-
-
-
-
-
-
-
-
-
-
- For questions & support
- regarding this application,
- please contact us at
-
- tip-keys@arilia.com
-
- . For question regarding the
- Telecom Infra Project,
- please contact us at
-
- info@telecominfraproject.com
-
- .
-
-
-
-
-
-
- Thank You!
- Arilia Wireless Inc.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/templates/sub_password_reset.txt b/templates/sub_password_reset.txt
index 7b3f964..e69de29 100644
--- a/templates/sub_password_reset.txt
+++ b/templates/sub_password_reset.txt
@@ -1,9 +0,0 @@
-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!
\ No newline at end of file
diff --git a/templates/sub_verification_code.html b/templates/sub_verification_code.html
index 3cefde8..e69de29 100644
--- a/templates/sub_verification_code.html
+++ b/templates/sub_verification_code.html
@@ -1,515 +0,0 @@
-
-
- Verification Code
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Your Login Validation Code
-
-
-
-
- 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.
-
-
-
-
-
-
-
-
-
-
-
-
- For questions & support
- regarding this application,
- please contact us at
-
- tip-keys@arilia.com
-
- . For question regarding the
- Telecom Infra Project,
- please contact us at
-
- info@telecominfraproject.com
-
- .
-
-
-
-
-
-
- Thank You!
- Arilia Wireless Inc.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/templates/sub_verification_code.txt b/templates/sub_verification_code.txt
index 51551eb..e69de29 100644
--- a/templates/sub_verification_code.txt
+++ b/templates/sub_verification_code.txt
@@ -1,10 +0,0 @@
-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!
\ No newline at end of file
diff --git a/templates/verification_code.html b/templates/verification_code.html
index 97aa829..f7f95bb 100644
--- a/templates/verification_code.html
+++ b/templates/verification_code.html
@@ -356,8 +356,8 @@
>
- Copyright 2022
+ Copyright 2023
Arilia Wireless Inc,
All rights reserved.
diff --git a/wwwassets/404_error.html b/wwwassets/404_error.html
index 32fa22c..c1b6cb6 100644
--- a/wwwassets/404_error.html
+++ b/wwwassets/404_error.html
@@ -3,11 +3,11 @@
Whoops!
-
+
-
+
diff --git a/wwwassets/access_policy.html b/wwwassets/access_policy.html
index 3b33204..392616d 100644
--- a/wwwassets/access_policy.html
+++ b/wwwassets/access_policy.html
@@ -3,13 +3,13 @@
Access Policy
-
+
diff --git a/wwwassets/email_verification_error.html b/wwwassets/email_verification_error.html
index 0fc553c..4aa9341 100644
--- a/wwwassets/email_verification_error.html
+++ b/wwwassets/email_verification_error.html
@@ -3,13 +3,13 @@
Email Verification Error
-
+
diff --git a/wwwassets/email_verification_success.html b/wwwassets/email_verification_success.html
index 6468858..c47b322 100644
--- a/wwwassets/email_verification_success.html
+++ b/wwwassets/email_verification_success.html
@@ -3,13 +3,13 @@
Email Validated!
-
+
diff --git a/wwwassets/password_policy.html b/wwwassets/password_policy.html
index 8d2374a..6dc4e62 100644
--- a/wwwassets/password_policy.html
+++ b/wwwassets/password_policy.html
@@ -3,13 +3,13 @@
Password Policy
-
+
diff --git a/wwwassets/password_reset.html b/wwwassets/password_reset.html
index 9265a71..c8b2eeb 100644
--- a/wwwassets/password_reset.html
+++ b/wwwassets/password_reset.html
@@ -3,13 +3,13 @@
Reset Password
-
+
diff --git a/wwwassets/password_reset_error.html b/wwwassets/password_reset_error.html
index 1fe6bb2..4014b6f 100644
--- a/wwwassets/password_reset_error.html
+++ b/wwwassets/password_reset_error.html
@@ -3,13 +3,13 @@
Reset Password Error
-
+
diff --git a/wwwassets/password_reset_success.html b/wwwassets/password_reset_success.html
index c640b58..ec363be 100644
--- a/wwwassets/password_reset_success.html
+++ b/wwwassets/password_reset_success.html
@@ -3,13 +3,13 @@
Reset Password Success
-
+
diff --git a/wwwassets/sub_404_error.css b/wwwassets/sub_404_error.css
index e69de29..2b73a37 100644
--- a/wwwassets/sub_404_error.css
+++ b/wwwassets/sub_404_error.css
@@ -0,0 +1,308 @@
+@import url(https://fonts.googleapis.com/css?family=Ubuntu);
+html, body {
+ font-family: "Ubuntu";
+}
+
+* {
+ box-sizing: border-box;
+}
+
+
+.box {
+ width: 350px;
+ height: 100%;
+ max-height: 600px;
+ min-height: 450px;
+ background: #332F63;
+ border-radius: 20px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ padding: 30px 50px;
+}
+.box .box__ghost {
+ padding: 15px 25px 25px;
+ position: absolute;
+ left: 50%;
+ top: 20%;
+ transform: translate(-50%, -30%);
+}
+
+.logo-box {
+ width: 100%;
+ text-align: center;
+ display: flex;
+ justify-content: center;
+}
+.logo-img {
+ width: 100%;
+ height: 100%;
+ max-height: 120px;
+ margin-left:15px;
+ margin-top: 10px;
+ object-fit: contain;
+}
+.box .box__ghost .symbol:nth-child(1) {
+ opacity: 0.2;
+ animation: shine 4s ease-in-out 3s infinite;
+}
+.box .box__ghost .symbol:nth-child(1):before, .box .box__ghost .symbol:nth-child(1):after {
+ content: "";
+ width: 12px;
+ height: 4px;
+ background: #fff;
+ position: absolute;
+ border-radius: 5px;
+ bottom: 65px;
+ left: 0;
+}
+.box .box__ghost .symbol:nth-child(1):before {
+ transform: rotate(45deg);
+}
+.box .box__ghost .symbol:nth-child(1):after {
+ transform: rotate(-45deg);
+}
+.box .box__ghost .symbol:nth-child(2) {
+ position: absolute;
+ left: -5px;
+ top: 30px;
+ height: 18px;
+ width: 18px;
+ border: 4px solid;
+ border-radius: 50%;
+ border-color: #fff;
+ opacity: 0.2;
+ animation: shine 4s ease-in-out 1.3s infinite;
+}
+.box .box__ghost .symbol:nth-child(3) {
+ opacity: 0.2;
+ animation: shine 3s ease-in-out 0.5s infinite;
+}
+.box .box__ghost .symbol:nth-child(3):before, .box .box__ghost .symbol:nth-child(3):after {
+ content: "";
+ width: 12px;
+ height: 4px;
+ background: #fff;
+ position: absolute;
+ border-radius: 5px;
+ top: 5px;
+ left: 40px;
+}
+.box .box__ghost .symbol:nth-child(3):before {
+ transform: rotate(90deg);
+}
+.box .box__ghost .symbol:nth-child(3):after {
+ transform: rotate(180deg);
+}
+.box .box__ghost .symbol:nth-child(4) {
+ opacity: 0.2;
+ animation: shine 6s ease-in-out 1.6s infinite;
+}
+.box .box__ghost .symbol:nth-child(4):before, .box .box__ghost .symbol:nth-child(4):after {
+ content: "";
+ width: 15px;
+ height: 4px;
+ background: #fff;
+ position: absolute;
+ border-radius: 5px;
+ top: 10px;
+ right: 30px;
+}
+.box .box__ghost .symbol:nth-child(4):before {
+ transform: rotate(45deg);
+}
+.box .box__ghost .symbol:nth-child(4):after {
+ transform: rotate(-45deg);
+}
+.box .box__ghost .symbol:nth-child(5) {
+ position: absolute;
+ right: 5px;
+ top: 40px;
+ height: 12px;
+ width: 12px;
+ border: 3px solid;
+ border-radius: 50%;
+ border-color: #fff;
+ opacity: 0.2;
+ animation: shine 1.7s ease-in-out 7s infinite;
+}
+.box .box__ghost .symbol:nth-child(6) {
+ opacity: 0.2;
+ animation: shine 2s ease-in-out 6s infinite;
+}
+.box .box__ghost .symbol:nth-child(6):before, .box .box__ghost .symbol:nth-child(6):after {
+ content: "";
+ width: 15px;
+ height: 4px;
+ background: #fff;
+ position: absolute;
+ border-radius: 5px;
+ bottom: 65px;
+ right: -5px;
+}
+.box .box__ghost .symbol:nth-child(6):before {
+ transform: rotate(90deg);
+}
+.box .box__ghost .symbol:nth-child(6):after {
+ transform: rotate(180deg);
+}
+.box .box__ghost .box__ghost-container {
+ background: #fff;
+ width: 100px;
+ height: 100px;
+ border-radius: 100px 100px 0 0;
+ position: relative;
+ margin: 0 auto;
+ animation: upndown 3s ease-in-out infinite;
+}
+.box .box__ghost .box__ghost-container .box__ghost-eyes {
+ position: absolute;
+ left: 50%;
+ top: 45%;
+ height: 12px;
+ width: 70px;
+}
+.box .box__ghost .box__ghost-container .box__ghost-eyes .box__eye-left {
+ width: 12px;
+ height: 12px;
+ background: #332F63;
+ border-radius: 50%;
+ margin: 0 10px;
+ position: absolute;
+ left: 0;
+}
+.box .box__ghost .box__ghost-container .box__ghost-eyes .box__eye-right {
+ width: 12px;
+ height: 12px;
+ background: #332F63;
+ border-radius: 50%;
+ margin: 0 10px;
+ position: absolute;
+ right: 0;
+}
+.box .box__ghost .box__ghost-container .box__ghost-bottom {
+ display: flex;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+}
+.box .box__ghost .box__ghost-container .box__ghost-bottom div {
+ flex-grow: 1;
+ position: relative;
+ top: -10px;
+ height: 20px;
+ border-radius: 100%;
+ background-color: #fff;
+}
+.box .box__ghost .box__ghost-container .box__ghost-bottom div:nth-child(2n) {
+ top: -12px;
+ margin: 0 0px;
+ border-top: 15px solid #332F63;
+ background: transparent;
+}
+.box .box__ghost .box__ghost-shadow {
+ height: 20px;
+ box-shadow: 0 50px 15px 5px #3B3769;
+ border-radius: 50%;
+ margin: 0 auto;
+ animation: smallnbig 3s ease-in-out infinite;
+}
+.box .box__description {
+ position: absolute;
+ bottom: 30px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+.box .box__description .box__description-container {
+ color: #fff;
+ text-align: left;
+ width: 200px;
+ font-size: 16px;
+ margin: 0 auto;
+}
+.box .box__description .box__description-container .box__description-title {
+ font-size: 24px;
+ letter-spacing: 0.5px;
+}
+.box .box__description .box__description-container .box__description-text {
+ color: #8C8AA7;
+ line-height: 20px;
+ margin-top: 20px;
+}
+.box .box__description .box__button {
+ display: block;
+ position: relative;
+ background: #FF5E65;
+ border: 1px solid transparent;
+ border-radius: 50px;
+ height: 50px;
+ text-align: center;
+ text-decoration: none;
+ color: #fff;
+ line-height: 50px;
+ font-size: 18px;
+ padding: 0 70px;
+ white-space: nowrap;
+ margin-top: 25px;
+ transition: background 0.5s ease;
+ overflow: hidden;
+ -webkit-mask-image: -webkit-radial-gradient(white, black);
+}
+.box .box__description .box__button:before {
+ content: "";
+ position: absolute;
+ width: 20px;
+ height: 100px;
+ background: #fff;
+ bottom: -25px;
+ left: 0;
+ border: 2px solid #fff;
+ transform: translateX(-50px) rotate(45deg);
+ transition: transform 0.5s ease;
+}
+.box .box__description .box__button:hover {
+ background: transparent;
+ border-color: #fff;
+}
+.box .box__description .box__button:hover:before {
+ transform: translateX(250px) rotate(45deg);
+}
+
+@keyframes upndown {
+ 0% {
+ transform: translateY(5px);
+ }
+ 50% {
+ transform: translateY(15px);
+ }
+ 100% {
+ transform: translateY(5px);
+ }
+}
+@keyframes smallnbig {
+ 0% {
+ width: 90px;
+ }
+ 50% {
+ width: 100px;
+ }
+ 100% {
+ width: 90px;
+ }
+}
+@keyframes shine {
+ 0% {
+ opacity: 0.2;
+ }
+ 25% {
+ opacity: 0.1;
+ }
+ 50% {
+ opacity: 0.2;
+ }
+ 100% {
+ opacity: 0.2;
+ }
+}
\ No newline at end of file
diff --git a/wwwassets/sub_404_error.html b/wwwassets/sub_404_error.html
index 931b49d..d714ca7 100644
--- a/wwwassets/sub_404_error.html
+++ b/wwwassets/sub_404_error.html
@@ -3,7 +3,7 @@
Whoops!
-
+
@@ -38,7 +38,7 @@
So we'll just assume one of them got
fed up and refused to help you...
If you get this again, we need to know. We need to let that thing know who's the boss...
-
+
diff --git a/wwwassets/sub_access_policy.html b/wwwassets/sub_access_policy.html
index 7a06665..2456e78 100644
--- a/wwwassets/sub_access_policy.html
+++ b/wwwassets/sub_access_policy.html
@@ -3,13 +3,13 @@
Access Policy
-
+
diff --git a/wwwassets/sub_email_verification_error.html b/wwwassets/sub_email_verification_error.html
index fb83a82..bf0b2fb 100644
--- a/wwwassets/sub_email_verification_error.html
+++ b/wwwassets/sub_email_verification_error.html
@@ -3,13 +3,13 @@
Email Verification Error
-
+
diff --git a/wwwassets/sub_email_verification_success.html b/wwwassets/sub_email_verification_success.html
index 16775cc..b87878b 100644
--- a/wwwassets/sub_email_verification_success.html
+++ b/wwwassets/sub_email_verification_success.html
@@ -3,13 +3,13 @@
Email Validated!
-
+
diff --git a/wwwassets/sub_password_policy.html b/wwwassets/sub_password_policy.html
index d3f1444..390e07b 100644
--- a/wwwassets/sub_password_policy.html
+++ b/wwwassets/sub_password_policy.html
@@ -3,13 +3,13 @@
Password Policy
-
+
diff --git a/wwwassets/sub_password_reset.html b/wwwassets/sub_password_reset.html
index 4760889..322e726 100644
--- a/wwwassets/sub_password_reset.html
+++ b/wwwassets/sub_password_reset.html
@@ -3,13 +3,13 @@
Reset Password
-
+
diff --git a/wwwassets/sub_password_reset_error.html b/wwwassets/sub_password_reset_error.html
index 20eab41..a619f2c 100644
--- a/wwwassets/sub_password_reset_error.html
+++ b/wwwassets/sub_password_reset_error.html
@@ -3,13 +3,13 @@
Reset Password Error
-
+
diff --git a/wwwassets/sub_password_reset_success.html b/wwwassets/sub_password_reset_success.html
index 55c42d0..85707a2 100644
--- a/wwwassets/sub_password_reset_success.html
+++ b/wwwassets/sub_password_reset_success.html
@@ -3,13 +3,13 @@
Reset Password Success
-
+
diff --git a/wwwassets/sub_signup_verification.html b/wwwassets/sub_signup_verification.html
index b300881..8360e60 100644
--- a/wwwassets/sub_signup_verification.html
+++ b/wwwassets/sub_signup_verification.html
@@ -3,13 +3,13 @@
Signup Completion
-
+
diff --git a/wwwassets/sub_signup_verification_error.html b/wwwassets/sub_signup_verification_error.html
index b100afc..5a4c812 100644
--- a/wwwassets/sub_signup_verification_error.html
+++ b/wwwassets/sub_signup_verification_error.html
@@ -3,13 +3,13 @@
Signup Completion Error
-
+
diff --git a/wwwassets/sub_signup_verification_success.html b/wwwassets/sub_signup_verification_success.html
index 21e5e11..1023f33 100644
--- a/wwwassets/sub_signup_verification_success.html
+++ b/wwwassets/sub_signup_verification_success.html
@@ -3,13 +3,13 @@
Signup Completed!
-
+