Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r01fa7b9ff8bf04b7dbe1056d1e9e8fdd1a113410 -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java =================================================================== diff -u -r8d67a5f1ec557dbb647a229cc9a5e2b0e1057e80 -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 --- lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 8d67a5f1ec557dbb647a229cc9a5e2b0e1057e80) +++ lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 744f5620f6d13c0fa4f44e42b708dbec50bfe9b4) @@ -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 =================================================================== diff -u -r7beb7f8d17463cda4e2606d341bc90317de0e3c6 -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java (.../LearningDesignRepositoryServlet.java) (revision 7beb7f8d17463cda4e2606d341bc90317de0e3c6) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LearningDesignRepositoryServlet.java (.../LearningDesignRepositoryServlet.java) (revision 744f5620f6d13c0fa4f44e42b708dbec50bfe9b4) @@ -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 =================================================================== diff -u -rd482b1856cc5a727c847b609954b2f4b435f3d30 -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision d482b1856cc5a727c847b609954b2f4b435f3d30) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision 744f5620f6d13c0fa4f44e42b708dbec50bfe9b4) @@ -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 =================================================================== diff -u -r0d275bf753620ae71aeb4e7589c540c9777532cb -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 744f5620f6d13c0fa4f44e42b708dbec50bfe9b4) @@ -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 =================================================================== diff -u -rb72aa2c6f30c93631bc52d01258c8b2be200f233 -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision b72aa2c6f30c93631bc52d01258c8b2be200f233) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 744f5620f6d13c0fa4f44e42b708dbec50bfe9b4) @@ -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 =================================================================== diff -u -rc6867c1780952042c1c587da64b3002b60b31c85 -r744f5620f6d13c0fa4f44e42b708dbec50bfe9b4 --- lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java (.../LoginRequestDispatcher.java) (revision c6867c1780952042c1c587da64b3002b60b31c85) +++ lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java (.../LoginRequestDispatcher.java) (revision 744f5620f6d13c0fa4f44e42b708dbec50bfe9b4) @@ -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";