1
|
package eu.dnetlib.openaire.usermanagement;
|
2
|
|
3
|
import com.google.gson.Gson;
|
4
|
import com.google.gson.GsonBuilder;
|
5
|
import com.google.gson.JsonParseException;
|
6
|
import eu.dnetlib.openaire.user.pojos.RegisteredService;
|
7
|
import eu.dnetlib.openaire.usermanagement.utils.RegisteredServicesUtils;
|
8
|
import eu.dnetlib.openaire.usermanagement.utils.TokenUtils;
|
9
|
import org.apache.commons.validator.routines.UrlValidator;
|
10
|
import org.apache.log4j.Logger;
|
11
|
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
|
12
|
import org.springframework.beans.factory.annotation.Autowired;
|
13
|
import org.springframework.security.core.context.SecurityContextHolder;
|
14
|
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
|
15
|
|
16
|
import javax.servlet.ServletConfig;
|
17
|
import javax.servlet.ServletException;
|
18
|
import javax.servlet.http.HttpServlet;
|
19
|
import javax.servlet.http.HttpServletRequest;
|
20
|
import javax.servlet.http.HttpServletResponse;
|
21
|
import java.io.IOException;
|
22
|
import java.sql.SQLException;
|
23
|
|
24
|
|
25
|
public class RegisterServiceServlet extends HttpServlet {
|
26
|
|
27
|
private Logger logger = Logger.getLogger(RegisterServiceServlet.class);
|
28
|
|
29
|
public void init(ServletConfig config) throws ServletException {
|
30
|
super.init(config);
|
31
|
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
|
32
|
config.getServletContext());
|
33
|
}
|
34
|
|
35
|
@Autowired
|
36
|
private RegisteredServicesUtils registeredServicesUtils;
|
37
|
|
38
|
public void doGet(HttpServletRequest request, HttpServletResponse response)
|
39
|
throws ServletException, IOException {
|
40
|
|
41
|
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
|
42
|
getContext().getAuthentication();
|
43
|
|
44
|
//Careful! Redirects in method
|
45
|
checkNumberOfRegisteredServices(request, response, authentication);
|
46
|
|
47
|
response.setContentType("text/html");
|
48
|
StringBuilder name = new StringBuilder().append(authentication.getUserInfo().getGivenName().charAt(0));
|
49
|
name.append(authentication.getUserInfo().getFamilyName().charAt(0));
|
50
|
request.getSession().setAttribute("name", name.toString());
|
51
|
request.getRequestDispatcher("./registerService.jsp").include(request, response);
|
52
|
}
|
53
|
|
54
|
public void doPost(HttpServletRequest request, HttpServletResponse response)
|
55
|
throws ServletException, IOException {
|
56
|
|
57
|
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
|
58
|
getContext().getAuthentication();
|
59
|
|
60
|
boolean canProceed = true;
|
61
|
|
62
|
//Careful! Redirects in method
|
63
|
checkNumberOfRegisteredServices(request, response, authentication);
|
64
|
|
65
|
String name = request.getParameter("first_name").trim();
|
66
|
String description = request.getParameter("description").trim();
|
67
|
String keyType = request.getParameter("key_radio").trim();
|
68
|
String jwksUri = null;
|
69
|
String jwksString = null;
|
70
|
Jwks jwks = null;
|
71
|
|
72
|
|
73
|
if (keyType.equals("uri")) {
|
74
|
jwksUri = request.getParameter("uri");
|
75
|
String[] schemes = {"https"};
|
76
|
UrlValidator urlValidator = new UrlValidator(schemes);
|
77
|
if (!urlValidator.isValid(jwksUri)){
|
78
|
request.getSession().setAttribute("msg_key_uri_error_display", "display:block");
|
79
|
canProceed = false;
|
80
|
}
|
81
|
} else {
|
82
|
jwksString = request.getParameter("value");
|
83
|
try {
|
84
|
Gson gson = new GsonBuilder().registerTypeAdapter(Jwks.class, new JwksDeserializer()).create();
|
85
|
String jwksSet = String.format("{\"keys\":[%s]}", jwksString);
|
86
|
jwks = gson.fromJson(jwksSet, Jwks.class);
|
87
|
if (jwks.getKeys() == null || jwks.getKeys().length == 0) {
|
88
|
System.out.println("Something wrong with the keys.");
|
89
|
request.getSession().setAttribute("msg_key_value_error_display", "display:block");
|
90
|
canProceed = false;
|
91
|
}
|
92
|
} catch (JsonParseException jpe) {
|
93
|
request.getSession().setAttribute("msg_key_value_error_display", "display:block");
|
94
|
canProceed = false;
|
95
|
}
|
96
|
}
|
97
|
|
98
|
String userid = authentication.getSub();
|
99
|
String email = authentication.getUserInfo().getEmail();
|
100
|
String accessToken = authentication.getAccessTokenValue();
|
101
|
|
102
|
ServiceResponse serviceResponse = null;
|
103
|
|
104
|
if (nameIsValid(name) && userInfoIsValid(userid, email) && keyIsValid(keyType, jwksUri, jwksString) && canProceed) {
|
105
|
String serverRequestJSON;
|
106
|
String serverMessage;
|
107
|
|
108
|
if (keyType.equals("uri")){
|
109
|
serverRequestJSON = createServiceJson(name, description, email, jwksUri);
|
110
|
} else {
|
111
|
serverRequestJSON = createServiceJson(name, description, email, jwks);
|
112
|
}
|
113
|
|
114
|
serverMessage = TokenUtils.registerService(serverRequestJSON, accessToken);
|
115
|
|
116
|
if (serverMessage == null) {
|
117
|
request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
|
118
|
response.sendRedirect("./registeredServices");
|
119
|
}
|
120
|
serviceResponse = new Gson().fromJson(serverMessage, ServiceResponse.class);
|
121
|
String aai_id = serviceResponse.getId();
|
122
|
String owner = userid;
|
123
|
|
124
|
RegisteredService registeredService = new RegisteredService(aai_id, owner, name);
|
125
|
|
126
|
try {
|
127
|
registeredServicesUtils.addRegistedService(registeredService);
|
128
|
request.getSession().setAttribute("success", "Your service has been successfully registered!");
|
129
|
|
130
|
} catch (SQLException sqle) {
|
131
|
logger.error("Fail to save service.", sqle);
|
132
|
request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
|
133
|
response.sendRedirect("./registeredServices");
|
134
|
return;
|
135
|
}
|
136
|
|
137
|
} else {
|
138
|
//something is wrong with the form and the error messages will appear
|
139
|
request.getSession().setAttribute("first_name", name);
|
140
|
request.getSession().setAttribute("description", description);
|
141
|
request.getSession().setAttribute("key_radio", keyType);
|
142
|
request.getSession().setAttribute("uri", jwksUri);
|
143
|
request.getSession().setAttribute("value", jwksString);
|
144
|
|
145
|
response.sendRedirect("./registerService");
|
146
|
return;
|
147
|
}
|
148
|
|
149
|
response.sendRedirect("./registeredServices");
|
150
|
}
|
151
|
|
152
|
private boolean keyIsValid(String keyType, String jwksUri, String jwksString) {
|
153
|
return (keyType.equals("uri") && jwksUri != null && !jwksUri.isEmpty()) ||
|
154
|
keyType.equals("value") && jwksString != null && !jwksString.isEmpty();
|
155
|
}
|
156
|
|
157
|
private boolean userInfoIsValid(String userid, String email) {
|
158
|
return userid != null && !userid.isEmpty() &&
|
159
|
email != null && !email.isEmpty();
|
160
|
}
|
161
|
|
162
|
private boolean nameIsValid(String name) {
|
163
|
return name != null && !name.isEmpty();
|
164
|
}
|
165
|
|
166
|
private void checkNumberOfRegisteredServices(HttpServletRequest request, HttpServletResponse response, OIDCAuthenticationToken authentication) throws IOException {
|
167
|
try {
|
168
|
long numberOfRegisteredServices =
|
169
|
registeredServicesUtils.getRegisteredServiceDao().countRegisteredServices(authentication.getSub());
|
170
|
|
171
|
if (numberOfRegisteredServices >= 5) {
|
172
|
response.sendRedirect("./registeredServices"); // The message there already exists.
|
173
|
}
|
174
|
|
175
|
} catch (SQLException sqle) {
|
176
|
logger.error("Unable to count registered services.", sqle);
|
177
|
request.getSession().setAttribute("message", "Unable to contact DB. Please try again later.");
|
178
|
response.sendRedirect("./registeredServices");
|
179
|
return;
|
180
|
}
|
181
|
}
|
182
|
|
183
|
private static String createServiceJson(String name, String description, String email, String jwksURI) {
|
184
|
ServiceRequest serviceJSON = new ServiceRequest();
|
185
|
serviceJSON.setClientName(name);
|
186
|
serviceJSON.setClientDescription(description);
|
187
|
serviceJSON.setContacts(new String[]{email});
|
188
|
serviceJSON.setJwksUri(jwksURI);
|
189
|
|
190
|
GsonBuilder builder = new GsonBuilder();
|
191
|
builder.serializeNulls();
|
192
|
Gson gson = builder.create();
|
193
|
System.out.println("Created json " +serviceJSON);
|
194
|
return gson.toJson(serviceJSON);
|
195
|
}
|
196
|
|
197
|
private static String createServiceJson(String name, String description, String email, Jwks jwks) {
|
198
|
ServiceRequest serviceJSON = new ServiceRequest();
|
199
|
serviceJSON.setClientName(name);
|
200
|
serviceJSON.setClientDescription(description);
|
201
|
serviceJSON.setContacts(new String[]{email});
|
202
|
serviceJSON.setJwksType("VAL");
|
203
|
serviceJSON.setJwks(jwks);
|
204
|
|
205
|
GsonBuilder builder = new GsonBuilder();
|
206
|
builder.serializeNulls();
|
207
|
Gson gson = builder.create();
|
208
|
System.out.println("Created json " +serviceJSON);
|
209
|
return gson.toJson(serviceJSON);
|
210
|
}
|
211
|
|
212
|
}
|