Register service almost ready

This commit is contained in:
Katerina Iatropoulou 2020-10-20 13:13:40 +00:00
parent f8c42c89ee
commit 9a913773ee
6 changed files with 143 additions and 94 deletions

View File

@ -8,6 +8,7 @@ import eu.dnetlib.openaire.usermanagement.utils.TokenUtils;
import org.apache.commons.validator.routines.UrlValidator;
import org.apache.log4j.Logger;
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.omg.CORBA.ServerRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
@ -37,6 +38,13 @@ public class RegisterServiceServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
getContext().getAuthentication();
//Careful! Redirects in method
checkNumberOfRegisteredServices(request, response, authentication);
response.setContentType("text/html");
request.getRequestDispatcher("./registerService.jsp").include(request, response);
}
@ -44,73 +52,139 @@ public class RegisterServiceServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//TODO check user's limit
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
getContext().getAuthentication();
response.setContentType("text/html");
boolean canProceed = true;
//Careful! Redirects in method
checkNumberOfRegisteredServices(request, response, authentication);
String name = request.getParameter("first_name").trim();
String description = request.getParameter("description").trim();
String keyType = request.getParameter("key_radio").trim();
System.out.println("key type " + keyType);
/*
String jwksUri = null;
String jwksString = null;
Jwks jwks = null;
if (keyType.equals("uri")) {
String jwksUri = request.getParameter("uri");
System.out.println("JWKS URI " + jwksUri);
jwksUri = request.getParameter("uri");
UrlValidator urlValidator = new UrlValidator();
if (!urlValidator.isValid(jwksUri)){
System.out.println("Not valid? " + jwksUri);
request.getSession().setAttribute("msg_key_uri_error_display", "display:block");
canProceed = false;
}
} else {
String jwksString = request.getParameter("value");
System.out.println("JWKS String " + jwksString);
Gson gson = new GsonBuilder().registerTypeAdapter(Jwks.class, new ServiceResponseDeserializer()).create();
Jwks jwks = gson.fromJson(jwksString, Jwks.class);
System.out.println(jwks.keys);
System.out.println(jwks.keys.length);
jwksString = request.getParameter("value");
Gson gson = new GsonBuilder().registerTypeAdapter(Jwks.class, new JwksDeserializer()).create();
jwks = gson.fromJson(jwksString, Jwks.class);
if (jwks.getKeys()==null || jwks.getKeys().length==0) {
request.getSession().setAttribute("msg_key_value_error_display", "display:block");
canProceed = false;
}
}
*/
OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
String userid = authentication.getSub();
String email = authentication.getUserInfo().getEmail();
String accessToken = authentication.getAccessTokenValue();
ServiceResponse serviceResponse = null;
if ( name!= null && !name.isEmpty() && userid != null && !userid.isEmpty() &&
email != null && !email.isEmpty()) {
String serverMessage = TokenUtils.registerService(userid, name, description, email, accessToken);
System.out.println("Server message" + serverMessage);
if (nameIsValid(name) && userInfoIsValid(userid, email) && keyIsValid(keyType, jwksUri, jwksString) && canProceed) {
String serverRequestJSON;
String serverMessage;
if (keyType.equals("uri")){
serverRequestJSON = createServiceJson(name, description, email, jwksUri);
} else {
serverRequestJSON = createServiceJson(name, description, email, jwks);
}
serverMessage = TokenUtils.registerService(serverRequestJSON, accessToken);
if (serverMessage == null) {
request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
response.sendRedirect("./registeredServices");
}
serviceResponse = new Gson().fromJson(serverMessage, ServiceResponse.class);
System.out.println("SERVICE RESPONSE " + serviceResponse);
String aai_id = serviceResponse.getId();
String owner = userid;
}
RegisteredService registeredService = new RegisteredService(aai_id, owner, name);
String aai_id = serviceResponse.getId();
String owner = userid;
try {
registeredServicesUtils.addRegistedService(registeredService);
RegisteredService registeredService = new RegisteredService(aai_id, owner, name);
} catch (SQLException sqle) {
logger.error("Fail to save service.", sqle);
request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
response.sendRedirect("./registeredServices");
}
try {
registeredServicesUtils.addRegistedService(registeredService);
} catch (SQLException sqle) {
System.out.println("SQLE SKATA " + sqle.getMessage());
logger.error("SQLE SKATA", sqle);
request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
} else {
//something is wrong with the form and the error messages will appear
response.sendRedirect("./registeredServices");
}
request.getSession().setAttribute("accessToken", authentication.getAccessTokenValue());
request.getSession().setAttribute("refreshToken", authentication.getRefreshTokenValue());
response.sendRedirect("./registeredServices");
}
private boolean keyIsValid(String keyType, String jwksUri, String jwksString) {
return (keyType.equals("uri") && jwksUri != null && !jwksUri.isEmpty()) ||
keyType.equals("value") && jwksString != null && !jwksString.isEmpty();
}
private boolean userInfoIsValid(String userid, String email) {
return userid != null && !userid.isEmpty() &&
email != null && !email.isEmpty();
}
private boolean nameIsValid(String name) {
return name != null && !name.isEmpty();
}
private void checkNumberOfRegisteredServices(HttpServletRequest request, HttpServletResponse response, OIDCAuthenticationToken authentication) throws IOException {
try {
long numberOfRegisteredServices =
registeredServicesUtils.getRegisteredServiceDao().countRegisteredServices(authentication.getSub());
if (numberOfRegisteredServices >= 5) {
response.sendRedirect("./registeredServices"); // The message there already exists.
}
} catch (SQLException sqle) {
logger.error("Unable to count registered services.", sqle);
request.getSession().setAttribute("message", "Unable to contact DB. Please try again later.");
response.sendRedirect("./registeredServices");
}
}
private static String createServiceJson(String name, String description, String email, String jwksURI) {
ServiceRequest serviceJSON = new ServiceRequest();
serviceJSON.setClientName(name);
serviceJSON.setClientDescription(description);
serviceJSON.setContacts(new String[]{email});
serviceJSON.setJwksUri(jwksURI);
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Gson gson = builder.create();
System.out.println("Created json " +serviceJSON);
return gson.toJson(serviceJSON);
}
private static String createServiceJson(String name, String description, String email, Jwks jwks) {
ServiceRequest serviceJSON = new ServiceRequest();
serviceJSON.setClientName(name);
serviceJSON.setClientDescription(description);
serviceJSON.setContacts(new String[]{email});
serviceJSON.setJwksType("VAL");
serviceJSON.setJwks(jwks);
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Gson gson = builder.create();
System.out.println("Created json " +serviceJSON);
return gson.toJson(serviceJSON);
}
}

