| 
									
										
										
										
											2021-09-09 08:51:29 -08:00
										 |  |  | import json | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from fastapi.testclient import TestClient | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-20 20:07:46 +02:00
										 |  |  | from mealie.core.config import get_app_settings | 
					
						
							| 
									
										
										
										
											2022-08-13 13:18:12 -08:00
										 |  |  | from mealie.repos.repository_factory import AllRepositories | 
					
						
							|  |  |  | from mealie.services.user_services.user_service import UserService | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  | from tests.utils.app_routes import AppRoutes | 
					
						
							| 
									
										
										
										
											2022-01-13 13:06:52 -09:00
										 |  |  | from tests.utils.fixture_schemas import TestUser | 
					
						
							| 
									
										
										
										
											2021-09-09 08:51:29 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_failed_login(api_client: TestClient, api_routes: AppRoutes): | 
					
						
							| 
									
										
										
										
											2022-04-20 20:07:46 +02:00
										 |  |  |     settings = get_app_settings() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     form_data = {"username": settings.DEFAULT_EMAIL, "password": "WRONG_PASSWORD"} | 
					
						
							| 
									
										
										
										
											2021-09-09 08:51:29 -08:00
										 |  |  |     response = api_client.post(api_routes.auth_token, form_data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert response.status_code == 401 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_superuser_login(api_client: TestClient, api_routes: AppRoutes, admin_token): | 
					
						
							| 
									
										
										
										
											2022-04-20 20:07:46 +02:00
										 |  |  |     settings = get_app_settings() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     form_data = {"username": settings.DEFAULT_EMAIL, "password": settings.DEFAULT_PASSWORD} | 
					
						
							| 
									
										
										
										
											2021-09-09 08:51:29 -08:00
										 |  |  |     response = api_client.post(api_routes.auth_token, form_data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert response.status_code == 200 | 
					
						
							|  |  |  |     new_token = json.loads(response.text).get("access_token") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = api_client.get(api_routes.users_self, headers=admin_token) | 
					
						
							|  |  |  |     assert response.status_code == 200 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return {"Authorization": f"Bearer {new_token}"} | 
					
						
							| 
									
										
										
										
											2022-01-13 13:06:52 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_user_token_refresh(api_client: TestClient, api_routes: AppRoutes, admin_user: TestUser): | 
					
						
							|  |  |  |     response = api_client.post(api_routes.auth_refresh, headers=admin_user.token) | 
					
						
							|  |  |  |     response = api_client.get(api_routes.users_self, headers=admin_user.token) | 
					
						
							|  |  |  |     assert response.status_code == 200 | 
					
						
							| 
									
										
										
										
											2022-08-13 13:18:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_user_lockout_after_bad_attemps(api_client: TestClient, unique_user: TestUser, database: AllRepositories): | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2022-09-25 23:17:27 +00:00
										 |  |  |     if the user has more than 5 bad login attempts the user will be locked out for 4 hours | 
					
						
							| 
									
										
										
										
											2022-08-13 13:18:12 -08:00
										 |  |  |     This only applies if there is a user in the database with the same username | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     routes = AppRoutes() | 
					
						
							|  |  |  |     settings = get_app_settings() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for _ in range(settings.SECURITY_MAX_LOGIN_ATTEMPTS): | 
					
						
							|  |  |  |         form_data = {"username": unique_user.email, "password": "bad_password"} | 
					
						
							|  |  |  |         response = api_client.post(routes.auth_token, form_data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         assert response.status_code == 401 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     valid_data = {"username": unique_user.email, "password": unique_user.password} | 
					
						
							|  |  |  |     response = api_client.post(routes.auth_token, valid_data) | 
					
						
							|  |  |  |     assert response.status_code == 423 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Cleanup | 
					
						
							|  |  |  |     user_service = UserService(database) | 
					
						
							|  |  |  |     user = database.users.get_one(unique_user.user_id) | 
					
						
							|  |  |  |     user_service.unlock_user(user) |