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.

152 lines
4.2 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. System.out.println("logout " + header);
  68. final Access access = accessRepository.findByToken(header.substring("Bearer ".length()));
  69. access.removeToken();
  70. accessRepository.save(access);
  71. return true;
  72. } catch (Exception e)
  73. {
  74. e.printStackTrace();
  75. return false;
  76. }
  77. }
  78. public LoginRequest authorization(final String header)
  79. {
  80. System.out.println("authorization");
  81. final String auth = header.substring("Basic ".length());
  82. try
  83. {
  84. byte[] message = Base64.getDecoder().decode(auth);
  85. String messageStr = new String(message);
  86. String[] user_password = messageStr.split(":");
  87. final Access access = accessRepository.findByUserName(user_password[0]);
  88. System.out.println(access.getName());
  89. if (user_password[1].equals(access.getPassword()))
  90. {
  91. access.setToken(AccessToken.of(access));
  92. accessRepository.save(access);
  93. final LoginRequest loginRequest = new LoginRequest();
  94. loginRequest.setUserId(access.getUserId().getIdentifier());
  95. loginRequest.setToken(access.getToken().getToken());
  96. loginRequest.setName(access.getName());
  97. return loginRequest;
  98. }
  99. return null;
  100. } catch (Exception e)
  101. {
  102. e.printStackTrace();
  103. return null;
  104. }
  105. }
  106. public boolean deleteAccount(final UserId userId, final AccessToken token)
  107. {
  108. if (!token.getUserId().getIdentifier()
  109. .equals(userId.getIdentifier()))
  110. {
  111. return false;
  112. }
  113. if (accessRepository.deleteLoginByUserId(userId).wasAcknowledged())
  114. {
  115. setChanged();
  116. notifyObservers(new AccountDeletedEvent(userId));
  117. return true;
  118. }
  119. return false;
  120. }
  121. }