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