| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 1 | package de.ids_mannheim.korap.security.context; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 2 | |
| margaretha | 2afb97d | 2017-12-07 19:18:44 +0100 | [diff] [blame] | 3 | import java.io.Serializable; |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 4 | import java.time.ZonedDateTime; |
| margaretha | 2afb97d | 2017-12-07 19:18:44 +0100 | [diff] [blame] | 5 | import java.util.HashMap; |
| 6 | import java.util.Map; |
| 7 | |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 8 | import com.fasterxml.jackson.databind.JsonNode; |
| margaretha | 2afb97d | 2017-12-07 19:18:44 +0100 | [diff] [blame] | 9 | |
| Michael Hanl | 00b64e0 | 2016-05-24 20:24:27 +0200 | [diff] [blame] | 10 | import de.ids_mannheim.korap.config.Attributes; |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 11 | import de.ids_mannheim.korap.constant.TokenType; |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 12 | import de.ids_mannheim.korap.exceptions.KustvaktException; |
| margaretha | 0e8f4e7 | 2018-04-05 14:11:52 +0200 | [diff] [blame] | 13 | import de.ids_mannheim.korap.user.User; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 14 | import de.ids_mannheim.korap.utils.JsonUtils; |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 15 | import de.ids_mannheim.korap.utils.TimeUtils; |
| Michael Hanl | 1939065 | 2016-01-16 11:01:24 +0100 | [diff] [blame] | 16 | import lombok.AccessLevel; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 17 | import lombok.Data; |
| Michael Hanl | f1e85e7 | 2016-01-21 16:55:45 +0100 | [diff] [blame] | 18 | import lombok.Setter; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 19 | |
| 20 | /** |
| margaretha | 35e1ca2 | 2023-11-16 22:00:01 +0100 | [diff] [blame] | 21 | * EM: |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 22 | * - change datatype of tokenType from string to enum |
| 23 | * - added authenticationTime |
| 24 | * |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 25 | * @author hanl |
| 26 | * @date 27/01/2014 |
| 27 | */ |
| 28 | @Data |
| Michael Hanl | f1e85e7 | 2016-01-21 16:55:45 +0100 | [diff] [blame] | 29 | public class TokenContext implements java.security.Principal, Serializable { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 30 | |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 31 | private ZonedDateTime authenticationTime; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 32 | /** |
| 33 | * session relevant data. Are never persisted into a database |
| 34 | */ |
| 35 | private String username; |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 36 | private long expirationTime; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 37 | // either "session_token " / "api_token |
| margaretha | 2afb97d | 2017-12-07 19:18:44 +0100 | [diff] [blame] | 38 | private TokenType tokenType; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 39 | private String token; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 40 | private boolean secureRequired; |
| 41 | |
| margaretha | 35e1ca2 | 2023-11-16 22:00:01 +0100 | [diff] [blame] | 42 | // @Getter(AccessLevel.PRIVATE) |
| Michael Hanl | f1e85e7 | 2016-01-21 16:55:45 +0100 | [diff] [blame] | 43 | @Setter(AccessLevel.PRIVATE) |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 44 | private Map<String, Object> parameters; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 45 | private String hostAddress; |
| 46 | private String userAgent; |
| 47 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 48 | public TokenContext () { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 49 | this.parameters = new HashMap<>(); |
| 50 | this.setUsername(""); |
| 51 | this.setToken(""); |
| 52 | this.setSecureRequired(false); |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 53 | this.setExpirationTime(-1); |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 54 | } |
| 55 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 56 | private Map statusMap () { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 57 | Map m = new HashMap(); |
| 58 | if (username != null && !username.isEmpty()) |
| 59 | m.put(Attributes.USERNAME, username); |
| 60 | m.put(Attributes.TOKEN_EXPIRATION, |
| Michael Hanl | 2c3b0b1 | 2016-07-01 18:30:12 +0200 | [diff] [blame] | 61 | TimeUtils.format(this.expirationTime)); |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 62 | m.put(Attributes.TOKEN, this.token); |
| margaretha | 2afb97d | 2017-12-07 19:18:44 +0100 | [diff] [blame] | 63 | m.put(Attributes.TOKEN_TYPE, this.tokenType); |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 64 | return m; |
| 65 | } |
| 66 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 67 | public Map<String, Object> params () { |
| Michael Hanl | 1939065 | 2016-01-16 11:01:24 +0100 | [diff] [blame] | 68 | return new HashMap<>(parameters); |
| 69 | } |
| margaretha | 35e1ca2 | 2023-11-16 22:00:01 +0100 | [diff] [blame] | 70 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 71 | public boolean match (TokenContext other) { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 72 | if (other.getToken().equals(this.token)) |
| 73 | if (this.getHostAddress().equals(this.hostAddress)) |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 74 | // user agent should be irrelvant -- what about os |
| 75 | // system version? |
| 76 | // if (other.getUserAgent().equals(this.userAgent)) |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 77 | return true; |
| 78 | return false; |
| 79 | } |
| 80 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 81 | public void addContextParameter (String key, String value) { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 82 | this.parameters.put(key, value); |
| 83 | } |
| 84 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 85 | public void addParams (Map<String, Object> map) { |
| Michael Hanl | f1e85e7 | 2016-01-21 16:55:45 +0100 | [diff] [blame] | 86 | for (Map.Entry<String, Object> e : map.entrySet()) |
| 87 | this.parameters.put(e.getKey(), String.valueOf(e.getValue())); |
| 88 | } |
| 89 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 90 | public void removeContextParameter (String key) { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 91 | this.parameters.remove(key); |
| 92 | } |
| 93 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 94 | public void setExpirationTime (long date) { |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 95 | this.expirationTime = date; |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 96 | } |
| 97 | |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 98 | // todo: complete |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 99 | public static TokenContext fromJSON (String s) throws KustvaktException { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 100 | JsonNode node = JsonUtils.readTree(s); |
| Michael Hanl | 482f30d | 2015-09-25 12:39:46 +0200 | [diff] [blame] | 101 | TokenContext c = new TokenContext(); |
| 102 | if (node != null) { |
| 103 | c.setUsername(node.path(Attributes.USERNAME).asText()); |
| 104 | c.setToken(node.path(Attributes.TOKEN).asText()); |
| 105 | } |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 106 | return c; |
| 107 | } |
| 108 | |
| margaretha | 894a7d7 | 2017-11-08 19:24:20 +0100 | [diff] [blame] | 109 | public static TokenContext fromOAuth2 (String s) throws KustvaktException { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 110 | JsonNode node = JsonUtils.readTree(s); |
| 111 | TokenContext c = new TokenContext(); |
| Michael Hanl | 482f30d | 2015-09-25 12:39:46 +0200 | [diff] [blame] | 112 | if (node != null) { |
| 113 | c.setToken(node.path("token").asText()); |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 114 | c.setTokenType(TokenType.valueOf(node.path("token_type").asText())); |
| Michael Hanl | 482f30d | 2015-09-25 12:39:46 +0200 | [diff] [blame] | 115 | c.setExpirationTime(node.path("expires_in").asLong()); |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 116 | c.addContextParameter("refresh_token", |
| 117 | node.path("refresh_token").asText()); |
| Michael Hanl | 482f30d | 2015-09-25 12:39:46 +0200 | [diff] [blame] | 118 | |
| 119 | } |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 120 | return c; |
| 121 | } |
| 122 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 123 | public boolean isValid () { |
| 124 | return (this.username != null && !this.username.isEmpty()) |
| 125 | && (this.token != null && !this.token.isEmpty()) |
| margaretha | 2afb97d | 2017-12-07 19:18:44 +0100 | [diff] [blame] | 126 | && (this.tokenType != null); |
| Michael Hanl | 7368aa4 | 2016-02-05 18:15:47 +0100 | [diff] [blame] | 127 | } |
| 128 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 129 | public String getToken () { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 130 | return token; |
| 131 | } |
| 132 | |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 133 | public String toJson () throws KustvaktException { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 134 | return JsonUtils.toJSON(this.statusMap()); |
| 135 | } |
| 136 | |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 137 | public boolean isDemo () { |
| Michael Hanl | 99cb963 | 2016-06-29 16:24:40 +0200 | [diff] [blame] | 138 | return User.UserFactory.isDemo(this.username); |
| 139 | } |
| 140 | |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 141 | @Override |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 142 | public String getName () { |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 143 | return this.getUsername(); |
| 144 | } |
| 145 | |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 146 | public ZonedDateTime getAuthenticationTime () { |
| 147 | return authenticationTime; |
| 148 | } |
| 149 | |
| margaretha | a2ce63d | 2018-06-28 10:11:43 +0200 | [diff] [blame] | 150 | public void setAuthenticationTime (ZonedDateTime authTime) { |
| 151 | this.authenticationTime = authTime; |
| 152 | } |
| 153 | |
| Michael Hanl | ca740d7 | 2015-06-16 10:04:58 +0200 | [diff] [blame] | 154 | } |