Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/OrgSaveAction.java =================================================================== diff -u -rbf76df4d3f75c31132a226878461e070bd050d26 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/OrgSaveAction.java (.../OrgSaveAction.java) (revision bf76df4d3f75c31132a226878461e070bd050d26) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/OrgSaveAction.java (.../OrgSaveAction.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -49,6 +49,7 @@ import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.ValidationUtil; import org.lamsfoundation.lams.util.audit.IAuditService; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -111,14 +112,13 @@ } ActionMessages errors = new ActionMessages(); - if((orgForm.get("name")==null)||(((String)orgForm.getString("name").trim()).length()==0)){ - errors.add("name",new ActionMessage("error.name.required")); - } else { - Pattern p = Pattern.compile("^[^<>^*@%$]*$"); - Matcher m = p.matcher(orgForm.get("name").toString()); - if (!m.matches()) { - errors.add("name", new ActionMessage("error.name.invalid.characters")); - } + + //organisation name validation + String orgName = (orgForm.get("name") == null) ? null : (String) orgForm.get("name"); + if (StringUtils.isBlank(orgName)) { + errors.add("name",new ActionMessage("error.name.required")); + } else if (!ValidationUtil.isOrgNameValid(orgName)) { + errors.add("name", new ActionMessage("error.name.invalid.characters")); } if(errors.isEmpty()){ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r88e98be30293b57a81d4a8a6e5cdaf5c62e97883 -r0d275bf753620ae71aeb4e7589c540c9777532cb Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/GradebookServlet.java =================================================================== diff -u -r57ba9c3b0ef0c0b0adc976762134a5aa8a690867 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_central/src/java/org/lamsfoundation/lams/web/GradebookServlet.java (.../GradebookServlet.java) (revision 57ba9c3b0ef0c0b0adc976762134a5aa8a690867) +++ lams_central/src/java/org/lamsfoundation/lams/web/GradebookServlet.java (.../GradebookServlet.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -34,6 +34,7 @@ import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.security.AuthenticationException; import org.lamsfoundation.lams.integration.security.Authenticator; import org.lamsfoundation.lams.integration.service.IntegrationService; @@ -134,6 +135,9 @@ GradebookServlet.log.error(e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Gradebook request failed - user info fetch exception"); + } catch (UserInfoValidationException e) { + GradebookServlet.log.error(e); + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Gradebook request failed. " + e.getMessage()); } } } Index: lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java =================================================================== diff -u -r57ba9c3b0ef0c0b0adc976762134a5aa8a690867 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 57ba9c3b0ef0c0b0adc976762134a5aa8a690867) +++ lams_central/src/java/org/lamsfoundation/lams/web/LoginRequestServlet.java (.../LoginRequestServlet.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -25,9 +25,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -42,20 +39,15 @@ import org.apache.catalina.authenticator.Constants; import org.apache.log4j.Logger; -import org.lamsfoundation.lams.integration.ExtCourseClassMap; import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.security.AuthenticationException; import org.lamsfoundation.lams.integration.security.Authenticator; import org.lamsfoundation.lams.integration.service.IntegrationService; import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher; -import org.lamsfoundation.lams.usermanagement.Organisation; -import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; -import org.lamsfoundation.lams.usermanagement.UserOrganisation; -import org.lamsfoundation.lams.usermanagement.UserOrganisationRole; -import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.CentralConstants; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -129,7 +121,7 @@ } ExtServerOrgMap serverMap = getService().getExtServerOrgMap(serverId); - boolean prefix = usePrefix == null ? true : Boolean.parseBoolean(usePrefix); + boolean prefix = (usePrefix == null) ? true : Boolean.parseBoolean(usePrefix); try { ExtUserUseridMap userMap = null; if ((firstName == null) && (lastName == null)) { @@ -174,6 +166,9 @@ LoginRequestServlet.log.error("User fetch info error: ", e); response.sendError(HttpServletResponse.SC_BAD_GATEWAY, "Login Failed - failed to fetch user info from the third party server"); + } catch (UserInfoValidationException e) { + LoginRequestServlet.log.error("User validation error: ", e); + response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); } catch (FailedLoginException e) { LoginRequestServlet.log.error("Login error: ", e); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Login Failed - user was not found"); Index: lams_central/src/java/org/lamsfoundation/lams/web/OrganisationGroupServlet.java =================================================================== diff -u -rc52aeb0714241a71f1842e1e39b1363ef274e1a7 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_central/src/java/org/lamsfoundation/lams/web/OrganisationGroupServlet.java (.../OrganisationGroupServlet.java) (revision c52aeb0714241a71f1842e1e39b1363ef274e1a7) +++ lams_central/src/java/org/lamsfoundation/lams/web/OrganisationGroupServlet.java (.../OrganisationGroupServlet.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -38,6 +38,7 @@ import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.security.AuthenticationException; import org.lamsfoundation.lams.integration.security.Authenticator; import org.lamsfoundation.lams.integration.service.IntegrationService; @@ -120,6 +121,10 @@ OrganisationGroupServlet.log.error(e); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Course group action failed - user does not exist"); return; + } catch (UserInfoValidationException e) { + OrganisationGroupServlet.log.error(e); + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Course group action failed." + e.getMessage()); + return; } try { @@ -308,6 +313,8 @@ learner = userMap.getUser(); } catch (UserInfoFetchException e) { throw new ServletException("Learner with ID \"" + learnerLogin + "\" does not exist"); + } catch (UserInfoValidationException e) { + throw new ServletException(e.getMessage()); } boolean learnerAdded = group.getUsers().add(learner); @@ -364,6 +371,9 @@ } catch (UserInfoFetchException e) { // if user does not exist, ignore continue; + } catch (UserInfoValidationException e) { + // if user can't be created, ignore + continue; } boolean learnerRemoved = group.getUsers().remove(learner); Index: lams_central/src/java/org/lamsfoundation/lams/web/ProfileSaveAction.java =================================================================== diff -u -rd5aed174855be48797d56a5566b7571feaf0b9f8 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_central/src/java/org/lamsfoundation/lams/web/ProfileSaveAction.java (.../ProfileSaveAction.java) (revision d5aed174855be48797d56a5566b7571feaf0b9f8) +++ lams_central/src/java/org/lamsfoundation/lams/web/ProfileSaveAction.java (.../ProfileSaveAction.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -32,6 +32,7 @@ import javax.servlet.http.HttpSession; import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; @@ -46,6 +47,7 @@ import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.ValidationUtil; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.web.context.WebApplicationContext; @@ -94,33 +96,28 @@ } // (dyna)form validation - if ((userForm.get("firstName") == null) || (userForm.getString("firstName").trim().length() == 0)) { + //first name validation + String firstName = (userForm.get("firstName") == null) ? null : (String) userForm.get("firstName"); + if (StringUtils.isBlank(firstName)) { errors.add("firstName", new ActionMessage("error.firstname.required")); - } else { - Pattern p = Pattern.compile("^[\\p{L}]++(?:[' -][\\p{L}]++)*+\\.?$"); - Matcher m = p.matcher(userForm.getString("firstName")); - if (!m.matches()) { - errors.add("firstName", new ActionMessage("error.firstname.invalid.characters")); - } + } else if (!ValidationUtil.isFirstLastNameValid(firstName)) { + errors.add("firstName", new ActionMessage("error.firstname.invalid.characters")); } - if ((userForm.get("lastName") == null) || (userForm.getString("lastName").trim().length() == 0)) { + + //last name validation + String lastName = (userForm.get("lastName") == null) ? null : (String) userForm.get("lastName"); + if (StringUtils.isBlank(lastName)) { errors.add("lastName", new ActionMessage("error.lastname.required")); - } else { - Pattern p = Pattern.compile("^[\\p{L}]++(?:[' -][\\p{L}]++)*+\\.?$"); - Matcher m = p.matcher(userForm.getString("lastName")); - if (!m.matches()) { - errors.add("lastName", new ActionMessage("error.lastname.invalid.characters")); - } + } else if (!ValidationUtil.isFirstLastNameValid(lastName)) { + errors.add("lastName", new ActionMessage("error.lastname.invalid.characters")); } - if ((userForm.get("email") == null) || (userForm.getString("email").trim().length() == 0)) { + + //user email validation + String userEmail = (userForm.get("email") == null) ? null : (String) userForm.get("email"); + if (StringUtils.isBlank(userEmail)) { errors.add("email", new ActionMessage("error.email.required")); - } else { - Pattern p = Pattern.compile("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" - + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"); - Matcher m = p.matcher(userForm.getString("email")); - if (!m.matches()) { - errors.add("email", new ActionMessage("error.valid.email.required")); - } + } else if (!ValidationUtil.isEmailValid(userEmail)) { + errors.add("email", new ActionMessage("error.valid.email.required")); } if (!errors.isEmpty()) { Index: lams_central/src/java/org/lamsfoundation/lams/web/action/SignupAction.java =================================================================== diff -u -rbce5027e614385b7ee585688aa27ae22a3703284 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_central/src/java/org/lamsfoundation/lams/web/action/SignupAction.java (.../SignupAction.java) (revision bce5027e614385b7ee585688aa27ae22a3703284) +++ lams_central/src/java/org/lamsfoundation/lams/web/action/SignupAction.java (.../SignupAction.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -1,8 +1,5 @@ package org.lamsfoundation.lams.web.action; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -23,6 +20,7 @@ import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.Emailer; import org.lamsfoundation.lams.util.HashUtil; +import org.lamsfoundation.lams.util.ValidationUtil; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -159,63 +157,54 @@ private ActionMessages validateSignup(DynaActionForm signupForm) { ActionMessages errors = new ActionMessages(); - if (StringUtils.isBlank(signupForm.getString("username"))) { + + // user name validation + String userName = (signupForm.get("username") == null) ? null : (String) signupForm.get("username"); + if (StringUtils.isBlank(userName)) { errors.add("username", new ActionMessage("error.username.blank")); - } else if (signupService.usernameExists(signupForm.getString("username"))) { + } else if (!ValidationUtil.isUserNameValid(userName)) { + errors.add("username", new ActionMessage("error.username.invalid.characters")); + log.info("username has invalid characters: "+ userName); + } else if (signupService.usernameExists(userName)) { errors.add("username", new ActionMessage("error.username.exists")); - } else { - // weed out all special characters and spaces - Pattern p = Pattern.compile("^[^<>^!#&()/\\|'\"?,.:{}= ~`*@%$]*$"); - Matcher m = p.matcher(signupForm.getString("username")); - log.info("matches? " + m.matches()); - if (!m.matches()) { - errors.add("username", new ActionMessage("error.username.invalid.characters")); - log.info("username has invalid characters: "+ signupForm.getString("username")); - } } - - if (StringUtils.isBlank(signupForm.getString("firstName"))) { + // first name validation + String firstName = (signupForm.get("firstName") == null) ? null : (String) signupForm.get("firstName"); + if (StringUtils.isBlank(firstName)) { errors.add("firstName", new ActionMessage("error.first.name.blank")); - } else { - // first name validation - Pattern p = Pattern.compile("^[\\p{L}]++(?:[' -][\\p{L}]++)*+\\.?$"); - Matcher m = p.matcher(signupForm.getString("firstName")); - if (!m.matches()) { - errors.add("firstName", new ActionMessage("error.firstname.invalid.characters")); - log.info("firstname has invalid characters: "+ signupForm.getString("firstName")); - } - } - if (StringUtils.isBlank(signupForm.getString("lastName"))) { + } else if (!ValidationUtil.isFirstLastNameValid(firstName)) { + errors.add("firstName", new ActionMessage("error.firstname.invalid.characters")); + log.info("firstname has invalid characters: "+ firstName); + } + + //last name validation + String lastName = (signupForm.get("lastName") == null) ? null : (String) signupForm.get("lastName"); + if (StringUtils.isBlank(lastName)) { errors.add("lastName", new ActionMessage("error.last.name.blank")); - } else { - // last name validation - Pattern p = Pattern.compile("^[\\p{L}]++(?:[' -][\\p{L}]++)*+\\.?$"); - Matcher m = p.matcher(signupForm.getString("lastName")); - if (!m.matches()) { - errors.add("lastName", new ActionMessage("error.lastname.invalid.characters")); - log.info("lastName has invalid characters: "+ signupForm.getString("lastName")); - } - } + } else if (!ValidationUtil.isFirstLastNameValid(lastName)) { + errors.add("lastName", new ActionMessage("error.lastname.invalid.characters")); + log.info("lastName has invalid characters: "+ lastName); + } + //password validation if (StringUtils.isBlank(signupForm.getString("password"))) { errors.add("password", new ActionMessage("error.password.blank")); } else if (!StringUtils.equals(signupForm.getString("password"), signupForm.getString("confirmPassword"))) { errors.add("password", new ActionMessage("error.passwords.unequal")); } - if (StringUtils.isBlank(signupForm.getString("email"))) { + + //user email validation + String userEmail = (signupForm.get("email") == null) ? null : (String) signupForm.get("email"); + if (StringUtils.isBlank(userEmail)) { errors.add("email", new ActionMessage("error.email.blank")); - } else { - if (!StringUtils.equals(signupForm.getString("email"), signupForm.getString("confirmEmail"))) { - errors.add("email", new ActionMessage("error.emails.unequal")); - } - Pattern p = Pattern.compile("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" - + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"); - Matcher m = p.matcher(signupForm.getString("email")); - if (!m.matches()) { - errors.add("email", new ActionMessage("error.email.invalid.format")); - } + } else if (!ValidationUtil.isEmailValid(userEmail)) { + errors.add("email", new ActionMessage("error.email.invalid.format")); + } else if (!StringUtils.equals(userEmail, signupForm.getString("confirmEmail"))) { + errors.add("email", new ActionMessage("error.emails.unequal")); } + + // courseKey validation if (!signupService.courseKeyIsValid(signupForm.getString("context"), signupForm.getString("courseKey"))) { errors.add("courseKey", new ActionMessage("error.course.key.invalid")); Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java =================================================================== diff -u -reae819648876ce003b2797c2d2f387e10897e0b1 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision eae819648876ce003b2797c2d2f387e10897e0b1) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -33,6 +33,7 @@ import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.security.AuthenticationException; import org.lamsfoundation.lams.integration.security.Authenticator; import org.lamsfoundation.lams.integration.service.IntegrationService; @@ -733,6 +734,9 @@ } catch (UserInfoFetchException e) { LessonManagerServlet.log.error(e, e); return false; + } catch (UserInfoValidationException e) { + LessonManagerServlet.log.error(e, e); + return false; } catch (AuthenticationException e) { LessonManagerServlet.log.error(e, e); return false; @@ -741,7 +745,7 @@ private void addUserToLesson(HttpServletRequest request, ExtServerOrgMap serverMap, String method, String lsIdStr, String username, String firstName, String lastName, String email, String courseId, - String countryIsoCode, String langIsoCode) throws UserInfoFetchException { + String countryIsoCode, String langIsoCode) throws UserInfoFetchException, UserInfoValidationException { if (LessonManagerServlet.log.isDebugEnabled()) { LessonManagerServlet.log.debug("Adding user '" + username + "' as " + method + " to lesson with id '" Index: lams_common/src/java/org/lamsfoundation/lams/integration/UserInfoValidationException.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/integration/UserInfoValidationException.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/integration/UserInfoValidationException.java (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -0,0 +1,59 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.integration; + +/** + * Exception indicating that user parameters are not valid. + * + * @author Andrey Balan + */ +@SuppressWarnings("serial") +public class UserInfoValidationException extends Exception { + + public UserInfoValidationException() { + } + + /** + * @param message + */ + public UserInfoValidationException(String message) { + super(message); + } + + /** + * @param cause + */ + public UserInfoValidationException(Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + */ + public UserInfoValidationException(String message, Throwable cause) { + super(message, cause); + } + +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java =================================================================== diff -u -rb0952eab3024458158903e62579ab202ee2a6838 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision b0952eab3024458158903e62579ab202ee2a6838) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -31,78 +31,71 @@ import org.lamsfoundation.lams.integration.ExtServerToolAdapterMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.User; /** *

* View Source *

- * + * * @author Fei Yang */ public interface IIntegrationService { - - ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, - String countryIsoCode, String langIsoCode, String prettyCourseName, String method, Boolean prefix); - ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, - String extCourseId, String countryIsoCode, String langIsoCode, String prettyCourseName, String method); - - ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, - String extCourseId, String extCourseName, String countryIsoCode, String langIsoCode, - String parentOrgId, Boolean isTeacher, Boolean prefix); - - ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) throws UserInfoFetchException; - - ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException; - - ExtUserUseridMap getExistingExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) throws UserInfoFetchException; - - ExtServerOrgMap getExtServerOrgMap(Integer sid); + ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, + String countryIsoCode, String langIsoCode, String prettyCourseName, String method, Boolean prefix) + throws UserInfoValidationException; - ExtServerOrgMap getExtServerOrgMap(String serverId); - - ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, - String extUsername, - String firstName, - String lastName, - String language, - String country, - String email, - boolean prefix) - throws UserInfoFetchException; - - ExtUserUseridMap getImplicitExtUserUseridMap( - ExtServerOrgMap serverMap, - String extUsername, - String password, - String firstName, - String lastName, - String email) - throws UserInfoFetchException; - - List getAllExtServerOrgMaps(); - - void saveExtServerOrgMap(ExtServerOrgMap map); - - String hash(ExtServerOrgMap serverMap, String extUsername, String timestamp); - - List getMappedServers(String toolSig); - - ExtServerToolAdapterMap getMappedServer(String serverId, String toolSig); - - void saveExtServerToolAdapterMap(ExtServerToolAdapterMap map); - - void deleteExtServerToolAdapterMap(ExtServerToolAdapterMap map); - - /** - * Checks whether the lesson was created from extServer and returns lessonFinishCallbackUrl if it's not blank. - * - * @param user - * @param lesson - * @return - * @throws UnsupportedEncodingException - */ - String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException; + ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, + String countryIsoCode, String langIsoCode, String prettyCourseName, String method) throws UserInfoValidationException; + + ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, + String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, Boolean isTeacher, + Boolean prefix) throws UserInfoValidationException; + + ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) + throws UserInfoFetchException, UserInfoValidationException; + + ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) + throws UserInfoFetchException, UserInfoValidationException; + + ExtUserUseridMap getExistingExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) + throws UserInfoFetchException; + + ExtServerOrgMap getExtServerOrgMap(Integer sid); + + ExtServerOrgMap getExtServerOrgMap(String serverId); + + ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String firstName, + String lastName, String language, String country, String email, boolean prefix) + throws UserInfoValidationException; + + ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String password, + String firstName, String lastName, String email) throws UserInfoValidationException; + + List getAllExtServerOrgMaps(); + + void saveExtServerOrgMap(ExtServerOrgMap map); + + String hash(ExtServerOrgMap serverMap, String extUsername, String timestamp); + + List getMappedServers(String toolSig); + + ExtServerToolAdapterMap getMappedServer(String serverId, String toolSig); + + void saveExtServerToolAdapterMap(ExtServerToolAdapterMap map); + + void deleteExtServerToolAdapterMap(ExtServerToolAdapterMap map); + + /** + * Checks whether the lesson was created from extServer and returns lessonFinishCallbackUrl if it's not blank. + * + * @param user + * @param lesson + * @return + * @throws UnsupportedEncodingException + */ + String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException; } Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -r606581007abbdaee5483777096f32ffac1c3e3eb -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 606581007abbdaee5483777096f32ffac1c3e3eb) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -41,12 +41,14 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.apache.struts.action.ActionMessage; import org.lamsfoundation.lams.integration.ExtCourseClassMap; import org.lamsfoundation.lams.integration.ExtServerLessonMap; import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtServerToolAdapterMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.security.RandomPasswordGenerator; import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher; import org.lamsfoundation.lams.lesson.Lesson; @@ -64,6 +66,7 @@ import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.HashUtil; import org.lamsfoundation.lams.util.LanguageUtil; +import org.lamsfoundation.lams.util.ValidationUtil; /** *

@@ -98,7 +101,7 @@ // wrapper method for compatibility with original integration modules public ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, String countryIsoCode, String langIsoCode, String prettyCourseName, String method, - Boolean prefix) { + Boolean prefix) throws UserInfoValidationException { // Set the pretty course name if available, otherwise maintain the extCourseId String courseName = ""; @@ -119,7 +122,7 @@ // wrapper method for compatibility with original integration modules public ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, - String extCourseId, String countryIsoCode, String langIsoCode, String prettyCourseName, String method) { + String extCourseId, String countryIsoCode, String langIsoCode, String prettyCourseName, String method) throws UserInfoValidationException { return getExtCourseClassMap(serverMap, userMap, extCourseId, countryIsoCode, langIsoCode, prettyCourseName, method, true); } @@ -128,7 +131,7 @@ // 'teacher' roles, and a flag for whether to use a prefix in the org's name public ExtCourseClassMap getExtCourseClassMap(ExtServerOrgMap serverMap, ExtUserUseridMap userMap, String extCourseId, String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, - Boolean isTeacher, Boolean prefix) { + Boolean isTeacher, Boolean prefix) throws UserInfoValidationException { ExtCourseClassMap map; Organisation org; User user = userMap.getUser(); @@ -193,7 +196,7 @@ } public ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) - throws UserInfoFetchException { + throws UserInfoFetchException, UserInfoValidationException { Map properties = new HashMap(); properties.put("extServerOrgMap.sid", serverMap.getSid()); properties.put("extUsername", extUsername); @@ -206,7 +209,7 @@ } public ExtUserUseridMap getExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername) - throws UserInfoFetchException { + throws UserInfoFetchException, UserInfoValidationException { return getExtUserUseridMap(serverMap, extUsername, true); } @@ -224,7 +227,7 @@ } public ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String password, - String firstName, String lastName, String email) throws UserInfoFetchException { + String firstName, String lastName, String email) throws UserInfoValidationException { Map properties = new HashMap(); properties.put("extServerOrgMap.sid", serverMap.getSid()); properties.put("extUsername", extUsername); @@ -241,7 +244,7 @@ public ExtUserUseridMap getImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String firstName, String lastName, String language, String country, String email, boolean prefix) - throws UserInfoFetchException { + throws UserInfoValidationException { Map properties = new HashMap(); properties.put("extServerOrgMap.sid", serverMap.getSid()); properties.put("extUsername", extUsername); @@ -254,9 +257,19 @@ } private Organisation createOrganisation(ExtServerOrgMap serverMap, User user, String extCourseId, - String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, Boolean prefix) { + String extCourseName, String countryIsoCode, String langIsoCode, String parentOrgId, Boolean prefix) throws UserInfoValidationException { + Organisation org = new Organisation(); - org.setName(prefix ? buildName(serverMap.getPrefix(), extCourseName) : extCourseName); + + // org name validation + String orgName = prefix ? buildName(serverMap.getPrefix(), extCourseName) : extCourseName; + if (StringUtils.isNotBlank(orgName) && !ValidationUtil.isFirstLastNameValid(orgName)) { + throw new UserInfoValidationException("Can't create organisation due to validation error: " + + "organisation name cannot contain any of these characters < > ^ * @ % $. External server:" + + serverMap.getServerid() + ", orgId:" + extCourseId + ", orgName:" + orgName); + } + org.setName(orgName); + org.setDescription(extCourseId); org.setOrganisationState((OrganisationState) service .findById(OrganisationState.class, OrganisationState.ACTIVE)); @@ -284,9 +297,47 @@ // flexible method to specify username and password private ExtUserUseridMap createExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String password, - String[] userData, boolean prefix) throws UserInfoFetchException { + String[] userData, boolean prefix) throws UserInfoValidationException { + + String login = prefix ? buildName(serverMap.getPrefix(), extUsername) : extUsername; + String firstName = userData[1]; + String lastName = userData[2]; + String email = userData[11]; + + // login validation + if (StringUtils.isBlank(login)) { + throw new UserInfoValidationException("Can't create user due to validation error: " + + "Username cannot be blank. External server:" + serverMap.getServerid() + ", firstName:" + + firstName + ", lastName:" + lastName); + } else if (!ValidationUtil.isUserNameValid(login)) { + throw new UserInfoValidationException("Can't create user due to validation error: " + + "Username can only contain alphanumeric characters and no spaces. External server:" + + serverMap.getServerid() + ", Username:" + login); + } + + // first name validation + if (StringUtils.isNotBlank(firstName) && !ValidationUtil.isFirstLastNameValid(firstName)) { + throw new UserInfoValidationException("Can't create user due to validation error: " + + "First name contains invalid characters. External server:" + serverMap.getServerid() + + ", Username:" + login + ", firstName:" + firstName + ", lastName:" + lastName); + } + + // last name validation + if (StringUtils.isNotBlank(lastName) && !ValidationUtil.isFirstLastNameValid(lastName)) { + throw new UserInfoValidationException("Can't create user due to validation error: " + + "Last name contains invalid characters. External server:" + serverMap.getServerid() + + ", Username:" + login + ", firstName:" + firstName + ", lastName:" + lastName); + } + + // user email validation + if (StringUtils.isNotBlank(email) && !ValidationUtil.isEmailValid(email)) { + throw new UserInfoValidationException("Can't create user due to validation error: " + + "Email format is invalid. External server:" + serverMap.getServerid() + ", Username:" + login + + ", firstName:" + firstName + ", lastName:" + lastName); + } + User user = new User(); - user.setLogin(prefix ? buildName(serverMap.getPrefix(), extUsername) : extUsername); + user.setLogin(login); user.setPassword(password); user.setTitle(userData[0]); user.setFirstName(userData[1]); @@ -318,16 +369,16 @@ // compatibility method to support integrations private ExtUserUseridMap createExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, boolean prefix) - throws UserInfoFetchException { + throws UserInfoFetchException, UserInfoValidationException { String[] userData = getUserDataFromExtServer(serverMap, extUsername); String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10)); return createExtUserUseridMap(serverMap, extUsername, password, userData, prefix); } // compatibility method - public ExtUserUseridMap createImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, + private ExtUserUseridMap createImplicitExtUserUseridMap(ExtServerOrgMap serverMap, String extUsername, String firstName, String lastName, String language, String country, String email, boolean prefix) - throws UserInfoFetchException { + throws UserInfoValidationException { String[] userData = { "", firstName, lastName, "", "", "", "", "", "", "", "", email, country, language }; String password = HashUtil.sha1(RandomPasswordGenerator.nextPassword(10)); return createExtUserUseridMap(serverMap, extUsername, password, userData, prefix); Index: lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java =================================================================== diff -u -rdfe9ef3dde4b722b5d87c4964a66f19fd48ea2b0 -r0d275bf753620ae71aeb4e7589c540c9777532cb --- lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java (.../LoginRequestDispatcher.java) (revision dfe9ef3dde4b722b5d87c4964a66f19fd48ea2b0) +++ lams_common/src/java/org/lamsfoundation/lams/integration/util/LoginRequestDispatcher.java (.../LoginRequestDispatcher.java) (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -30,6 +30,7 @@ import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.integration.UserInfoValidationException; import org.lamsfoundation.lams.integration.service.IIntegrationService; import org.lamsfoundation.lams.integration.service.IntegrationService; import org.lamsfoundation.lams.lesson.service.ILessonService; @@ -119,6 +120,8 @@ addUserToLessonClass(request, lessonId, method); } catch (UserInfoFetchException e) { throw new ServletException(e); + } catch (UserInfoValidationException e) { + throw new ServletException(e); } } @@ -169,7 +172,7 @@ } private static void addUserToLessonClass(HttpServletRequest request, String lessonId, String method) - throws UserInfoFetchException { + throws UserInfoFetchException, UserInfoValidationException { if (integrationService == null) { integrationService = (IntegrationService) WebApplicationContextUtils.getRequiredWebApplicationContext( request.getSession().getServletContext()).getBean("integrationService"); Index: lams_common/src/java/org/lamsfoundation/lams/util/ValidationUtil.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/util/ValidationUtil.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/util/ValidationUtil.java (revision 0d275bf753620ae71aeb4e7589c540c9777532cb) @@ -0,0 +1,107 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility methods for String validation. + */ +public class ValidationUtil { + + private final static String REGEX_USER_NAME = "^[^<>^!#&()/\\|'\"?,.:{}= ~`*@%$]*$"; + + private final static String REGEX_FIRST_LAST_NAME = "^[\\p{L}]++(?:[' -][\\p{L}]++)*+\\.?$"; + + private final static String REGEX_EMAIL = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + + private final static String REGEX_ORGANISATION_NAME = "^[^<>^*@%$]*$"; + + /** + * Checks whether supplied username is valid. Username can only contain alphanumeric characters and no spaces. + * + * @param Username + * @return + */ + public static boolean isUserNameValid(String userName) { + + boolean isUserNameValid = ValidationUtil.isRegexMatches(REGEX_USER_NAME,userName); + return isUserNameValid; + } + + /** + * Checks whether supplied name is valid, which should only contain letters and the following characters ''',' ','-' + * + * @param name + * @return + */ + public static boolean isFirstLastNameValid(String name) { + + boolean isNameValid = ValidationUtil.isRegexMatches(REGEX_FIRST_LAST_NAME, name); + return isNameValid; + } + + /** + * Checks whether supplied email address is valid. + * + * @param email + * @return + */ + public static boolean isEmailValid(String email) { + + boolean isEmailValid = ValidationUtil.isRegexMatches(REGEX_EMAIL, email); + return isEmailValid; + } + + /** + * Checks whether supplied string is valid. Name cannot contain any of these characters < > ^ * @ % $ + * + * @param orgName + * @return + */ + public static boolean isOrgNameValid(String orgName) { + + boolean isOrgNameValid = ValidationUtil.isRegexMatches(REGEX_ORGANISATION_NAME, orgName); + return isOrgNameValid; + } + + /** + * Checks whether regex matches the input string. + * + * @param regex + * @param input + * @return + */ + private static boolean isRegexMatches(final String regex, final String input) { + + if (input == null) { + return true; + } + + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(input.trim()); + return m.matches(); + } +}