You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
4.1 KiB

  1. package de.fd.fh.server.access;
  2. import de.fd.fh.server.access.events.AccountCreatedEvent;
  3. import de.fd.fh.server.access.events.AccountDeletedEvent;
  4. import de.fd.fh.server.user.UserId;
  5. import de.fd.fh.shared.network.messages.LoginRequest;
  6. import de.fd.fh.shared.network.messages.RegistrateRequest;
  7. import lombok.RequiredArgsConstructor;
  8. import org.bson.types.ObjectId;
  9. import java.util.Base64;
  10. import java.util.Observable;
  11. import static spark.Spark.halt;
  12. @RequiredArgsConstructor
  13. public class AccessService extends Observable
  14. {
  15. private final AccessRepository accessRepository;
  16. public AccessToken before(final String path, final String token) {
  17. System.out.println("Pfad: " + path);
  18. if (!(path.equals("/accounts/login")
  19. || path.equals("/accounts/registrate")
  20. ))
  21. {
  22. final AccessToken accessToken = authenticate(token);
  23. if (accessToken == null)
  24. {
  25. halt(401);
  26. }
  27. return accessToken;
  28. }
  29. return null;
  30. }
  31. private AccessToken authenticate(final String bearerToken)
  32. {
  33. return accessRepository.findByToken(bearerToken.substring("Bearer ".length())).getToken();
  34. }
  35. public boolean createPlayer(RegistrateRequest message)
  36. {
  37. System.out.println("createPlayer: " + message);
  38. if (userNameDoesNotExist(message.getUserName()))
  39. {
  40. System.out.println("Name does exist.");
  41. return false;
  42. }
  43. final Access access = new Access(
  44. new ObjectId().toHexString(),
  45. message.getUserName(),
  46. message.getPassword(),
  47. UserId.random(),
  48. null,
  49. Role.USER
  50. );
  51. accessRepository.save(access);
  52. setChanged();
  53. notifyObservers(new AccountCreatedEvent(access.getName(),
  54. access.getUserId()));
  55. System.out.println("DBLogin: " + access);
  56. return true;
  57. }
  58. private boolean userNameDoesNotExist(final String name)
  59. {
  60. final Access user = accessRepository.findByUserName(name);
  61. return user != null;
  62. }
  63. public boolean logout(final String header)
  64. {
  65. try
  66. {
  67. final Access access = accessRepository.findByToken(header.substring("Bearer ".length()));
  68. access.removeToken();
  69. accessRepository.save(access);
  70. return true;
  71. } catch (final Exception e)
  72. {
  73. e.printStackTrace();
  74. return false;
  75. }
  76. }
  77. public LoginRequest authorization(final String header)
  78. {
  79. System.out.println("authorization");
  80. final String auth = header.substring("Basic ".length());
  81. try
  82. {
  83. byte[] message = Base64.getDecoder().decode(auth);
  84. String messageStr = new String(message);
  85. String[] user_password = messageStr.split(":");
  86. final Access access = accessRepository.findByUserName(user_password[0]);
  87. System.out.println(access.getName());
  88. if (user_password[1].equals(access.getPassword()))
  89. {
  90. access.setToken(AccessToken.of(access));
  91. accessRepository.save(access);
  92. final LoginRequest loginRequest = new LoginRequest();
  93. loginRequest.setUserId(access.getUserId().getIdentifier());
  94. loginRequest.setToken(access.getToken().getToken());
  95. loginRequest.setName(access.getName());
  96. return loginRequest;
  97. }
  98. return null;
  99. } catch (final Exception e)
  100. {
  101. e.printStackTrace();
  102. return null;
  103. }
  104. }
  105. public boolean deleteAccount(final UserId userId, final AccessToken token)
  106. {
  107. if (!token.getUserId().getIdentifier()
  108. .equals(userId.getIdentifier()))
  109. {
  110. return false;
  111. }
  112. if (accessRepository.deleteLoginByUserId(userId).wasAcknowledged())
  113. {
  114. setChanged();
  115. notifyObservers(new AccountDeletedEvent(userId));
  116. return true;
  117. }
  118. return false;
  119. }
  120. }