View File

@ -180,7 +180,7 @@ public class RegisterServlet extends HttpServlet {
request.getSession().setAttribute("message","Error sending email");
response.sendRedirect(UrlConstructor.getRedirectUrl(request, ".register.jsp"));
//TODO better handling of these exceprions
//TODO better handling of these exceptions
} catch (Exception e) {
logger.error("LDAP error in creating user", e);
response.sendRedirect(UrlConstructor.getRedirectUrl(request, "error.jsp"));

View File

@ -53,7 +53,7 @@ public class RegisteredServicesServlet extends HttpServlet {
try {
registeredServices = registeredServicesUtils.
getRegisteredServiceDao().fetchAllRegisteredServicesByOwner(userId);
System.out.println("LOAD REGISTERED SERVICES. " + registeredServices);
System.out.println("LOAD REGISTERED SERVICES. " + registeredServices.size());
} catch (SQLException sqle) {
@ -118,7 +118,6 @@ public class RegisteredServicesServlet extends HttpServlet {
request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
}
System.out.println("HERE");
String aai_id = registeredService.getAai_id();
HttpResponse resp = TokenUtils.deleteService(aai_id, authentication.getAccessTokenValue());
@ -141,18 +140,13 @@ public class RegisteredServicesServlet extends HttpServlet {
} catch (SQLException sqle) {
logger.error("Unable to contact db.", sqle);
request.getSession().setAttribute("message", "Fail to delete the service. Please try again later.");
response.setContentType("text/html");
request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
}
} else {
System.out.println("SO WRONG ID...");
request.getSession().setAttribute("message", "Error selecting service to delete. Please try again.");
}
System.out.println("FINALLY ");
response.setContentType("text/html");
request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
response.sendRedirect("./registeredServices");
}
private boolean reachedMaximumNumberOfServices(List<RegisteredService> registeredServices) {

View File

@ -13,14 +13,14 @@ public class ServiceRequest {
String logoUri;
String policyUri;
String[] contacts;
String[] scope = new String[]{"orcid", "openid", "email", "eduperson_entitlement", "profile", "offline_access"};
String[] scope = new String[]{"openid"};
String[] grantTypes = new String[] {"client_credentials"};
boolean allowIntrospection = true;
String tokenEndpointAuthMethod = "PRIVATE KEY";
String tokenEndpointAuthSigningAlg = "RS256";
String jwksType = "VAL";
String jwksType;
String jwksUri;
Jwks jwks = new Jwks();
Jwks jwks;
boolean allowRefresh = false;
boolean reuseRefreshToken = true;
boolean clearAccessTokensOnRefresh = true;
@ -137,24 +137,29 @@ public class ServiceRequest {
this.jwksUri = jwksUri;
}
public static void main(String[] args) {
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Gson gson = builder.create();
String json = gson.toJson(new ServiceRequest());
System.out.println(json);
public Jwks getJwks() {
return jwks;
}
public void setJwks(Jwks jwks) {
this.jwks = jwks;
}
}
class Jwks implements Serializable {
Key[] keys = new Key[]{new Key()};
Key[] keys;
public Key[] getKeys() {
return keys;
}
public void setKeys(Key[] keys) {
this.keys = keys;
}
}
class Key implements Serializable {
/* String kty;
String kty;
String e;
String kid;
String alg;
@ -199,16 +204,9 @@ class Key implements Serializable {
public void setN(String n) {
this.n = n;
}
*/
String kty = "RSA";
String e = "AQAB";
String kid = "05794a3c-a6f5-430c-9822-da4e53597ba5";
String alg = "RS256";
String n = "hm_OUny05OJEwbGBqPjE7wWvnwTMgqUHJFis_S9nM7hTivXQ_LX9f89RaVcPpXboox81Y8rrfuVwV0nc-FGr_" +
"E0FFpI-IwJ_sUUEDwf-5Qxor3LNc_S_5BiPOfFHY7c-R-ablRIAvVTXqwIjcyLVQnaHLjb9XQPf9lBt9sCZ2jN-" +
"9HOLztMO3BZWZYIFqvNr8ySKHfVPdlk0Wx3N45KPY0kgxk5RPYW0HLRakSlhIJtqYCJOr2IiDUEMAj9Z9BoWjeUKiAX3E3ZRo-" +
"DO1TWcc7feq-0Pei2IBw3lvNpgcBBv1_BlrsZYzQqkKOcDbLAppuhR3inUNhc3G67OuWt8ow";
}

View File

@ -3,6 +3,7 @@ package eu.dnetlib.openaire.usermanagement.utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import eu.dnetlib.openaire.user.pojos.RegisteredService;
import eu.dnetlib.openaire.usermanagement.ServiceRequest;
import eu.dnetlib.openaire.usermanagement.ServiceResponse;
import org.apache.commons.io.IOUtils;
@ -16,6 +17,7 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger;
import org.omg.CORBA.ServerRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
@ -31,16 +33,14 @@ public class TokenUtils {
private Logger logger = Logger.getLogger(TokenUtils.class);
public static String registerService(String userId, String name, String description, String email, String accessToken)
public static String registerService(String serverRequestJSON, String accessToken)
throws IOException {
String json = createServiceJson(name, description);
//TODO fix this
HttpPost httppost = new HttpPost("https://openaire-dev.aai-dev.grnet.gr/oidc/api/clients");
httppost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httppost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
StringEntity params = new StringEntity(json.toString());
StringEntity params = new StringEntity(serverRequestJSON.toString());
httppost.setEntity(params);
CloseableHttpClient httpclient = HttpClients.createDefault();
@ -57,7 +57,9 @@ public class TokenUtils {
public static HttpResponse updateService(String serviceId, String userId, String name, String description, String email, String accessToken) throws IOException {
System.out.println("Updated name " + name);
System.out.println("Updated description " + description);
String json = createServiceJson(name, description);
//TODO FIX THIS!!!
//String json = createServiceJson(name, description);
String json ="";
HttpPut httpPut = new HttpPut("https://openaire-dev.aai-dev.grnet.gr/oidc/api/clients/"+serviceId);
httpPut.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
@ -96,17 +98,4 @@ public class TokenUtils {
getRegisteredService(serviceId, accessToken);
}
}
private static String createServiceJson(String name, String description) {
ServiceRequest serviceJSON = new ServiceRequest();
serviceJSON.setClientName(name);
serviceJSON.setClientDescription(description);
GsonBuilder builder = new GsonBuilder();
builder.serializeNulls();
Gson gson = builder.create();
System.out.println("Created json " +serviceJSON);
return gson.toJson(serviceJSON);
}
}

View File

@ -145,10 +145,10 @@
<div id="value_input">
<span class="msg_key_value_error uk-text-danger uk-text-small uk-float-left" style='${msg_key_value_error_display}'>Please provide a valid JSON.</span>
<textarea id="value" name="value" type="textarea" placeholder='{"keys":[]}' class="form-control uk-textarea" rows="10"></textarea>
<textarea id="value" name="value" type="textarea" placeholder='{"keys":[]}' class="form-control uk-textarea" rows="10">{"keys":[]}</textarea>
</div>
<div id="uri_input" style="display:none;">
<span class="msg_key_uri_error uk-text-danger uk-text-small uk-float-left" style='${msg_key_uri_error_display}'>Please provide a valid URI.</span>
<span class="msg_key_uri_error uk-text-danger uk-text-small uk-float-left" style='${msg_key_uri_error_display}'>Please provide a valid URI (do not forget the protocol! https://...)</span>
<input id="uri" name="uri" type="text" placeholder="https://" class="form-control" value="${jwksUri}">
</div>
</div>
@ -221,13 +221,7 @@
function validateURI() {
if ($("#uri").val() != undefined && $("#uri").val()!=="") {
var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
return !!pattern.test($("#uri").val());
return /^(?:(?:(?:https):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test($("#uri").val());
}
return false;
}