Skip to content

Commit 243766e

Browse files
author
Mark Charlton
committed
Wk 10 done
1 parent 64cf162 commit 243766e

9 files changed

+130
-23
lines changed

Assessment/Wk10/security_checker.py

Lines changed: 60 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import json
88
import time
99
import sys
10+
import getpass as gp
1011

1112
sys.path.append(os.path.abspath('..\\inc\\'))
1213

@@ -27,18 +28,33 @@ class User:
2728
loggedin = 0
2829

2930
def __init__(self, username):
30-
self.username=username
31+
self.username=username.upper()
3132
if username in a_users.keys():
3233
self.passwordhash=a_users[username]
3334
else:
3435
self.passwordhash=""
3536

36-
if username in a_lockout.keys():
37-
if time.time() < a_lockout[username]["r"]:
37+
if self.username in a_lockout.keys():
38+
self.lockouts= a_lockout[self.username]["a"]
39+
if time.time() < a_lockout[self.username]["r"]:
3840
self.locked=1
39-
self.lockout_release = a_lockout[username]["r"]
40-
self.lockouts= a_lockout[username]["a"]
41+
self.lockout_release = a_lockout[self.username]["r"]
4142

43+
def __str__(self):
44+
ret_str=""
45+
ret_str += "User: " + self.username + "\n"
46+
if self.passwordhash == "":
47+
ret_str += "Password: <not set>\n"
48+
else:
49+
ret_str += "Password: <set>\n"
50+
if self.locked == 1:
51+
ret_str += f"{s.REDON}Account is locked out until {self.lockout_release_str()}{s.COLOUROFF}\n"
52+
ret_str += f"Account has been locked out {self.lockouts} times.\n"
53+
else:
54+
ret_str += f'Account is unlocked and active\n'
55+
return ret_str
56+
57+
4258

