| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | import hashlib | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  | import string | 
					
						
							| 
									
										
										
										
											2023-01-29 10:57:58 +08:00
										 |  |  | from datetime import datetime, timedelta | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | from UseSqlite import InsertQuery, RecordQuery | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  | def md5(s): | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     MD5摘要 | 
					
						
							|  |  |  |     :param str: 字符串 | 
					
						
							|  |  |  |     :return: 经MD5以后的字符串 | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     h = hashlib.md5(s.encode(encoding='utf-8')) | 
					
						
							|  |  |  |     return h.hexdigest() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # import model.user after the defination of md5(s) to avoid circular import | 
					
						
							|  |  |  | from model.user import get_user_by_username, insert_user, update_password_by_username | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | path_prefix = '/var/www/wordfreq/wordfreq/' | 
					
						
							|  |  |  | path_prefix = './'  # comment this line in deployment | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-05 23:36:55 +08:00
										 |  |  | def verify_pass(newpass,oldpass): | 
					
						
							|  |  |  |     if(newpass==oldpass): | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def verify_user(username, password): | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  |     user = get_user_by_username(username) | 
					
						
							|  |  |  |     encoded_password = md5(username + password) | 
					
						
							|  |  |  |     return user is not None and user.password == encoded_password | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def add_user(username, password): | 
					
						
							|  |  |  |     start_date = datetime.now().strftime('%Y%m%d') | 
					
						
							| 
									
										
										
										
											2023-01-29 10:57:58 +08:00
										 |  |  |     expiry_date = (datetime.now() + timedelta(days=30)).strftime('%Y%m%d') # will expire after 30 days | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  |     # 将用户名和密码一起加密,以免暴露不同用户的相同密码 | 
					
						
							|  |  |  |     password = md5(username + password) | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  |     insert_user(username=username, password=password, start_date=start_date, expiry_date=expiry_date) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def check_username_availability(username): | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  |     existed_user = get_user_by_username(username) | 
					
						
							|  |  |  |     return existed_user is None | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 12:28:41 +08:00
										 |  |  | def change_password(username, old_password, new_password): | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  |     '''
 | 
					
						
							|  |  |  |     修改密码 | 
					
						
							|  |  |  |     :param username: 用户名 | 
					
						
							| 
									
										
										
										
											2022-01-27 12:28:41 +08:00
										 |  |  |     :param old_password: 旧的密码 | 
					
						
							|  |  |  |     :param new_password: 新密码 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  |     :return: 修改成功:True 否则:False | 
					
						
							|  |  |  |     '''
 | 
					
						
							| 
									
										
										
										
											2022-01-27 12:28:41 +08:00
										 |  |  |     if not verify_user(username, old_password):  # 旧密码错误 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  |         return False | 
					
						
							|  |  |  |     # 将用户名和密码一起加密,以免暴露不同用户的相同密码 | 
					
						
							| 
									
										
										
										
											2022-06-05 23:36:55 +08:00
										 |  |  |     if verify_pass(new_password,old_password): #新旧密码一致 | 
					
						
							|  |  |  |         return False | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  |     update_password_by_username(username, new_password) | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_expiry_date(username): | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  |     user = get_user_by_username(username) | 
					
						
							|  |  |  |     if user is None: | 
					
						
							| 
									
										
										
										
											2022-01-26 21:10:09 +08:00
										 |  |  |         return '20191024' | 
					
						
							| 
									
										
										
										
											2023-04-18 21:50:54 +08:00
										 |  |  |     else: | 
					
						
							|  |  |  |         return user.expiry_date | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class UserName: | 
					
						
							|  |  |  |     def __init__(self, username): | 
					
						
							|  |  |  |         self.username = username | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def validate(self): | 
					
						
							| 
									
										
										
										
											2022-11-03 22:02:32 +08:00
										 |  |  |         if len(self.username) > 20: | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  |             return f'{self.username} is too long.  The user name cannot exceed 20 characters.' | 
					
						
							|  |  |  |         if self.username.startswith('.'): # a user name must not start with a dot | 
					
						
							|  |  |  |             return 'Period (.) is not allowed as the first letter in the user name.' | 
					
						
							| 
									
										
										
										
											2022-11-03 22:28:25 +08:00
										 |  |  |         if ' ' in self.username: # a user name must not include a whitespace | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  |             return 'Whitespace is not allowed in the user name.' | 
					
						
							| 
									
										
										
										
											2022-11-03 22:28:25 +08:00
										 |  |  |         for c in self.username: # a user name must not include special characters, except non-leading periods or underscores | 
					
						
							| 
									
										
										
										
											2023-03-21 11:44:05 +08:00
										 |  |  |             if c in string.punctuation and c != '.' and c != '_': | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  |                 return f'{c} is not allowed in the user name.' | 
					
						
							| 
									
										
										
										
											2023-03-23 13:32:11 +08:00
										 |  |  |         if self.username in ['signup', 'login', 'logout', 'reset', 'mark', 'back', 'unfamiliar', 'familiar', 'del', 'admin']: | 
					
						
							| 
									
										
										
										
											2022-11-10 19:03:59 +08:00
										 |  |  |             return 'You used a restricted word as your user name.  Please come up with a better one.' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  |         return 'OK' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WarningMessage: | 
					
						
							|  |  |  |     def __init__(self, s): | 
					
						
							|  |  |  |         self.s = s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2022-11-10 19:03:59 +08:00
										 |  |  |         return UserName(self.s).validate() | 
					
						
							| 
									
										
										
										
											2022-11-03 21:59:12 +08:00
										 |  |  | 
 |