· 5 years ago · Mar 12, 2021, 06:50 PM
1
2from colorama import Fore, Back
3
4# region for encryption
5from cryptography.fernet import Fernet
6from cryptography.hazmat.backends import default_backend
7from cryptography.hazmat.primitives import hashes
8from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
9# endregion
10
11# region db (original idea)
12import mysql.connector
13# endregion
14
15# region firebase connection
16# import firebase_admin
17# from firebase_admin import credentials
18# endregion
19
20# region flask
21from flask import *
22# endregion
23
24from os import system, name # clear the screen
25import base64
26import string
27import random
28import json
29# import socket
30
31# import os # might delete
32import datetime
33from datetime import timedelta
34import colorama
35import cryptography # not sure why it's showing that it's not being used
36
37# region debugging in terminals
38colorama.init(autoreset=True)
39RED = Fore.RED
40# endregion
41
42# initiate the flask web framework
43app = Flask(__name__)
44
45__creator__ = "Pombo Technologies"
46__version__ = 0.0002
47
48# region temporary
49# key for the session. just made it fun
50# app.secret_key = b"This is but something of secret value don't you dare try and see this."
51
52# maximum days to keep the session timer
53# app.permanent_session_lifetime = timedelta(days=30)
54
55# endregion
56
57try:
58 # 10.87.107.19 (66.228.52.158)
59 host_ip = "66.228.52.158"
60 db_user = "root"
61 db_psw = "Idon'tknowwhatelsetodoForP@ssword!inPomboMiami@20212020@$"
62 db_name = "Flow"
63 port = 3306
64 """
65 user='myuser',
66 password='mypassword',
67 host='localhost',
68 port='3306',
69 database='mydb'
70 """
71
72 mydb = mysql.connector.connect(
73 user=db_user,
74 password=db_psw,
75 host=host_ip,
76 port=port,
77 database=db_name,
78 auth_plugin="mysql_native_password"
79 )
80
81except Exception as e:
82 print(f"{Fore.GREEN} * error: {str(e)}")
83
84
85def insertNewUser(userEmail, password, date, apiKey): # TODO: Make this work first
86 try:
87 mycursor = mydb.cursor()
88
89 sql = "INSERT INTO `users`(`user-name`, `email`, `password`, `user-preference`, `date-created`, `api-key`) VALUES (%s, %s, %s, %s, %s, %s)"
90 val = (userEmail, userEmail, password, "", date, apiKey)
91 mycursor.execute(sql, val)
92
93 if mydb.commit():
94 return "New user created"
95 else:
96 return "error happened."
97
98 except Exception as e:
99 print(f"{RED} * error: {str(e)}")
100
101
102# endregion
103# region global variables
104# for encrypting into bytes
105FORMAT = "utf-8"
106
107firebase_user, firebase_password = "pombomiami@gmail.com", "pombo12345"
108
109firbase_url = "https://flow-29cce-default-rtdb.firebaseio.com/"
110
111
112# endregion
113
114# creating an user via post method
115
116
117@app.route('/api/createuser', methods=['POST', 'GET'])
118def createUSR():
119 try:
120 data = json.loads(request.data) # load incoming data
121
122 print(f"{Fore.GREEN} {data}")
123
124 # making sense of incoming json data
125 userEmail = data['email']
126 user_psw = data['password']
127
128 # region data
129 # userEmail = str(userEmail).strip()
130 # user_psw = str(user_psw).strip()
131
132 # encrypt
133 user_password = encrypt(user_psw)
134
135 date = get_Date() # setting the date of the creation of account
136 api_key = genAPIKey(200) # for accessing this api
137
138 if insertNewUser(userEmail, user_password, date, api_key):
139 return json.dumps(
140 {
141 "Server:": "Data received",
142 }
143 )
144
145 else:
146 return json.dumps(
147 {
148 "server:": "Data received not inserted"
149 }
150 )
151
152 # endregion
153
154 except Exception as e:
155 log(str(e)) # logging any known errors.
156 print(f"{RED} error: {str(e)}")
157
158
159# def firebaseConn(): # the firebase connection
160# try:
161# cred = credentials.Certificate(
162# "data/flow-29cce-firebase-adminsdk-s1w5y-b570abdf80.json")
163# firebase_admin.initialize_app(cred)
164# except Exception as e:
165# log(str(e)) # logging any known errors.
166# print(f"{RED} Error {str(e)}")
167
168
169# region usefull functions
170
171
172def RecoverAccountEmail(email): # using emails
173 pass
174
175
176def get_encryption_key(msg): # generate encryption key to encrypt lol
177 try:
178 # stripping any white spaces
179 password_provided = msg.strip()
180
181 # encoding into a byte
182 password = password_provided.encode(FORMAT)
183
184 # salt used to encrypt
185 salt = b"\xb9\x1f|}'S\xa1\x96\xeb\x154\x04\x88\xf3\xdf\x05"
186
187 # generating said key
188 kdf = PBKDF2HMAC(
189 algorithm=hashes.SHA256(),
190 length=32,
191 salt=salt,
192 iterations=100000,
193 backend=default_backend()
194 )
195
196 # encrypt it?
197 key = base64.urlsafe_b64encode(kdf.derive(password))
198
199 return key # this is the key that'll be used for encryption
200
201 except Exception as e:
202 print(f"Error: {str(e)}")
203
204
205def encrypt(data): # encrypt data
206 try:
207 # encrypt data
208 fernet = Fernet(get_encryption_key(data))
209 return fernet.encrypt(data)
210 except Exception as e:
211 print(f"error: {str(e)}")
212
213
214def decrypt(data): # decrypt
215 try:
216 # decrypt data
217 fernet = Fernet(get_encryption_key(data))
218 return fernet.decrypt(data)
219 except Exception as e:
220 print(f"error: {str(e)}")
221
222
223def get_time(): # get full 12 hour time
224 x = datetime.datetime.now()
225
226 hour = x.strftime("%I") # hour
227 min = x.strftime("%M") # minute
228 AMPM = x.strftime("%p") # am / pm
229
230 return f"{hour} : {min} : {AMPM}"
231
232
233def get_Date(): # get full date
234 return datetime.datetime.now().strftime("%x")
235
236
237def log(msg): # writing a .txt file with the errors in a list
238 # make this into an excel file or something more readable and user friendly
239 """
240 log number being written.
241 get the date and time
242 and showing the log
243 """
244 f = open("./err_log/log.txt", "a")
245 f.write(
246 f"\n________________________________\n" +
247 f" log id: {rnd(1000000)} \n" +
248 f"________________________________\n" +
249 f" date: {get_Date()} \n" +
250 f"________________________________\n" +
251 f" time: {get_time()} \n" +
252 f"________________________________\n" +
253 f" error log: {msg} \n" +
254 f"________________________________\n"
255 )
256 f.close()
257
258 print(f"{RED}Error logged into log.txt........")
259
260
261def genAPIKey(N): # generating the random api key and saving it with each user
262 return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
263
264
265def rnd(last): # random number generator for choosing 1
266 return random.randint(1, last)
267
268
269def cls():
270 # for windows
271 if name == 'nt':
272 _ = system('cls')
273
274 # for mac and linux(here, os.name is 'posix')
275 else:
276 _ = system('clear')
277
278# endregion
279
280
281def run(): # do not delete this
282 try:
283 # , host='0.0.0.0'
284 app.run(threaded=True, host='0.0.0.0', debug=True)
285 except Exception as e:
286 log(str(e)) # logging any known errors.
287 # print(f" * error: {str(e)}")
288
289# endregion
290
291
292if __name__ == '__main__': # the start of the api
293 run()
294