4359
def check_password_complexity(self, password):
4460
valid_pass = 1
@@ -50,11 +66,11 @@ def check_password_complexity(self, password):
5066
valid_pass = 0
5167
if self.allow_spaces == 0:
5268
if " " in password:
53-
s_err += f"* No spaces"
69+
s_err += f"* No spaces\n"
5470
valid_pass = 0
5571
if self.allow_leading_number == 0:
5672
if password[0].isdigit():
57-
s_err += f"* Cannot begin with a number"
73+
s_err += f"* Cannot begin with a number\n"
5874
valid_pass = 0
5975
except:
6076
pass
@@ -80,8 +96,7 @@ def hash_password(self,password):
8096
def verify_password(self,provided_password):
8197
f_return = False
8298
if self.is_locked_out():
83-
t_release = time.strftime("%d/%m/%Y %H:%M:%S", time.gmtime(self.lockout_release))
84-
print ( f"Sorry your account is locked out until {t_release}.\nPlease try again later")
99+
print ( f"{s.REDON}Sorry your account is locked out until {self.lockout_release_str()}{s.COLOUROFF}.\nPlease try again later")
85100
else:
86101
salt = self.passwordhash[:64]
87102
pwdhash = hashlib.pbkdf2_hmac('sha512',
@@ -94,7 +109,7 @@ def verify_password(self,provided_password):
94109
if f_return==True:
95110
self.loggedin = 1
96111
elif f_return == False:
97-
print ( "Sorry that username / password combination wasn't recognised. \nPlease try again")
112+
print ( f"{s.REDON}Sorry that username / password combination wasn't recognised.{s.COLOUROFF} \nPlease try again")
98113
self.attempts += 1
99114
if self.attempts >= self.attempt_limit:
100115
# reset attempts
@@ -109,6 +124,9 @@ def verify_password(self,provided_password):
109124

110125
return f_return
111126

127+
def lockout_release_str(self):
128+
return time.strftime("%d/%m/%Y %H:%M:%S", time.gmtime(self.lockout_release))
129+
112130
def is_locked_out(self):
113131
f_locked=0
114132
if self.locked == 1:
@@ -151,20 +169,22 @@ def write_file():
151169
#print (a_users)
152170

153171
while True:
154-
print ( "Password Verifier 2000 " )
172+
print ( f"\n\n{s.ORANGEON}Password Verifier 2000{s.COLOUROFF}" )
155173
print ( "-----------------------")
156174
print ( "1. New User" )
157175
print ( "2. Existing User" )
158176
print ( "3. Print Users" )
177+
print ( "4. Dump Current User Object" )
159178
print ( "0. Exit" )
160179
print ( "-----------------------")
161180
print ( "" )
162-
i_menu = h.get_int("Please enter your selection",1,3)
181+
i_menu = h.get_int("Please enter your selection",1,4)
163182

164183
if i_menu == 0:
184+
print ( f"\nThank you for using {s.ORANGEON}Password Verifier 2000{s.COLOUROFF}\n" )
165185
break
166186
elif i_menu == 1:
167-
s_usr = input( "Please enter your username [Enter to quit]: ")
187+
s_usr = input( "Please enter your username [Enter to quit]: ").upper()
168188
if s_usr=="":
169189
break
170190

@@ -177,10 +197,10 @@ def write_file():
177197

178198
while True:
179199
print ( f"Please enter a password for new user {s_usr}")
180-
s_p_1 = input ( "Please enter the new password: ")
200+
s_p_1 = gp.getpass ( "Please enter the new password [Enter to abort]: ")
181201
if s_p_1 == "":
182202
break
183-
s_p_2 = input ( "Please re-enter the new password: ")
203+
s_p_2 = gp.getpass ( "Please re-enter the new password: ")
184204

185205
if s_p_1 == s_p_2:
186206
if usr.check_password_complexity(s_p_1) == 1:
@@ -196,14 +216,15 @@ def write_file():
196216
print (f"{s.REDON}Passwords do not match.{s.COLOUROFF}\nPlease try again")
197217
elif i_menu == 2:
198218

199-
s_usr = input( "Please enter your username [Enter to quit]: ")
219+
s_usr = input( "Please enter your username [Enter to quit]: ").upper()
200220
if s_usr=="":
201221
break
202222

203-
print ( f"Welcome back {s_usr}.")
204223
if s_usr in a_users.keys():
205224
usr = User(s_usr)
206-
225+
226+
print ( f"\n{s.GREENON}Welcome back {s_usr}.{s.COLOUROFF}\n")
227+
207228
if usr.is_locked_out():
208229
t_release = time.strftime("%d/%m/%Y %H:%M:%S", time.gmtime(usr.lockout_release))
209230
print ( f"{s.REDON}Sorry your account is locked out until {t_release}.{s.COLOUROFF}\nPlease try again later")
@@ -212,16 +233,19 @@ def write_file():
212233
else:
213234
f_loggedin=0
214235
while usr.locked == 0 and usr.loggedin == 0:
215-
s_pwd_try = input ( f"Please enter password for user {usr.username}: " )
236+
s_pwd_try = gp.getpass ( f"Please enter password for user {usr.username}: " )
216237
if usr.verify_password(s_pwd_try) == True:
217238
break
218239

219240
if usr.loggedin == 1:
220241
print ( f"{s.GREENON}Welcome to the Password Verifier 2000.{s.COLOUROFF}\n{s.ORANGEON}You successfully entered your username and password!{s.COLOUROFF}" )
242+
time.sleep ( 1 )
221243
else:
222-
print ( f"{s.REDON}{s.REVON}Password attempts limit exceeded.{s.REVOFF}{s.COLOUROFF} \nYour account has been locked for 60 seconds." )
244+
print ( f"{s.REDON}{s.REVON}Password attempts limit exceeded.{s.REVOFF}{s.COLOUROFF} \nYour account has been locked for {(usr.lockout_period * usr.lockouts)} seconds." )
245+
time.sleep ( 1 )
223246
else:
224-
print ( f"{s.REDON}Username not found. Please try again{s.COLOUROFF}" )
247+
print ( f"\n{s.REDON}Username not found. Please try again{s.COLOUROFF}\n" )
248+
time.sleep (1)
225249

226250
elif i_menu == 3:
227251
print ("System Users")
@@ -231,10 +255,24 @@ def write_file():
231255
usr = User(this_user)
232256
if usr.is_locked_out():
233257
s_colour = s.REDON
258+
s_timeout = f" on lockout {usr.lockouts} until {usr.lockout_release_str()} "
234259
else:
235260
s_colour = s.GREENON
261+
s_timeout = ""
236262

237-
print ( f"{s_colour}{usr.username}{s.COLOUROFF}" )
263+
print ( f"{s_colour}{usr.username}{s.COLOUROFF} " + s_timeout)
238264

239265
print ("------------")
240266
print ( "" )
267+
elif i_menu == 4:
268+
try:
269+
print ("\nCurrent User Object")
270+
print ("-------------------")
271+
272+
print (usr)
273+
except Exception as e:
274+
#print ( str(e))
275+
print ( "No current user object" )
276+
time.sleep ( 1 )
277+
finally:
278+
print ("")
78.3 KB
Loading
28.2 KB
Loading
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
{"Dave": "319bc54aaa80ec8196f6b21a8477dee75dbd7858d29020b3c5ebb88201799ddf53ff15de17ad0ccff87705bb8890858a7905d510735c5a3e2b2276628847c4ecba3715dccd25531eae9e5203370dca763586cb4ccc326da4683f5b64453692af"}
1+
{"DAVE": "51214d41b029cd2a12598dba89cfa6577370c1d81f9f2da2c20c64a6ced7e0fd91a695e7e588568c3cf06630c730e263f3d157aae6351845088d9b397a830a13aa0fb2d01e5bec1a1fc8c98a3d0d34b67375730f09724001bbb4c936b6df8bc1",
2+
"FRED": "294b2bb0d081c3f45c69ef82519979797b818fd55be4244ddea05d79ba50029c163da60b0126ebf526edd4ab2fa26b35ddb76fff8d670eecf3218171e1c8977a7e984b5e33e75913ce36c663d26c4fd87a16a73ffec816769fb1afe2396fd5a1",
3+
"SARAH": "f4f1eef95155204e1e9a737e4d93bc0319737ee38d59d5d3c4bc71ed75ad01df58842a73fc22574b34ebe816b7e65def02bd1a026b6929b46fc9861877c0b8e40148bed90bbc29d12565652e27c486fba1ef31870c2f1ec2f000d126d39e8e44",
4+
"STEVE": "4a537753fa60cd4efad32e535062c08df6901102c7ff009cae6ac612865aa344eb10c12af6a8f37606d8daa7878d34cc780b9ca99fbfb70c24a1f1b32bb8157f2017f976f6ad807df5d5d68d2906fa85cdd1de61fb6b9eef57999fd5f76b3a4f",
5+
"ROGER": "4260fd11f54c8c963331121fe9821ca94ee38bc980fedd37f9ac638f0910833b303e20ccacdda25f1f05f83efa9c7c61a76f2e5dfb514ecf6bcfdba9679c6211be2b07ce9609ee34a14999d698813e921b37837fa3c5ea82b67fe8b44adbaff9",
6+
"RACH": "1a9dacdd164e959372fc61f4de2ddafb61c099dbe1b15780eedc3713c3df64682c258f594d2009102f8f9e28cdd44df6e573467f3403c4e9c6c8c6a58d885a4d34c082691a07050cb06abb2638718413f2ef1483743b59c3ab53dddaba272f83",
7+
"HELEN": "b991c34f6af98481d4b17672b1cd46c265bdcc7f3e551e8ec4f55640120666d1de38758c17217d5bd0bbbe34e334a23801b55cfa5232dbe7030f2586fdcb5dae9f77ed0e7f8e5c3988d0df872581aa7aaa65dbe66b0685a55dd4fd74bc570806"}
82.1 KB
Loading

Tasks/alkaline_metals.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
beryllium 4 9.012
2+
magnesium 12 24.305
3+
calcium 20 20.078
4+
strontium 38 87.62
5+
barium 56 137.327
6+
radium 88 226

Tasks/text.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Sunt nobis quos quam neque nam sit suscipit dignissimos, minima laborum soluta mollitia reiciendis deserunt necessitatibus ratione cum, aliquid quibusdam itaque, nobis dolores debitis autem aliquid?
2+
Enim veritatis accusantium deserunt ab earum eveniet mollitia quas omnis commodi quisquam, natus quaerat omnis ut voluptatem aliquam, nihil ut sapiente suscipit cupiditate totam quas a debitis aliquam, quis corporis laboriosam, iste fugit cupiditate consequatur laudantium nulla soluta provident rerum a.
3+
Labore excepturi iure quae ad dolor optio debitis illo recusandae dignissimos quo, eaque doloribus aliquid dolorum iusto rem delectus recusandae, quis sint fuga ex sapiente possimus atque dignissimos?
4+
Quisquam deleniti eaque sit eligendi expedita nulla ab molestiae quod fugit, facilis at cumque amet animi quod necessitatibus ab, natus molestiae reprehenderit ratione aperiam.
5+
Veritatis repellendus assumenda quisquam reiciendis sit beatae necessitatibus magnam saepe rem non, nemo hic voluptatum velit esse beatae quisquam consectetur, earum tenetur consectetur eveniet maiores sed dolores fugiat facere nesciunt voluptatibus beatae?
6+
Tempore hic veritatis pariatur odio odit perferendis porro autem distinctio obcaecati quod, blanditiis consequuntur odit tempore suscipit, asperiores magni suscipit accusantium minima repellendus in, commodi velit eligendi repudiandae dolor ut perspiciatis delectus molestias tenetur sequi accusamus?
7+
Nihil autem eligendi ipsam accusantium ex a voluptates ratione itaque quae, unde vel amet blanditiis quisquam ut incidunt alias velit.
8+
Nisi quam tempora minus dolore harum quos eveniet totam cum, nemo inventore commodi, eius atque corrupti cum ab, voluptatem illo qui laudantium ex rerum eligendi.
9+
Repudiandae eveniet unde itaque quod distinctio praesentium officiis quaerat maxime ipsam, eius voluptate earum eveniet voluptatum tenetur, debitis pariatur enim tempore vitae.
10+
Maxime porro assumenda magni perspiciatis odit ex dolor voluptates vel quisquam, veritatis est asperiores perspiciatis accusamus at, obcaecati a fuga quasi possimus natus tempora animi, eum nesciunt quis?

Tasks/wk9_files.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
from lorem_text import lorem as lt
3+
4+
print ( "Generating Text File" )
5+
print ( "--------------------" )
6+
with open("text.txt", "w") as fh_1:
7+
for i in range(10):
8+
fh_1.write ( lt.sentence() + '\n' )
9+
10+
print ( "\nReading back file contents" )
11+
print ( "--------------------------" )
12+
with open("text.txt", "r") as fh_1:
13+
for line in fh_1:
14+
print ( line.strip() )

Tasks/wk9_metals.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# metals
2+
3+
import os
4+
import pprint as pp
5+
6+
def create_file():
7+
if not os.path.exists(file_name):
8+
with open(file_name, "w") as fh_metals:
9+
fh_metals.write("beryllium 4 9.012\n")
10+
fh_metals.write("magnesium 12 24.305\n")
11+
fh_metals.write("calcium 20 20.078\n")
12+
fh_metals.write("strontium 38 87.62\n")
13+
fh_metals.write("barium 56 137.327\n")
14+
fh_metals.write("radium 88 226\n")
15+
16+
def read_file():
17+
global a_metals
18+
with open(file_name) as fh_metals:
19+
for line in fh_metals:
20+
a_line = line.split()
21+
a_line[1] =int(a_line[1])
22+
a_line[2] = float(a_line[2])
23+
24+
a_metals.append(a_line)
25+
26+
file_name = "alkaline_metals.txt"
27+
a_metals = []
28+
# do it
29+
create_file()
30+
31+
read_file()
32+
33+
pp.pprint (a_metals)

0 commit comments

Comments
 (0)