|
2 | 2 |
|
3 | 3 | from annotated_types import Ge, Le, MinLen |
4 | 4 | from django.conf import settings |
5 | | -from django.db.models import F, Q |
6 | | -from ninja import Schema |
| 5 | +from django.contrib.auth import login |
| 6 | +from django.db.models import F |
7 | 7 | from django.http import HttpResponse |
8 | | -from ninja import File, Query |
| 8 | +from ninja import File, Query, Status |
9 | 9 | from ninja.security import SessionAuth |
10 | 10 | from ninja_extra import ControllerBase, api_controller, paginate, route |
11 | 11 | from ninja_extra.exceptions import PermissionDenied |
|
19 | 19 | from core.schemas import ( |
20 | 20 | FamilyGodfatherSchema, |
21 | 21 | GroupSchema, |
| 22 | + LoginSchema, |
22 | 23 | MarkdownSchema, |
23 | 24 | SithFileSchema, |
24 | 25 | UploadedFileSchema, |
|
29 | 30 | UserSchema, |
30 | 31 | ) |
31 | 32 | from core.templatetags.renderer import markdown |
| 33 | +from core.views.forms import LoginForm |
32 | 34 | from counter.utils import is_logged_in_counter |
33 | | -from counter.models import Customer |
34 | 35 |
|
35 | 36 |
|
36 | 37 | @api_controller("/markdown") |
@@ -170,25 +171,28 @@ def get_family_graph( |
170 | 171 | } |
171 | 172 |
|
172 | 173 |
|
173 | | -class LoginSchema(Schema): |
174 | | - identifier: str |
175 | | - password: str |
176 | | - |
177 | | - |
178 | 174 | @api_controller("/auth") |
179 | 175 | class AuthController(ControllerBase): |
180 | | - @route.post("/login", auth=None) |
| 176 | + @route.post( |
| 177 | + "/login", |
| 178 | + auth=None, |
| 179 | + response={200: dict[Literal["id"], int], 401: dict[str, list[str]]}, |
| 180 | + ) |
181 | 181 | def login(self, body: LoginSchema): |
182 | 182 | """Authenticate a user by username, email or AE account id. |
183 | 183 |
|
184 | 184 | Returns the user's id on success, 401 on failure. |
185 | 185 | """ |
186 | | - ident = body.identifier.strip() |
187 | | - user = User.objects.filter(Q(username=ident) | Q(email=ident)).first() |
188 | | - if user is None: |
189 | | - cust = Customer.objects.select_related("user").filter(account_id=ident).first() |
190 | | - if cust: |
191 | | - user = cust.user |
192 | | - if user is None or not user.check_password(body.password): |
193 | | - return HttpResponse(status=401) |
| 186 | + if self.context.request.user.is_authenticated: |
| 187 | + raise PermissionDenied |
| 188 | + |
| 189 | + login_form = LoginForm( |
| 190 | + self.context.request, |
| 191 | + data={"username": body.identifier, "password": body.password}, |
| 192 | + ) |
| 193 | + if not login_form.is_valid(): |
| 194 | + return Status(401, login_form.errors) |
| 195 | + |
| 196 | + user = login_form.get_user() |
| 197 | + login(self.context.request, user) |
194 | 198 | return {"id": user.id} |
0 commit comments