PostAuthorize.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { HttpMethod, Route, StatusCodes } from 'org.crazydoctor.expressts';
  2. import { Request, Response } from 'express';
  3. import { ISession } from '../session/ISession';
  4. import SHA256 from '../util/SHA256';
  5. import ServerApp from '..';
  6. class PostAuthorize extends Route {
  7. private AdminLogin = 'Admin';
  8. private async tryGogsAuth(login: string, password: string): Promise<boolean> {
  9. try {
  10. const response = await fetch(`${ServerApp.GitHost}/api/v1/users/${login}/tokens`, {
  11. method: 'GET',
  12. headers: {
  13. 'Content-Type': 'application/json',
  14. 'Authorization': 'Basic ' + Buffer.from(`${login}:${password}`).toString('base64')
  15. }
  16. });
  17. if (!response.ok)
  18. return false;
  19. const tokens = await response.json();
  20. if(tokens instanceof Array)
  21. return true;
  22. return false;
  23. } catch (error) {
  24. return false;
  25. }
  26. }
  27. protected action = (req: Request, res: Response): any => {
  28. const session = req.session as ISession;
  29. const params = req.body;
  30. const login = params.login.trim();
  31. const password = params.password.trim();
  32. const hashedPassword = SHA256.hash(password);
  33. const returnTo = session.returnTo;
  34. delete session.returnTo;
  35. res.set({
  36. 'Content-Type': 'application/json'
  37. });
  38. if(login === this.AdminLogin && this.context.options.adminPassword === hashedPassword) {
  39. session.login = 'Admin';
  40. session.isAdmin = session.isEditor = true;
  41. res.status(StatusCodes.OK).send({ success: true, returnTo: returnTo });
  42. return;
  43. }
  44. this.tryGogsAuth(login, password).then((result) => {
  45. if(result) {
  46. session.isEditor = true;
  47. session.login = login;
  48. res.status(StatusCodes.OK).send({ success: true, returnTo: returnTo });
  49. } else {
  50. res.status(StatusCodes.FORBIDDEN).send({ success: false, message: 'Authentication failed' });
  51. }
  52. });
  53. };
  54. protected method = HttpMethod.POST;
  55. protected order = 2;
  56. protected route = '/authorize';
  57. }
  58. export default PostAuthorize;