Index: lams_admin/conf/xdoclet/struts-forms.xml =================================================================== diff -u -rcb6d628cd53fe3d51e4f67cbaff7390651a048da -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_admin/conf/xdoclet/struts-forms.xml (.../struts-forms.xml) (revision cb6d628cd53fe3d51e4f67cbaff7390651a048da) +++ lams_admin/conf/xdoclet/struts-forms.xml (.../struts-forms.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -106,4 +106,18 @@ \ No newline at end of file + /> + + + + + + + + + + + + + + \ No newline at end of file Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SignupManagementAction.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SignupManagementAction.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SignupManagementAction.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,175 @@ +package org.lamsfoundation.lams.admin.web.action; + +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.struts.action.ActionMessage; +import org.apache.struts.action.ActionMessages; +import org.apache.struts.action.DynaActionForm; +import org.lamsfoundation.lams.signup.model.SignupOrganisation; +import org.lamsfoundation.lams.signup.service.ISignupService; +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.WebUtil; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * @struts:action path="/signupManagement" name="SignupManagementForm" scope="request" validate="false" + * parameter="method" + * + * @struts:action-forward name="signupPageList" path=".signupPageList" + * @struts:action-forward name="addSignupPage" path=".addSignupPage" + * @struts:action-forward name="signupPageListMethod" path="/signupManagement.do?method=list" + */ +public class SignupManagementAction extends Action { + + private static Logger log = Logger.getLogger(SignupManagementAction.class); + private static ISignupService signupService = null; + private static IUserManagementService userManagementService = null; + + public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + + try { + if (signupService == null) { + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + signupService = (ISignupService) wac.getBean("signupService"); + } + if (userManagementService == null) { + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + userManagementService = (IUserManagementService) wac.getBean("userManagementService"); + } + + String method = WebUtil.readStrParam(request, "method", true); + + if (StringUtils.equals(method, "edit")) { + return edit(mapping, form, request, response); + } else if (StringUtils.equals(method, "add")) { + return add(mapping, form, request, response); + } else if (StringUtils.equals(method, "delete")) { + return delete(mapping, form, request, response); + } else if (StringUtils.equals(method, "list")) { + // do nothing + } + + List signupOrganisations = signupService.getSignupOrganisations(); + request.setAttribute("signupOrganisations", signupOrganisations); + } catch (Exception e) { + log.error(e.getMessage(), e); + request.setAttribute("error", e.getMessage()); + } + + return mapping.findForward("signupPageList"); + } + + public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + + Integer soid = WebUtil.readIntParam(request, "soid", false); + + if (soid != null && soid > 0) { + SignupOrganisation signup = (SignupOrganisation) userManagementService.findById(SignupOrganisation.class, + soid); + if (signup != null) { + DynaActionForm signupForm = (DynaActionForm) form; + signupForm.set("signupOrganisationId", signup.getSignupOrganisationId()); + signupForm.set("organisationId", signup.getOrganisation().getOrganisationId()); + signupForm.set("addToLessons", signup.getAddToLessons()); + signupForm.set("addAsStaff", signup.getAddAsStaff()); + signupForm.set("addWithAuthor", signup.getAddWithAuthor()); + signupForm.set("addWithMonitor", signup.getAddWithMonitor()); + signupForm.set("courseKey", signup.getCourseKey()); + signupForm.set("blurb", signup.getBlurb()); + signupForm.set("disabled", signup.getDisabled()); + signupForm.set("context", signup.getContext()); + + List organisations = signupService.getOrganisationCandidates(); + request.setAttribute("organisations", organisations); + + return mapping.findForward("addSignupPage"); + } + } + return null; + } + + public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + + DynaActionForm signupForm = (DynaActionForm) form; + + // check if form submitted + if (signupForm.get("organisationId") != null && (Integer) signupForm.get("organisationId") > 0) { + ActionMessages errors = new ActionMessages(); + + // validate + if (!StringUtils.equals(signupForm.getString("courseKey"), signupForm.getString("confirmCourseKey"))) { + errors.add("courseKey", new ActionMessage("error.course.keys.unequal")); + } + if (signupService.contextExists((Integer) signupForm.get("signupOrganisationId"), + signupForm.getString("context"))) { + errors.add("context", new ActionMessage("error.context.exists")); + } + + if (!errors.isEmpty()) { + saveErrors(request, errors); + } else { + // proceed + SignupOrganisation signup; + if (signupForm.get("signupOrganisationId") != null + && (Integer) signupForm.get("signupOrganisationId") > 0) { + // form was editing existing + signup = (SignupOrganisation) userManagementService.findById(SignupOrganisation.class, + (Integer) signupForm.get("signupOrganisationId")); + } else { + signup = new SignupOrganisation(); + signup.setCreateDate(new Date()); + } + signup.setAddToLessons((Boolean) signupForm.get("addToLessons")); + signup.setAddAsStaff((Boolean) signupForm.get("addAsStaff")); + signup.setAddWithAuthor((Boolean) signupForm.get("addWithAuthor")); + signup.setAddWithMonitor((Boolean) signupForm.get("addWithMonitor")); + signup.setDisabled((Boolean) signupForm.get("disabled")); + signup.setOrganisation((Organisation) userManagementService.findById(Organisation.class, + (Integer) signupForm.get("organisationId"))); + signup.setCourseKey(signupForm.getString("courseKey")); + signup.setBlurb(signupForm.getString("blurb")); + signup.setContext(signupForm.getString("context")); + userManagementService.save(signup); + + return mapping.findForward("signupPageListMethod"); + } + } else { + // form not submitted, default values + signupForm.set("blurb", "Register your LAMS account for this group using the form below."); + } + + List organisations = signupService.getOrganisationCandidates(); + request.setAttribute("organisations", organisations); + + return mapping.findForward("addSignupPage"); + } + + public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws Exception { + + Integer soid = WebUtil.readIntParam(request, "soid"); + + if (soid != null && soid > 0) { + userManagementService.deleteById(SignupOrganisation.class, soid); + } + + return mapping.findForward("signupPageListMethod"); + } +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SysAdminStartAction.java =================================================================== diff -u -rd5655905b56e2063bc3854df756ef16572d2c745 -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SysAdminStartAction.java (.../SysAdminStartAction.java) (revision d5655905b56e2063bc3854df756ef16572d2c745) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SysAdminStartAction.java (.../SysAdminStartAction.java) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -74,6 +74,7 @@ links.add(new LinkBean("statistics.do", "admin.statistics.title")); links.add(new LinkBean("themeManagement.do", "admin.themes.title")); links.add(new LinkBean("timezonemanagement.do", "admin.timezone.title")); + links.add(new LinkBean("signupManagement.do", "admin.signup.title")); OpenIDConfig openIDEnabled = (OpenIDConfig)service.findById(OpenIDConfig.class, OpenIDConfig.KEY_ENABLED); if (openIDEnabled != null && Boolean.parseBoolean(openIDEnabled.getConfigValue()) == Boolean.TRUE) { Index: lams_admin/web/WEB-INF/tiles-defs.xml =================================================================== diff -u -rd56929f06ad90a63082d514e6521adc175f3de27 -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_admin/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision d56929f06ad90a63082d514e6521adc175f3de27) +++ lams_admin/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -201,4 +201,14 @@ + + + + + + + + + + \ No newline at end of file Index: lams_admin/web/signupmanagement/add.jsp =================================================================== diff -u --- lams_admin/web/signupmanagement/add.jsp (revision 0) +++ lams_admin/web/signupmanagement/add.jsp (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,67 @@ +<%@ include file="/taglibs.jsp"%> + +

+ : + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
: + + + + + +
:
:
:
:
:
:
:
+ +
\ No newline at end of file Index: lams_admin/web/signupmanagement/list.jsp =================================================================== diff -u --- lams_admin/web/signupmanagement/list.jsp (revision 0) +++ lams_admin/web/signupmanagement/list.jsp (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,56 @@ +<%@ include file="/taglibs.jsp"%> + +

+ +

+ + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +    + +
+ +

+ +

\ No newline at end of file Index: lams_build/conf/j2ee/lams.application.xml =================================================================== diff -u -rd51d35acd1a906f5361d7ecdfb25aeec84efafa6 -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_build/conf/j2ee/lams.application.xml (.../lams.application.xml) (revision d51d35acd1a906f5361d7ecdfb25aeec84efafa6) +++ lams_build/conf/j2ee/lams.application.xml (.../lams.application.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -59,18 +59,6 @@ SAML Integration - do not uncomment manually--> - - - - + + + Open access content + /signup/* + + + FORM Index: lams_central/src/java/org/lamsfoundation/lams/web/action/SignupAction.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/web/action/SignupAction.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/web/action/SignupAction.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,227 @@ +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; + +import org.apache.catalina.authenticator.Constants; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.struts.action.ActionMessage; +import org.apache.struts.action.ActionMessages; +import org.apache.struts.action.DynaActionForm; +import org.lamsfoundation.lams.signup.model.SignupOrganisation; +import org.lamsfoundation.lams.signup.service.ISignupService; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.Emailer; +import org.lamsfoundation.lams.util.HashUtil; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * @struts:action path="/signup/signup" name="SignupForm" scope="request" + * validate="false" parameter="method" + * + * @struts:action-forward name="signup" path=".signup" + * @struts:action-forward name="index" path="/" + * @struts:action-forward name="success" path=".successfulSignup" + */ +public class SignupAction extends Action { + + private static Logger log = Logger.getLogger(SignupAction.class); + private static ISignupService signupService = null; + + public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + + if (signupService == null) { + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + signupService = (ISignupService) wac.getBean("signupService"); + } + + String context = WebUtil.readStrParam(request, "context", true); + if (StringUtils.isNotBlank(context)) { + SignupOrganisation signupOrganisation = signupService.getSignupOrganisation(context); + request.setAttribute("signupOrganisation", signupOrganisation); + } + + String selectedTab = WebUtil.readStrParam(request, "selectedTab", true); + if (StringUtils.isNotBlank(selectedTab)) { + request.setAttribute("selectedTab", selectedTab); + } + + DynaActionForm signupForm = (DynaActionForm) form; + String method = WebUtil.readStrParam(request, "method", true); + + if (signupForm.get("submitted") == null || !((Boolean) signupForm.get("submitted"))) { + // no context and unsubmitted form means it's the initial request + return mapping.findForward("signup"); + } else if (StringUtils.equals(method, "register")) { + return signUp(mapping, form, request, response); + } else { + return signIn(mapping, form, request, response); + } + } + + private ActionForward signUp(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + + try { + + DynaActionForm signupForm = (DynaActionForm) form; + + // validation + ActionMessages errors = validateSignup(signupForm); + if (!errors.isEmpty()) { + saveErrors(request, errors); + return mapping.findForward("signup"); + } else { + // proceed with signup + User user = new User(); + user.setLogin(signupForm.getString("username")); + user.setFirstName(signupForm.getString("firstName")); + user.setLastName(signupForm.getString("lastName")); + user.setEmail(signupForm.getString("email")); + user.setPassword(HashUtil.sha1(signupForm.getString("password"))); + signupService.signupUser(user, signupForm.getString("context")); + + // send email + try { + String subject = "Your LAMS account details"; + String body = "Hi there,\n\n"; + body += "You've successfully registered an account with username " + user.getLogin(); + body += " on the LAMS server at " + Configuration.get(ConfigurationKeys.SERVER_URL); + body += ". If you ever forget your password, you can reset it via this URL " + + Configuration.get(ConfigurationKeys.SERVER_URL) + "/forgotPassword.jsp."; + body += "\n\n"; + body += "Regards,\n"; + body += "LAMS Signup System"; + + Emailer.sendFromSupportEmail(subject, user.getEmail(), body); + } catch (Exception e) { + log.error(e.getMessage(), e); + request.setAttribute("error", e.getMessage()); + } + + return mapping.findForward("success"); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + request.setAttribute("error", e.getMessage()); + } + + return mapping.findForward("index"); + } + + private ActionForward signIn(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + + try { + DynaActionForm signupForm = (DynaActionForm) form; + + // validation + ActionMessages errors = validateSignin(signupForm); + if (!errors.isEmpty()) { + saveErrors(request, errors); + return mapping.findForward("signup"); + } else { + String login = signupForm.getString("usernameTab2"); + String password = HashUtil.sha1(signupForm.getString("passwordTab2")); + String context = signupForm.getString("context"); + signupService.signinUser(login, context); + + String redirectUrl = request.getScheme() + "://" + request.getServerName() + ":" + + request.getServerPort() + "/lams/"; + + //check if user is logged in already + if (SessionManager.getSession() == null || SessionManager.getSession().getAttribute(AttributeNames.USER) == null) { + redirectUrl += "/j_security_check?" + Constants.FORM_USERNAME + "=" + login + "&" + + Constants.FORM_PASSWORD + "=" + password; + } + + response.sendRedirect(redirectUrl); + return null; + } + } catch (Exception e) { + log.error(e.getMessage(), e); + request.setAttribute("error", e.getMessage()); + } + + return mapping.findForward("index"); + } + + private ActionMessages validateSignup(DynaActionForm signupForm) { + ActionMessages errors = new ActionMessages(); + if (StringUtils.isBlank(signupForm.getString("username"))) { + errors.add("username", new ActionMessage("error.username.blank")); + } else if (signupService.usernameExists(signupForm.getString("username"))) { + errors.add("username", new ActionMessage("error.username.exists")); + } + if (StringUtils.isBlank(signupForm.getString("firstName"))) { + errors.add("firstName", new ActionMessage("error.first.name.blank")); + } + if (StringUtils.isBlank(signupForm.getString("lastName"))) { + errors.add("lastName", new ActionMessage("error.last.name.blank")); + } + 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"))) { + 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-z]+"); + Matcher m = p.matcher(signupForm.getString("email")); + if (!m.matches()) { + errors.add("email", new ActionMessage("error.email.invalid.format")); + } + } + if (!signupService.courseKeyIsValid(signupForm.getString("context"), + signupForm.getString("courseKey"))) { + errors.add("courseKey", new ActionMessage("error.course.key.invalid")); + } + return errors; + } + + private ActionMessages validateSignin(DynaActionForm signupForm) { + ActionMessages errors = new ActionMessages(); + if (StringUtils.isBlank(signupForm.getString("usernameTab2"))) { + errors.add("usernameTab2", new ActionMessage("error.username.blank")); + } + if (StringUtils.isBlank(signupForm.getString("passwordTab2"))) { + errors.add("passwordTab2", new ActionMessage("error.password.blank")); + } + if (!signupService.courseKeyIsValid(signupForm.getString("context"), + signupForm.getString("courseKeyTab2"))) { + errors.add("courseKeyTab2", new ActionMessage("error.course.key.invalid")); + } + + if (errors.isEmpty()) { + String login = signupForm.getString("usernameTab2"); + String password = HashUtil.sha1(signupForm.getString("passwordTab2")); + User user = signupService.getUserByLogin(login); + + if ((user == null) || !user.getPassword().equals(password)) { + errors.add("usernameTab2", new ActionMessage("error.login.or.password.incorrect", "", "")); + } + } + + return errors; + } +} Index: lams_central/web/WEB-INF/tiles-defs.xml =================================================================== diff -u -rd56929f06ad90a63082d514e6521adc175f3de27 -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_central/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision d56929f06ad90a63082d514e6521adc175f3de27) +++ lams_central/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -61,4 +61,14 @@ + + + + + + + + + + \ No newline at end of file Fisheye: Tag 686aaadbd3281ec37fcb113927961b09bed4455c refers to a dead (removed) revision in file `lams_central/web/WEB-INF/urlrewrite.xml'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_central/web/signup/loginTab.jsp =================================================================== diff -u --- lams_central/web/signup/loginTab.jsp (revision 0) +++ lams_central/web/signup/loginTab.jsp (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,32 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
+ +
+
\ No newline at end of file Index: lams_central/web/signup/signup.jsp =================================================================== diff -u --- lams_central/web/signup/signup.jsp (revision 0) +++ lams_central/web/signup/signup.jsp (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,82 @@ +<%@ taglib uri="tags-lams" prefix="lams" %> +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-html" prefix="html" %> + + + + + + + + +

+ LAMS - Learning Activity Management System +

+ + +

 

+

+ + + () + +

+ +

+ +

+
+
+ +
+ + +
+ + +

+
+ + +
+
    +
  • +
  • +
+
+

+ <%@ include file="singupTab.jsp"%> +

+
+
+

+ <%@ include file="loginTab.jsp"%> +

+
+
\ No newline at end of file Index: lams_central/web/signup/singupTab.jsp =================================================================== diff -u --- lams_central/web/signup/singupTab.jsp (revision 0) +++ lams_central/web/signup/singupTab.jsp (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,57 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
+ +
+
\ No newline at end of file Index: lams_central/web/signup/successfulSignup.jsp =================================================================== diff -u --- lams_central/web/signup/successfulSignup.jsp (revision 0) +++ lams_central/web/signup/successfulSignup.jsp (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,19 @@ +<%@ taglib uri="tags-lams" prefix="lams" %> +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-html" prefix="html" %> + +

+ +

+ +

 

+ + +

,

+
+ +

+ : . +

\ No newline at end of file Index: lams_common/build.xml =================================================================== diff -u -r73963b896de9269e9c4e5a5c229159588eb18c75 -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_common/build.xml (.../build.xml) (revision 73963b896de9269e9c4e5a5c229159588eb18c75) +++ lams_common/build.xml (.../build.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -23,6 +23,8 @@ + + Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/signup/model/SignupOrganisation.hbm.xml =================================================================== diff -u --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/signup/model/SignupOrganisation.hbm.xml (revision 0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/signup/model/SignupOrganisation.hbm.xml (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -radbeef28588d85020fca6e9d949a17bd09e960a7 -r2b88dada3266a4b0f83f4b5c4cf617553496ca59 --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision adbeef28588d85020fca6e9d949a17bd09e960a7) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -116,6 +116,23 @@ + + + + + + + + + + + true + + + PROPAGATION_REQUIRED + + + @@ -335,6 +352,11 @@ + + + + + Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040013.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040013.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch02040013.sql (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,25 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; + +-- LDEV-2905 Integrate lams_signup to LAMS core +CREATE TABLE IF NOT EXISTS lams_signup_organisation ( + signup_organisation_id BIGINT(20) NOT NULL auto_increment, + organisation_id BIGINT(20) NOT NULL, + add_to_lessons TINYINT(1) DEFAULT 1, + add_as_staff TINYINT(1) DEFAULT 0, + add_with_author TINYINT(1) DEFAULT 0, + add_with_monitor TINYINT(1) DEFAULT 0, + course_key VARCHAR(255), + blurb TEXT, + create_date DATETIME, + disabled TINYINT(1) DEFAULT 0, + context VARCHAR(255) UNIQUE, + PRIMARY KEY (signup_organisation_id), + INDEX (organisation_id) +)ENGINE=InnoDB; + +DROP TABLE IF EXISTS lams_signup_user; + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/signup/dao/ISignupDAO.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/signup/dao/ISignupDAO.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/signup/dao/ISignupDAO.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,44 @@ +/**************************************************************** + * 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.signup.dao; + +import java.util.List; + +import org.lamsfoundation.lams.signup.model.SignupOrganisation; + +public interface ISignupDAO { + + SignupOrganisation getSignupOrganisation(String context); + + boolean usernameExists(String username); + + boolean courseKeyIsValid(String context, String courseKey); + + List getSignupOrganisations(); + + List getOrganisationCandidates(); + + boolean contextExists(Integer soid, String context); + +} Index: lams_common/src/java/org/lamsfoundation/lams/signup/dao/hibernate/SignupDAO.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/signup/dao/hibernate/SignupDAO.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/signup/dao/hibernate/SignupDAO.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,70 @@ +package org.lamsfoundation.lams.signup.dao.hibernate; + +import java.util.List; + +import org.lamsfoundation.lams.dao.hibernate.BaseDAO; +import org.lamsfoundation.lams.signup.dao.ISignupDAO; +import org.lamsfoundation.lams.signup.model.SignupOrganisation; +import org.lamsfoundation.lams.usermanagement.OrganisationState; +import org.lamsfoundation.lams.usermanagement.OrganisationType; +import org.lamsfoundation.lams.usermanagement.User; + +public class SignupDAO extends BaseDAO implements ISignupDAO { + + @Override + public SignupOrganisation getSignupOrganisation(String context) { + List list = getHibernateTemplate().find( + "from SignupOrganisation s where s.disabled=" + Boolean.FALSE + " and s.context=?", context); + if (list != null && list.size() > 0) { + return (SignupOrganisation) list.get(0); + } + return null; + } + + @Override + public List getSignupOrganisations() { + return super.findAll(SignupOrganisation.class); + } + + @Override + public List getOrganisationCandidates() { + String query = "from Organisation o where o.organisationState.organisationStateId=" + OrganisationState.ACTIVE; + query += " and o.organisationType.organisationTypeId!=" + OrganisationType.ROOT_TYPE; + return getHibernateTemplate().find(query); + } + + @Override + public boolean usernameExists(String username) { + List list = super.findByProperty(User.class, "login", username); + if (list != null && list.size() > 0) + return true; + else + return false; + } + + @Override + public boolean contextExists(Integer soid, String context) { + String query = "from SignupOrganisation s where s.signupOrganisationId!=? and s.context=?"; + Object[] values = new Object[2]; + values[0] = soid; + values[1] = context; + List list = getHibernateTemplate().find(query, values); + if (list != null && list.size() > 0) + return true; + else + return false; + } + + @Override + public boolean courseKeyIsValid(String context, String courseKey) { + String query = "from SignupOrganisation s where s.context=? and s.courseKey=?"; + Object[] values = new Object[2]; + values[0] = context; + values[1] = courseKey; + List list = getHibernateTemplate().find(query, values); + if (list != null && list.size() > 0) + return true; + else + return false; + } +} Index: lams_common/src/java/org/lamsfoundation/lams/signup/model/SignupOrganisation.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/signup/model/SignupOrganisation.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/signup/model/SignupOrganisation.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,154 @@ +package org.lamsfoundation.lams.signup.model; + +import java.util.Date; + +import org.lamsfoundation.lams.usermanagement.Organisation; + +/** + * SignupOrganisation. + * + * @hibernate.class table="lams_signup_organisation" + */ +public class SignupOrganisation { + + /** + * Link on Lams wiki signup help page. + */ + public static String SIGNUP_HELP_PAGE = "LAMS+Configuration"; + + /** identifier field */ + private Integer signupOrganisationId; + private Organisation organisation; + private Boolean addToLessons; + private Boolean addAsStaff; + private Boolean addWithAuthor; + private Boolean addWithMonitor; + private String courseKey; + private String blurb; + private Date createDate; + private Boolean disabled; + private String context; + + /** + * @hibernate.id generator-class="native" type="java.lang.Integer" column="signup_organisation_id" + */ + public Integer getSignupOrganisationId() { + return signupOrganisationId; + } + + public void setSignupOrganisationId(Integer signupOrganisationId) { + this.signupOrganisationId = signupOrganisationId; + } + + /** + * @hibernate.many-to-one not-null="true" cascade="all-delete-orphan" lazy="false" + * @hibernate.column name="organisation_id" + */ + public Organisation getOrganisation() { + return organisation; + } + + public void setOrganisation(Organisation organisation) { + this.organisation = organisation; + } + + /** + * @hibernate.property column="add_to_lessons" length="1" + */ + public Boolean getAddToLessons() { + return addToLessons; + } + + public void setAddToLessons(Boolean addToLessons) { + this.addToLessons = addToLessons; + } + + /** + * @hibernate.property column="add_as_staff" length="1" + */ + public Boolean getAddAsStaff() { + return addAsStaff; + } + + public void setAddAsStaff(Boolean addAsStaff) { + this.addAsStaff = addAsStaff; + } + + /** + * @hibernate.property column="add_with_author" length="1" + */ + public Boolean getAddWithAuthor() { + return addWithAuthor; + } + + public void setAddWithAuthor(Boolean addWithAuthor) { + this.addWithAuthor = addWithAuthor; + } + + /** + * @hibernate.property column="add_with_monitor" length="1" + */ + public Boolean getAddWithMonitor() { + return addWithMonitor; + } + + public void setAddWithMonitor(Boolean addWithMonitor) { + this.addWithMonitor = addWithMonitor; + } + + /** + * @hibernate.property column="course_key" length="255" + */ + public String getCourseKey() { + return courseKey; + } + + public void setCourseKey(String courseKey) { + this.courseKey = courseKey; + } + + /** + * @hibernate.property column="blurb" length="2147483647" + */ + public String getBlurb() { + return blurb; + } + + public void setBlurb(String blurb) { + this.blurb = blurb; + } + + /** + * @hibernate.property column="create_date" length="19" not-null="true" + */ + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + /** + * @hibernate.property column="disabled" length="1" + */ + public Boolean getDisabled() { + return disabled; + } + + public void setDisabled(Boolean disabled) { + this.disabled = disabled; + } + + /** + * @hibernate.property column="context" length="255" + */ + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } + +} Index: lams_common/src/java/org/lamsfoundation/lams/signup/service/ISignupService.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/signup/service/ISignupService.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/signup/service/ISignupService.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,50 @@ +/**************************************************************** + * 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.signup.service; + +import java.util.List; + +import org.lamsfoundation.lams.signup.model.SignupOrganisation; +import org.lamsfoundation.lams.usermanagement.User; + +public interface ISignupService { + + void signupUser(User user, String context); + + SignupOrganisation getSignupOrganisation(String context); + + boolean usernameExists(String username); + + boolean courseKeyIsValid(String context, String courseKey); + + List getSignupOrganisations(); + + List getOrganisationCandidates(); + + boolean contextExists(Integer soid, String context); + + void signinUser(String login, String context); + + User getUserByLogin(String login); +} Index: lams_common/src/java/org/lamsfoundation/lams/signup/service/SignupService.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/signup/service/SignupService.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/signup/service/SignupService.java (revision 2b88dada3266a4b0f83f4b5c4cf617553496ca59) @@ -0,0 +1,209 @@ +package org.lamsfoundation.lams.signup.service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.lesson.service.ILessonService; +import org.lamsfoundation.lams.signup.dao.ISignupDAO; +import org.lamsfoundation.lams.signup.model.SignupOrganisation; +import org.lamsfoundation.lams.usermanagement.AuthenticationMethod; +import org.lamsfoundation.lams.usermanagement.Role; +import org.lamsfoundation.lams.usermanagement.SupportedLocale; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.LanguageUtil; + +public class SignupService implements ISignupService { + + private ISignupDAO signupDAO; + private IUserManagementService userManagementService; + private ILessonService lessonService; + + @Override + public void signupUser(User user, String context) { + // save User + user.setFlashTheme(userManagementService.getDefaultFlashTheme()); + user.setHtmlTheme(userManagementService.getDefaultHtmlTheme()); + user.setDisabledFlag(false); + user.setAuthenticationMethod(getAuthenticationMethod(AuthenticationMethod.DB)); + user.setLocale(getDefaultLocale()); + user.setCreateDate(new Date()); + user.setEnableFlash(true); + userManagementService.save(user); + + // add to org + SignupOrganisation signup = signupDAO.getSignupOrganisation(context); + + ArrayList rolesList = new ArrayList(); + rolesList.add(Role.ROLE_LEARNER.toString()); + if (signup.getAddAsStaff()) { + rolesList.add(Role.ROLE_MONITOR.toString()); + rolesList.add(Role.ROLE_AUTHOR.toString()); + } else if (signup.getAddWithAuthor()) { + rolesList.add(Role.ROLE_AUTHOR.toString()); + } else if (signup.getAddWithMonitor()) { + rolesList.add(Role.ROLE_MONITOR.toString()); + } + + userManagementService + .setRolesForUserOrganisation(user, signup.getOrganisation().getOrganisationId(), rolesList); + + if (signup.getAddToLessons()) { + // add to lessons + user = userManagementService.getUserByLogin(user.getLogin()); + + Set lessonSet = signup.getOrganisation().getLessons(); + Iterator lessonIterator = lessonSet.iterator(); + while (lessonIterator.hasNext()) { + Lesson lesson = (Lesson) lessonIterator.next(); + lessonService.addLearner(lesson.getLessonId(), user.getUserId()); + if (signup.getAddAsStaff()) { + lessonService.addStaffMember(lesson.getLessonId(), user.getUserId()); + } + } + } + } + + @Override + public void signinUser(String login, String context) { + User user = userManagementService.getUserByLogin(login); + + // add to org + SignupOrganisation signup = signupDAO.getSignupOrganisation(context); + + ArrayList rolesList = new ArrayList(); + rolesList.add(Role.ROLE_LEARNER.toString()); + if (signup.getAddAsStaff()) { + rolesList.add(Role.ROLE_MONITOR.toString()); + rolesList.add(Role.ROLE_AUTHOR.toString()); + } else if (signup.getAddWithAuthor()) { + rolesList.add(Role.ROLE_AUTHOR.toString()); + } else if (signup.getAddWithMonitor()) { + rolesList.add(Role.ROLE_MONITOR.toString()); + } + + userManagementService.setRolesForUserOrganisation(user, signup.getOrganisation().getOrganisationId(), rolesList); + + if (signup.getAddToLessons()) { + // add to lessons + Set lessonSet = signup.getOrganisation().getLessons(); + Iterator lessonIterator = lessonSet.iterator(); + while (lessonIterator.hasNext()) { + Lesson lesson = (Lesson) lessonIterator.next(); + lessonService.addLearner(lesson.getLessonId(), user.getUserId()); + if (signup.getAddAsStaff()) { + lessonService.addStaffMember(lesson.getLessonId(), user.getUserId()); + } + } + } + } + + @Override + public User getUserByLogin(String login) { + return userManagementService.getUserByLogin(login); + } + + @Override + public SignupOrganisation getSignupOrganisation(String context) { + return signupDAO.getSignupOrganisation(context); + } + + @Override + public boolean usernameExists(String username) { + return signupDAO.usernameExists(username); + } + + @Override + public boolean courseKeyIsValid(String context, String courseKey) { + return signupDAO.courseKeyIsValid(context, courseKey); + } + + @Override + public List getSignupOrganisations() { + return signupDAO.getSignupOrganisations(); + } + + @Override + public List getOrganisationCandidates() { + return signupDAO.getOrganisationCandidates(); + } + + @Override + public boolean contextExists(Integer soid, String context) { + return signupDAO.contextExists(soid, context); + } + + public void setSignupDAO(ISignupDAO signupDAO) { + this.signupDAO = signupDAO; + } + + public void setUserManagementService(IUserManagementService userManagementService) { + this.userManagementService = userManagementService; + } + + public void setLessonService(ILessonService lessonService) { + this.lessonService = lessonService; + } + + private AuthenticationMethod getAuthenticationMethod(Integer id) { + return (AuthenticationMethod) userManagementService.findById(AuthenticationMethod.class, id); + } + + // replicating LanguageUtil method here because it's service bean injection + // method doesn't work from here + private SupportedLocale getDefaultLocale() { + String localeName = Configuration.get(ConfigurationKeys.SERVER_LANGUAGE); + String langIsoCode = LanguageUtil.DEFAULT_LANGUAGE; + String countryIsoCode = LanguageUtil.DEFAULT_COUNTRY; + if (StringUtils.isNotBlank(localeName) && localeName.length() > 2) { + langIsoCode = localeName.substring(0, 2); + countryIsoCode = localeName.substring(3); + } + + SupportedLocale locale = null; + locale = getSupportedLocaleOrNull(langIsoCode, countryIsoCode); + if (locale == null) { + locale = getSupportedLocaleOrNull(LanguageUtil.DEFAULT_LANGUAGE, LanguageUtil.DEFAULT_COUNTRY); + } + + return locale; + } + + // replicating LanguageUtil method here because it's service bean injection + // method doesn't work from here + private SupportedLocale getSupportedLocaleOrNull(String langIsoCode, String countryIsoCode) { + SupportedLocale locale = null; + + Map properties = new HashMap(); + + if (StringUtils.isNotBlank(countryIsoCode)) { + properties.put("countryIsoCode", countryIsoCode.trim()); + } + if (StringUtils.isNotBlank(langIsoCode)) { + properties.put("languageIsoCode", langIsoCode.trim()); + } + + if (properties.isEmpty()) { + return null; + } + + List list = userManagementService.findByProperties(SupportedLocale.class, properties); + if (list != null && list.size() > 0) { + Collections.sort(list); + locale = (SupportedLocale) list.get(0); + } else { + locale = null; + } + return locale; + } +}