OauthTokenManager.java
6.57 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* com.adobe.granite.crypto.CryptoException
* com.adobe.granite.crypto.CryptoSupport
* com.day.crx.security.token.TokenCookie
* javax.jcr.Node
* javax.jcr.Property
* javax.jcr.RepositoryException
* javax.jcr.Session
* javax.jcr.Value
* javax.jcr.ValueFactory
* javax.servlet.http.HttpServletRequest
* javax.servlet.http.HttpServletResponse
* org.apache.jackrabbit.api.security.user.User
* org.apache.sling.api.resource.Resource
* org.apache.sling.api.resource.ValueMap
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.adobe.granite.auth.oauth.impl.helper;
import com.adobe.granite.auth.oauth.impl.helper.OAuthToken;
import com.adobe.granite.crypto.CryptoException;
import com.adobe.granite.crypto.CryptoSupport;
import com.day.crx.security.token.TokenCookie;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OauthTokenManager {
private final Logger log;
private static final String PROPERTY_OAUTH_TOKEN = "oauth.accesstoken.encrypted";
private CryptoSupport cryptoSupport;
private String _cookieDomain;
private String _cookiePath;
private int _maxAge;
private int _loginTimeout;
public OauthTokenManager(CryptoSupport cryptoSupport, int loginTimeout, int maxAge) {
this.log = LoggerFactory.getLogger(this.getClass());
this._maxAge = 600;
this._loginTimeout = 60;
this.cryptoSupport = cryptoSupport;
this._loginTimeout = loginTimeout;
this._maxAge = maxAge;
this._cookiePath = "/";
this._cookieDomain = null;
}
public void setCryptoSupport(CryptoSupport cryptoSupport) {
this.cryptoSupport = cryptoSupport;
}
public void setMaxAge(int maxAge) {
this._maxAge = maxAge;
}
public void setLoginTimeout(int loginTimeout) {
this._loginTimeout = loginTimeout;
}
public OAuthToken getToken(String consumerKey, HttpServletRequest request) {
Object tokenAttr = request.getAttribute(consumerKey);
if (tokenAttr instanceof OAuthToken) {
this.log.debug("token retrieved via request attribute:{}", tokenAttr);
return (OAuthToken)tokenAttr;
}
String cookie = TokenCookie.getCookie((HttpServletRequest)request, (String)consumerKey);
if (cookie != null) {
OAuthToken token = this.getToken(cookie);
request.setAttribute(consumerKey, (Object)token);
this.log.debug("token retrieved via cookie:{}", (Object)token);
return token;
}
this.log.info("token not found in request attribute or cookie for:{}", (Object)consumerKey);
return null;
}
public OAuthToken getToken(String consumerKey, User user, String accessTokenPropertyPath) throws RepositoryException {
Value[] val;
if (user.hasProperty(accessTokenPropertyPath) && (val = user.getProperty(accessTokenPropertyPath)) != null && val[0] != null) {
String encryptedTokenString = val[0].getString();
OAuthToken token = this.getToken(encryptedTokenString);
this.log.debug("token retrieved from jcr:{}", (Object)token);
return token;
}
this.log.info("token not found in user:{} for app id:{}", (Object)user, (Object)consumerKey);
return null;
}
public OAuthToken getToken(Resource encryptedTokenResource) throws RepositoryException {
String encryptedToken = (String)((ValueMap)encryptedTokenResource.adaptTo(ValueMap.class)).get("oauth.accesstoken.encrypted", String.class);
return this.getToken(encryptedToken);
}
private OAuthToken getToken(String cookie) {
if (cookie != null) {
String value = null;
try {
value = this.cryptoSupport.unprotect(cookie);
return OAuthToken.fromJSON(value);
}
catch (CryptoException e) {
this.log.error("failed decrypting cookie:{}", (Object)cookie);
}
}
return null;
}
public boolean saveToken(OAuthToken token, HttpServletRequest request, HttpServletResponse response) {
request.setAttribute(token.getCk(), (Object)token);
String value = this.getEncryptedTokenString(token);
if (value == null) {
return false;
}
return this.write(token.getCk(), "\"" + value + "\"", token.isAuthentic() ? this._maxAge : this._loginTimeout, request.isSecure(), response);
}
public boolean saveToken(String consumerKey, HttpServletRequest request, Node encryptedTokenNode) throws RepositoryException {
OAuthToken token = this.getToken(consumerKey, request);
String value = this.getEncryptedTokenString(token);
encryptedTokenNode.setProperty("oauth.accesstoken.encrypted", value);
encryptedTokenNode.getSession().save();
return value != null;
}
public boolean saveToken(String consumerKey, HttpServletRequest request, User user, ValueFactory vf, String propertyPath) throws RepositoryException {
OAuthToken token = this.getToken(consumerKey, request);
String value = this.getEncryptedTokenString(token);
user.setProperty(propertyPath, vf.createValue(value));
return true;
}
public boolean invalidate(String consumerKey, HttpServletRequest request, HttpServletResponse response) {
request.removeAttribute(consumerKey);
return this.write(consumerKey, "", 0, request.isSecure(), response);
}
protected boolean write(String name, String value, int maxAge, boolean isSecure, HttpServletResponse response) {
TokenCookie.setCookie((HttpServletResponse)response, (String)name, (String)value, (int)maxAge, (String)this._cookiePath, (String)this._cookieDomain, (boolean)true, (boolean)isSecure);
return true;
}
private String getEncryptedTokenString(OAuthToken token) {
try {
return this.cryptoSupport.protect(token.toJSON());
}
catch (Exception e) {
e.printStackTrace();
this.log.error("failed encrypting cookie:{}", (Object)(token == null ? null : token.toString()));
return null;
}
}
}