-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAuthenticationService.java
More file actions
105 lines (89 loc) · 3.47 KB
/
Copy pathAuthenticationService.java
File metadata and controls
105 lines (89 loc) · 3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package com.usermanagement;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class AuthenticationService {
private Database database;
private Map<String, String> otpStorage;
private Map<String, String> invitationStorage;
public AuthenticationService(Database database) {
this.database = database;
this.otpStorage = new HashMap<>();
this.invitationStorage = new HashMap<>();
}
public Database getDatabase() {
return database;
}
public boolean authenticate(String username, byte[] passwordHash) {
User user = database.getUser(username);
return user != null && java.util.Arrays.equals(user.getPasswordHash(), passwordHash);
}
public String generateOtp(String username) {
String otp = UUID.randomUUID().toString();
otpStorage.put(username, otp);
return otp;
}
public boolean validateOtp(String username, String otp) {
return otpStorage.getOrDefault(username, "").equals(otp);
}
public void resetPassword(String username, byte[] newPasswordHash, LocalDateTime otpExpiration) {
User user = database.getUser(username);
if (user != null) {
user.setPasswordHash(newPasswordHash);
user.setOneTimePassword(true);
user.setOtpExpiration(otpExpiration);
database.updateUser(user);
}
}
public String inviteUser(String username, String role) {
String invitationCode = UUID.randomUUID().toString();
invitationStorage.put(invitationCode, username + ":" + role);
return invitationCode;
}
public boolean acceptInvitation(String username, String invitationCode, byte[] passwordHash) {
if (invitationStorage.containsKey(invitationCode)) {
String[] details = invitationStorage.get(invitationCode).split(":");
String invitedUsername = details[0];
String role = details[1];
if (invitedUsername.equals(username)) {
User user = new User(username, passwordHash, null, null, null, null, null, List.of(role), false, null, null);
database.addUser(user);
invitationStorage.remove(invitationCode);
return true;
}
}
return false;
}
public boolean validateInvitationCode(String invitationCode) {
return invitationStorage.containsKey(invitationCode);
}
public List<String> getRolesForInvitationCode(String invitationCode) {
if (invitationStorage.containsKey(invitationCode)) {
String[] details = invitationStorage.get(invitationCode).split(":");
return List.of(details[1]);
}
return List.of();
}
public void deleteUser(String username) {
database.deleteUser(username);
}
public void listUsers() {
database.listUsers().forEach((username, user) -> System.out.println(user));
}
public void addRoleToUser(String username, String role) {
User user = database.getUser(username);
if (user != null && !user.getRoles().contains(role)) {
user.getRoles().add(role);
database.updateUser(user);
}
}
public void removeRoleFromUser(String username, String role) {
User user = database.getUser(username);
if (user != null) {
user.getRoles().remove(role);
database.updateUser(user);
}
}
}