Index: lams_build/lib/lams/lams.jar =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams.jar,v diff -u -r1.422 -r1.423 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java,v diff -u -r1.23 -r1.24 --- lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java 5 Aug 2014 22:33:12 -0000 1.23 +++ lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java 12 Sep 2014 19:45:45 -0000 1.24 @@ -49,6 +49,7 @@ import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.util.CentralConstants; +import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -99,6 +100,8 @@ String langIsoCode = request.getParameter(LoginRequestDispatcher.PARAM_LANGUAGE); String courseName = request.getParameter(CentralConstants.PARAM_COURSE_NAME); String usePrefix = request.getParameter(CentralConstants.PARAM_USE_PREFIX); + boolean isUpdateUserDetails = WebUtil.readBooleanParam(request, + LoginRequestDispatcher.PARAM_IS_UPDATE_USER_DETAILS, false); // implicit login params String firstName = request.getParameter(LoginRequestDispatcher.PARAM_FIRST_NAME); @@ -128,7 +131,7 @@ userMap = getService().getExtUserUseridMap(serverMap, extUsername, prefix); } else { userMap = getService().getImplicitExtUserUseridMap(serverMap, extUsername, firstName, lastName, - langIsoCode, countryIsoCode, email, prefix); + langIsoCode, countryIsoCode, email, prefix, isUpdateUserDetails); } //in case of request for learner with strict authentication check cache should also contain lsid Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java,v diff -u -r1.15 -r1.16 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java 25 Feb 2014 22:57:22 -0000 1.15 +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java 12 Sep 2014 19:45:45 -0000 1.16 @@ -290,6 +290,7 @@ String modeStr = request.getParameter(CentralConstants.PARAM_MODE); String method = request.getParameter(CentralConstants.PARAM_METHOD); String usePrefix = request.getParameter(CentralConstants.PARAM_USE_PREFIX); + final boolean isUpdateUserDetails = false; String firstName = request.getParameter(LoginRequestDispatcher.PARAM_FIRST_NAME); String lastName = request.getParameter(LoginRequestDispatcher.PARAM_LAST_NAME); @@ -333,7 +334,7 @@ userMap = integrationService.getExtUserUseridMap(serverMap, username, prefix); } else { userMap = integrationService.getImplicitExtUserUseridMap(serverMap, username, firstName, lastName, - lang, country, email, prefix); + lang, country, email, prefix, isUpdateUserDetails); } // create group for external course if necessary @@ -356,7 +357,7 @@ userMap = integrationService.getExtUserUseridMap(serverMap, username, prefix); } else { userMap = integrationService.getImplicitExtUserUseridMap(serverMap, username, firstName, lastName, - lang, country, email, prefix); + lang, country, email, prefix, isUpdateUserDetails); } // create group for external course if necessary Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java,v diff -u -r1.48 -r1.49 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java 15 Jul 2014 08:05:46 -0000 1.48 +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java 12 Sep 2014 19:45:45 -0000 1.49 @@ -752,8 +752,9 @@ userMap = LessonManagerServlet.integrationService.getExtUserUseridMap(serverMap, username); } else { final boolean usePrefix = true; + final boolean isUpdateUserDetails = false; userMap = LessonManagerServlet.integrationService.getImplicitExtUserUseridMap(serverMap, username, - firstName, lastName, langIsoCode, countryIsoCode, email, usePrefix); + firstName, lastName, langIsoCode, countryIsoCode, email, usePrefix, isUpdateUserDetails); } // ExtUserUseridMap userMap = LessonManagerServlet.integrationService.getExtUserUseridMap(serverMap, Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java,v diff -u -r1.15 -r1.16 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java 8 Apr 2014 15:26:47 -0000 1.15 +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java 12 Sep 2014 19:45:42 -0000 1.16 @@ -58,18 +58,47 @@ ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) throws UserInfoFetchException, UserInfoValidationException; + /** + * compatibility method to support existing integrations. It does callback call to integrated server to get user details. + * + * @param serverMap + * @param extUsername + * @return + * @throws UserInfoFetchException + * @throws UserInfoValidationException + */ ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException, UserInfoValidationException; + /** + * Returns ExtUserUseridMap from DB, and null if it doesn't exist + * + * @param serverMap + * @param extUsername + * @return + */ ExtUserUseridMap getExistingExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException; ExtServerOrgMap getExtServerOrgMap(Integer sid); ExtServerOrgMap getExtServerOrgMap(String serverId); + /** + * @param serverMap + * @param extUsername + * @param firstName + * @param lastName + * @param language + * @param country + * @param email + * @param prefix + * @param isUpdateUserDetails whether user details should be updated with provided parameters + * @return + * @throws UserInfoValidationException + */ ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String firstName, - String lastName, String language, String country, String email, boolean prefix) + String lastName, String language, String country, String email, boolean prefix, boolean isUpdateUserDetails) throws UserInfoValidationException; ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String password, Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java,v diff -u -r1.33 -r1.34 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java 9 Apr 2014 15:54:12 -0000 1.33 +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java 12 Sep 2014 19:45:43 -0000 1.34 @@ -205,64 +205,104 @@ } } + @Override public ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) throws UserInfoFetchException, UserInfoValidationException { - Map properties = new HashMap(); - properties.put("extServerOrgMap.sid", serverMap.getSid()); - properties.put("extUsername", extUsername); - List list = service.findByProperties(ExtUserUseridMap.class, properties); - if (list == null || list.size() == 0) { - return createExtUserUseridMap(serverMap, extUsername, prefix); + ExtUserUseridMap extUserUseridMap = getExistingExtUserUseridMap(serverMap, extUsername); + + if (extUserUseridMap == null) { + String[] userData = getUserDataFromExtServer(serverMap, extUsername); + String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10)); + return createExtUserUseridMap(serverMap, extUsername, password, userData, prefix); } else { - return (ExtUserUseridMap) list.get(0); + return extUserUseridMap; } } + @Override public ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException, UserInfoValidationException { return getExtUserUseridMap(serverMap, extUsername, true); } - public ExtUserUseridMap getExistingExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) - throws UserInfoFetchException { + @Override + public ExtUserUseridMap getExistingExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) { Map properties = new HashMap(); properties.put("extServerOrgMap.sid", serverMap.getSid()); properties.put("extUsername", extUsername); - List list = service.findByProperties(ExtUserUseridMap.class, properties); + List list = service.findByProperties(ExtUserUseridMap.class, properties); + if (list == null || list.size() == 0) { return null; } else { return (ExtUserUseridMap) list.get(0); } } + @Override public ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String password, String firstName, String lastName, String email) throws UserInfoValidationException { - Map properties = new HashMap(); - properties.put("extServerOrgMap.sid", serverMap.getSid()); - properties.put("extUsername", extUsername); - List list = service.findByProperties(ExtUserUseridMap.class, properties); - if (list == null || list.size() == 0) { + ExtUserUseridMap extUserUseridMap = getExistingExtUserUseridMap(serverMap, extUsername); + + if (extUserUseridMap == null) { String[] defaultLangCountry = LanguageUtil.getDefaultLangCountry(); String[] userData = { "", firstName, lastName, "", "", "", "", "", "", "", "", email, defaultLangCountry[1], defaultLangCountry[0] }; return createExtUserUseridMap(serverMap, extUsername, password, userData, false); } else { - return (ExtUserUseridMap) list.get(0); + return extUserUseridMap; } } + @Override public ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, - String firstName, String lastName, String language, String country, String email, boolean prefix) - throws UserInfoValidationException { - Map properties = new HashMap(); - properties.put("extServerOrgMap.sid", serverMap.getSid()); - properties.put("extUsername", extUsername); - List list = service.findByProperties(ExtUserUseridMap.class, properties); - if (list == null || list.size() == 0) { - return createImplicitExtUserUseridMap(serverMap, extUsername, firstName, lastName, language, country, email, prefix); + String firstName, String lastName, String language, String country, String email, boolean prefix, + boolean isUpdateUserDetails) throws UserInfoValidationException { + + ExtUserUseridMap extUserUseridMap = getExistingExtUserUseridMap(serverMap, extUsername); + + //create new one if it doesn't exist yet + if (extUserUseridMap == null) { + String[] userData = { "", firstName, lastName, "", "", "", "", "", "", "", "", email, country, language }; + String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10)); + return createExtUserUseridMap(serverMap, extUsername, password, userData, prefix); + + //update user details if it's required + } else if (isUpdateUserDetails) { + + User user = extUserUseridMap.getUser(); + + // first name validation + if (StringUtils.isNotBlank(firstName) && !ValidationUtil.isFirstLastNameValid(firstName)) { + throw new UserInfoValidationException("Can't update user details due to validation error: " + + "First name contains invalid characters. External server:" + serverMap.getServerid() + + ", Username:" + user.getLogin() + ", firstName:" + firstName + ", lastName:" + lastName); + } + // last name validation + if (StringUtils.isNotBlank(lastName) && !ValidationUtil.isFirstLastNameValid(lastName)) { + throw new UserInfoValidationException("Can't update user details due to validation error: " + + "Last name contains invalid characters. External server:" + serverMap.getServerid() + + ", Username:" + user.getLogin() + ", firstName:" + firstName + ", lastName:" + lastName); + } + // user email validation + if (StringUtils.isNotBlank(email) && !ValidationUtil.isEmailValid(email)) { + throw new UserInfoValidationException("Can't update user details due to validation error: " + + "Email format is invalid. External server:" + serverMap.getServerid() + ", Username:" + + user.getLogin() + ", firstName:" + firstName + ", lastName:" + lastName); + } + + user.setFirstName(firstName); + user.setLastName(lastName); + user.setEmail(email); + user.setModifiedDate(new Date()); + user.setLocale(LanguageUtil.getSupportedLocale(language, country)); + service.save(user); + + return extUserUseridMap; + + //simply return existing one } else { - return (ExtUserUseridMap) list.get(0); + return extUserUseridMap; } } @@ -377,23 +417,6 @@ return map; } - // compatibility method to support integrations - private ExtUserUseridMap createExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) - throws UserInfoFetchException, UserInfoValidationException { - String[] userData = getUserDataFromExtServer(serverMap, extUsername); - String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10)); - return createExtUserUseridMap(serverMap, extUsername, password, userData, prefix); - } - - // compatibility method - private ExtUserUseridMap createImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, - String firstName, String lastName, String language, String country, String email, boolean prefix) - throws UserInfoValidationException { - String[] userData = { "", firstName, lastName, "", "", "", "", "", "", "", "", email, country, language }; - String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10)); - return createExtUserUseridMap(serverMap, extUsername, password, userData, prefix); - } - private String[] getUserDataFromExtServer(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException { // the callback url must contain %username%, %timestamp% and %hash% Index: lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java,v diff -u -r1.17 -r1.18 --- lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java 5 Aug 2014 22:27:19 -0000 1.17 +++ lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java 12 Sep 2014 19:45:42 -0000 1.18 @@ -60,6 +60,8 @@ public static final String PARAM_COUNTRY = "country"; public static final String PARAM_LANGUAGE = "lang"; + + public static final String PARAM_IS_UPDATE_USER_DETAILS = "isUpdateUserDetails"; public static final String PARAM_REQUEST_SRC = "requestSrc";