137 lines
7.1 KiB
Python
137 lines
7.1 KiB
Python
|
import mysql.connector as mariadb
|
||
|
from mako.template import Template
|
||
|
from bottle import request
|
||
|
|
||
|
from config import database, globalvar
|
||
|
|
||
|
import bcrypt
|
||
|
import datetime
|
||
|
|
||
|
from scripts import loggorilla, saltedkey, googly, tokenguard, sendwave
|
||
|
|
||
|
import procedure.validation as procedure_validation
|
||
|
import procedure.webmail as procedure_webmail
|
||
|
|
||
|
class auth:
|
||
|
|
||
|
def __init__(self):
|
||
|
self.db_main = mariadb.connect(**database.db_main)
|
||
|
self.cursor = self.db_main.cursor(dictionary=True)
|
||
|
self.smtpconfig = globalvar.smtpconfig
|
||
|
|
||
|
def register(self, params):
|
||
|
APIADDR = "/api/auth/registration/register/:roles"
|
||
|
loggorilla.prcss(APIADDR, "Define parameters")
|
||
|
response = {}
|
||
|
captcha = params["captcha" ]
|
||
|
username = params["username" ].lower()
|
||
|
email = params["email" ].lower()
|
||
|
password = params["password" ]
|
||
|
roles = params["roles" ]
|
||
|
self.cursor.execute("BEGIN;")
|
||
|
try:
|
||
|
loggorilla.prcss(APIADDR, "Get dependency data")
|
||
|
self.cursor.execute(f"SELECT id, name FROM `auth_roles` WHERE auth_roles.name = %s ; ", (roles,) )
|
||
|
result_roles = self.cursor.fetchone()
|
||
|
loggorilla.prcss(APIADDR, "Process parameters")
|
||
|
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
|
||
|
token = saltedkey.token(username, hashed)
|
||
|
if globalvar.production == True:
|
||
|
captcha_r = googly.recaptcha(captcha, globalvar.reCAPTCHA['server'])
|
||
|
score = captcha_r["score"]
|
||
|
else:
|
||
|
captcha_r = 'dev mode'
|
||
|
score = 0.9
|
||
|
loggorilla.fyinf(APIADDR, f'captcha_r : {captcha_r}')
|
||
|
loggorilla.fyinf(APIADDR, f'score : {score}')
|
||
|
|
||
|
loggorilla.prcss(APIADDR, "Validation")
|
||
|
result_validation = procedure_validation.validation().register(APIADDR, captcha, score, roles, username, password, email)
|
||
|
if result_validation['status'] == "valid":
|
||
|
loggorilla.prcss(APIADDR, "Inserting")
|
||
|
self.cursor.execute("INSERT INTO `auth` VALUES (%s, %s);", (token, hashed) )
|
||
|
self.cursor.execute("INSERT INTO `auth_profile` VALUES (DEFAULT, %s, %s, %s, NULL);", (token, username, email) )
|
||
|
auth_profile_lastrowid = self.cursor.lastrowid
|
||
|
self.cursor.execute("INSERT INTO `auth_profile_verification` VALUES (DEFAULT, %s, 'email', 0);", (auth_profile_lastrowid,) )
|
||
|
self.cursor.execute("INSERT INTO `auth_profile_roles` VALUES (DEFAULT, %s, %s);", (auth_profile_lastrowid, result_roles['id']) )
|
||
|
loggorilla.prcss(APIADDR, "Generate URL")
|
||
|
expired = globalvar.verification_link_expiration
|
||
|
expired_isoformat = expired.isoformat()
|
||
|
payload = {
|
||
|
"token" : token,
|
||
|
"expired": expired_isoformat
|
||
|
}
|
||
|
token_encrypt = tokenguard.encode(payload, globalvar.ssh['key']['private'], globalvar.ssh['passphrase'])
|
||
|
verification_url = globalvar.verification_url(token_encrypt)
|
||
|
notme_url = globalvar.notme_url(token_encrypt)
|
||
|
loggorilla.prcss(APIADDR, "Sending email")
|
||
|
webmail_data = {"verify": verification_url, "notme": notme_url}
|
||
|
result_webmail = procedure_webmail.webmail().verification(APIADDR, params, webmail_data)
|
||
|
self.smtpconfig['to' ] = email
|
||
|
self.smtpconfig['subject' ] = result_webmail['subject']
|
||
|
self.smtpconfig['text' ] = result_webmail['text' ]
|
||
|
self.smtpconfig['html' ] = result_webmail['html' ]
|
||
|
sendwave.smtp(self.smtpconfig)
|
||
|
loggorilla.prcss(APIADDR, "Giving response")
|
||
|
response["status" ] = "success"
|
||
|
response["desc" ] = "Register success. Check email for verification."
|
||
|
response["data" ] = {
|
||
|
"recaptcha":captcha_r
|
||
|
}
|
||
|
else:
|
||
|
response = result_validation
|
||
|
except Exception as e:
|
||
|
self.cursor.execute("ROLLBACK;")
|
||
|
loggorilla.error(APIADDR, str(e) )
|
||
|
response["status" ] = "failed"
|
||
|
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
|
||
|
finally:
|
||
|
self.cursor.execute("COMMIT;")
|
||
|
self.cursor.close()
|
||
|
self.db_main.close()
|
||
|
return response
|
||
|
|
||
|
def resend(self, params):
|
||
|
APIADDR = "/api/auth/registration/resend"
|
||
|
loggorilla.prcss(APIADDR, "Define parameters")
|
||
|
response = {}
|
||
|
email = params["email"].lower()
|
||
|
try:
|
||
|
loggorilla.prcss(APIADDR, "Get data for checking")
|
||
|
self.cursor.execute(f"SELECT COUNT(*) AS `count`, auth_profile.token, auth_profile.email FROM auth_profile_verification INNER JOIN auth_profile ON auth_profile.id = auth_profile_verification.profile WHERE auth_profile.email = %s AND auth_profile_verification.type = 'email' AND auth_profile_verification.verified = 0 ; ", (email,) )
|
||
|
result_unverified = self.cursor.fetchone()
|
||
|
token = result_unverified["token"].decode()
|
||
|
if result_unverified["count"] >= 1:
|
||
|
loggorilla.prcss(APIADDR, "Generate URL")
|
||
|
expired = globalvar.verification_link_expiration
|
||
|
expired_isoformat = expired.isoformat()
|
||
|
payload = {
|
||
|
"token" : token,
|
||
|
"expired": expired_isoformat
|
||
|
}
|
||
|
token_encrypt = tokenguard.encode(payload, globalvar.ssh['key']['private'], globalvar.ssh['passphrase'])
|
||
|
verification_url = globalvar.verification_url(token_encrypt)
|
||
|
notme_url = globalvar.notme_url(token_encrypt)
|
||
|
loggorilla.prcss(APIADDR, "Sending email")
|
||
|
webmail_data = {"verify": verification_url, "notme": notme_url}
|
||
|
result_webmail = procedure_webmail.webmail().verification(APIADDR, params, webmail_data)
|
||
|
self.smtpconfig['to' ] = email
|
||
|
self.smtpconfig['subject' ] = result_webmail['subject']
|
||
|
self.smtpconfig['text' ] = result_webmail['text' ]
|
||
|
self.smtpconfig['html' ] = result_webmail['html' ]
|
||
|
sendwave.smtp(self.smtpconfig)
|
||
|
loggorilla.prcss(APIADDR, "Giving response")
|
||
|
response["status" ] = "success"
|
||
|
response["desc" ] = "Resend success. Check email for verification."
|
||
|
else:
|
||
|
response["status" ] = "failed"
|
||
|
response["desc" ] = "The parameters seems suspicious and you are not authorized for that"
|
||
|
except Exception as e:
|
||
|
loggorilla.error(APIADDR, str(e) )
|
||
|
response["status" ] = "failed"
|
||
|
response["desc" ] = "Internal Server Error. Please contact us if you still have an error. for detail"
|
||
|
finally:
|
||
|
self.cursor.close()
|
||
|
self.db_main.close()
|
||
|
return response
|