package org.akaza.openclinica.service.pmanage; import java.net.MalformedURLException; import java.net.URL; import javax.servlet.http.HttpSession; import org.akaza.openclinica.bean.login.ParticipantDTO; import org.akaza.openclinica.dao.core.CoreResources; import org.apache.commons.lang.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; public class ParticipantPortalRegistrar { protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); public static final String AVAILABLE = "available"; public static final String UNAVAILABLE = "unavailable"; public static final String INVALID = "invalid"; public static final String UNKNOWN = "unknown"; public static final int PARTICIPATE_READ_TIMEOUT = 5000; public Authorization getAuthorization(String studyOid) { String ocUrl = CoreResources.getField("sysURL.base") + "rest2/openrosa/" + studyOid; String pManageUrl = CoreResources.getField("portalURL") + "/app/rest/oc/authorizations?studyoid=" + studyOid + "&instanceurl=" + ocUrl; HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(PARTICIPATE_READ_TIMEOUT); RestTemplate rest = new RestTemplate(requestFactory); try { Authorization[] response = rest.getForObject(pManageUrl, Authorization[].class); if (response.length > 0 && response[0].getAuthorizationStatus() != null) return response[0]; } catch (Exception e) { logger.error(e.getMessage()); logger.error(ExceptionUtils.getStackTrace(e)); } return null; } public String getCachedRegistrationStatus(String studyOid, HttpSession session) throws Exception { String regStatus = (String) session.getAttribute("pManageRegistrationStatus"); if (regStatus == null) { regStatus = getRegistrationStatus(studyOid); session.setAttribute("pManageRegistrationStatus", regStatus); } return regStatus; } public String getRegistrationStatus(String studyOid) throws Exception { return loadRegistrationStatus(studyOid); } private String loadRegistrationStatus(String studyOid) { String ocUrl = CoreResources.getField("sysURL.base") + "rest2/openrosa/" + studyOid; String pManageUrl = CoreResources.getField("portalURL") + "/app/rest/oc/authorizations?studyoid=" + studyOid + "&instanceurl=" + ocUrl; HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(PARTICIPATE_READ_TIMEOUT); RestTemplate rest = new RestTemplate(requestFactory); try { Authorization[] response = rest.getForObject(pManageUrl, Authorization[].class); if (response.length > 0 && response[0].getAuthorizationStatus() != null) return response[0].getAuthorizationStatus().getStatus(); } catch (Exception e) { logger.error(e.getMessage()); logger.debug(ExceptionUtils.getStackTrace(e)); } return ""; } public String getHostNameAvailability(String hostName) { String pManageUrl = CoreResources.getField("portalURL") + "/app/permit/studys/name?hostName=" + hostName; HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(PARTICIPATE_READ_TIMEOUT); RestTemplate rest = new RestTemplate(requestFactory); String response = null; try { if (!validHostNameCheck(hostName)) return INVALID; response = rest.getForObject(pManageUrl, String.class); if (response.equals("UNAVAILABLE")) return UNAVAILABLE; else if (response.equals("INVALID")) return INVALID; else if (response.equals("AVAILABLE")) return AVAILABLE; } catch (Exception e) { logger.error(e.getMessage()); logger.error(ExceptionUtils.getStackTrace(e)); } return UNKNOWN; } public boolean validHostNameCheck(String hostName) { String pManageBaseUrl = CoreResources.getField("portalURL"); if (hostName.contains(".")) return false; try { URL baseUrl = new URL(pManageBaseUrl); String port = ""; if (baseUrl.getPort() > 0) port = ":" + String.valueOf(baseUrl.getPort()); // Check that hostname makes a valid URL URL customerUrl = new URL(baseUrl.getProtocol() + "://" + hostName + "." + baseUrl.getHost() + port); // Check that hostname only contains alphanumeric characters and/or hyphens if (hostName.matches("^[A-Za-z0-9-]+$")) return true; } catch (MalformedURLException mue) { logger.error("Error validating customer selected Participate subdomain."); logger.error(mue.getMessage()); logger.error(ExceptionUtils.getStackTrace(mue)); } return false; } public String registerStudy(String studyOid) { return registerStudy(studyOid, null, null); } public String sendEmailThruMandrillViaOcui(ParticipantDTO participantDTO, String hostname) { String host = hostname.substring(0,hostname.indexOf("/#/login")); String pManageUrl =host + "/app/rest/oc/email"; HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(PARTICIPATE_READ_TIMEOUT); RestTemplate rest = new RestTemplate(requestFactory); try { ParticipantDTO response = rest.postForObject(pManageUrl, participantDTO, ParticipantDTO.class); } catch (Exception e) { logger.error(e.getMessage()); logger.error(ExceptionUtils.getStackTrace(e)); } return ""; } public String registerStudy(String studyOid, String hostName, String studyName) { String ocUrl = CoreResources.getField("sysURL.base") + "rest2/openrosa/" + studyOid; String pManageUrl = CoreResources.getField("portalURL") + "/app/rest/oc/authorizations?studyoid=" + studyOid + "&instanceurl=" + ocUrl; Authorization authRequest = new Authorization(); Study authStudy = new Study(); authStudy.setStudyOid(studyOid); authStudy.setInstanceUrl(ocUrl); authStudy.setHost(hostName); authStudy.setStudyName(studyName); authStudy.setOpenClinicaVersion(CoreResources.getField("OpenClinica.version")); authRequest.setStudy(authStudy); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(PARTICIPATE_READ_TIMEOUT); RestTemplate rest = new RestTemplate(requestFactory); try { Authorization response = rest.postForObject(pManageUrl, authRequest, Authorization.class); if (response != null && response.getAuthorizationStatus() != null) return response.getAuthorizationStatus().getStatus(); } catch (Exception e) { logger.error(e.getMessage()); logger.error(ExceptionUtils.getStackTrace(e)); } return ""; } public String getStudyHost(String studyOid) throws Exception { String ocUrl = CoreResources.getField("sysURL.base") + "rest2/openrosa/" + studyOid; String pManageUrl = CoreResources.getField("portalURL"); String pManageUrlFull = pManageUrl + "/app/rest/oc/authorizations?studyoid=" + studyOid + "&instanceurl=" + ocUrl; HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setReadTimeout(PARTICIPATE_READ_TIMEOUT); RestTemplate rest = new RestTemplate(requestFactory); try { Authorization[] response = rest.getForObject(pManageUrlFull, Authorization[].class); if (response.length > 0 && response[0].getStudy() != null && response[0].getStudy().getHost() != null && !response[0].getStudy().getHost().equals("")) { URL url = new URL(pManageUrl); String port = ""; if (url.getPort() > 0) port = ":" + String.valueOf(url.getPort()); return url.getProtocol() + "://" + response[0].getStudy().getHost() + "." + url.getHost() + port + "/#/login"; } } catch (Exception e) { logger.error(e.getMessage()); logger.error(ExceptionUtils.getStackTrace(e)); } return ""; } }