diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/UserAccount.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/UserAccount.java index 2838344f3..8c166cf44 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/UserAccount.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/UserAccount.java @@ -58,6 +58,9 @@ public class UserAccount { private Status status = Status.INACTIVE; // Might be null. private String externalAuthId = ""; // Never null. + /** If this is true, the User Interface will not allow setting a password. */ + private boolean externalAuthOnly = false; + /** This may be empty, but should never be null. */ private Set permissionSetUris = Collections.emptySet(); @@ -136,6 +139,14 @@ public class UserAccount { Boolean.FALSE); } + public boolean isExternalAuthOnly() { + return externalAuthOnly; + } + + public void setExternalAuthOnly(Boolean externalAuthOnly) { + this.externalAuthOnly = nonNull(externalAuthOnly, Boolean.FALSE); + } + public int getLoginCount() { return loginCount; } @@ -213,7 +224,9 @@ public class UserAccount { + (", oldPassword=" + oldPassword) + (", passwordLinkExpires=" + passwordLinkExpires) + (", passwordChangeRequired=" + passwordChangeRequired) + + (", externalAuthOnly=" + externalAuthOnly) + (", loginCount=" + loginCount) + (", status=" + status) + + (", lastLoginTime=" + lastLoginTime) + (", externalAuthId=" + externalAuthId) + (", rootUser=" + rootUser) + (", permissionSetUris=" + permissionSetUris) + "]"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPage.java index 685154aea..6e5c53e20 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPage.java @@ -28,6 +28,7 @@ public class UserAccountsAddPage extends UserAccountsPage { private static final String PARAMETER_SUBMIT = "submitAdd"; private static final String PARAMETER_EMAIL_ADDRESS = "emailAddress"; private static final String PARAMETER_EXTERNAL_AUTH_ID = "externalAuthId"; + private static final String PARAMETER_EXTERNAL_AUTH_ONLY = "externalAuthOnly"; private static final String PARAMETER_FIRST_NAME = "firstName"; private static final String PARAMETER_LAST_NAME = "lastName"; private static final String PARAMETER_ROLE = "role"; @@ -51,6 +52,7 @@ public class UserAccountsAddPage extends UserAccountsPage { private boolean submit; private String emailAddress = ""; private String externalAuthId = ""; + private boolean externalAuthOnly; private String firstName = ""; private String lastName = ""; private String selectedRoleUri = ""; @@ -83,6 +85,7 @@ public class UserAccountsAddPage extends UserAccountsPage { submit = isFlagOnRequest(PARAMETER_SUBMIT); emailAddress = getStringParameter(PARAMETER_EMAIL_ADDRESS, ""); externalAuthId = getStringParameter(PARAMETER_EXTERNAL_AUTH_ID, ""); + externalAuthOnly = isFlagOnRequest(PARAMETER_EXTERNAL_AUTH_ONLY); firstName = getStringParameter(PARAMETER_FIRST_NAME, ""); lastName = getStringParameter(PARAMETER_LAST_NAME, ""); selectedRoleUri = getStringParameter(PARAMETER_ROLE, ""); @@ -144,6 +147,7 @@ public class UserAccountsAddPage extends UserAccountsPage { u.setFirstName(firstName); u.setLastName(lastName); u.setExternalAuthId(externalAuthId); + u.setExternalAuthOnly(externalAuthOnly); u.setMd5Password(""); u.setOldPassword(""); u.setPasswordChangeRequired(false); @@ -195,6 +199,10 @@ public class UserAccountsAddPage extends UserAccountsPage { body.put(PARAMETER_NEW_PROFILE_CLASS_URI, newProfileClassUri); body.put("formUrls", buildUrlsMap()); + if (externalAuthOnly) { + body.put(PARAMETER_EXTERNAL_AUTH_ONLY, Boolean.TRUE); + } + if (!associatedProfileUri.isEmpty()) { body.put("associatedProfileInfo", buildProfileInfo(associatedProfileUri)); @@ -221,4 +229,8 @@ public class UserAccountsAddPage extends UserAccountsPage { return this.strategy.wasPasswordEmailSent(); } + boolean isExternalAuthOnly() { + return externalAuthOnly; + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPageStrategy.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPageStrategy.java index 3e8ac9597..19b135bc3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPageStrategy.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsAddPageStrategy.java @@ -57,7 +57,8 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage { private static class EmailStrategy extends UserAccountsAddPageStrategy { public static final String CREATE_PASSWORD_URL = "/accounts/createPassword"; - private static final String EMAIL_TEMPLATE = "userAccounts-acctCreatedEmail.ftl"; + private static final String EMAIL_TEMPLATE_WITH_PASSWORD = "userAccounts-acctCreatedEmail.ftl"; + private static final String EMAIL_TEMPLATE_NO_PASSWORD = "userAccounts-acctCreatedExternalOnlyEmail.ftl"; private boolean sentEmail; @@ -78,8 +79,13 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage { @Override protected void setAdditionalProperties(UserAccount u) { - u.setPasswordLinkExpires(figureExpirationDate().getTime()); - u.setStatus(Status.INACTIVE); + if (page.isExternalAuthOnly()) { + u.setPasswordLinkExpires(0L); + u.setStatus(Status.ACTIVE); + } else { + u.setPasswordLinkExpires(figureExpirationDate().getTime()); + u.setStatus(Status.INACTIVE); + } } @Override @@ -98,7 +104,11 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage { .createNewMessage(vreq); email.addRecipient(TO, page.getAddedAccount().getEmailAddress()); email.setSubject("Your VIVO account has been created."); - email.setTemplate(EMAIL_TEMPLATE); + if (page.isExternalAuthOnly()) { + email.setTemplate(EMAIL_TEMPLATE_NO_PASSWORD); + } else { + email.setTemplate(EMAIL_TEMPLATE_WITH_PASSWORD); + } email.setBodyMap(body); email.processTemplate(); email.send(); @@ -156,6 +166,11 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage { @Override protected String additionalValidations() { + if (page.isExternalAuthOnly()) { + // No need to check the password info on external-only accounts + return ""; + } + if (initialPassword.isEmpty()) { return ERROR_NO_PASSWORD; } else if (!checkPasswordLength()) { @@ -182,8 +197,11 @@ public abstract class UserAccountsAddPageStrategy extends UserAccountsPage { @Override protected void setAdditionalProperties(UserAccount u) { - u.setMd5Password(Authenticator.applyMd5Encoding(initialPassword)); - u.setPasswordChangeRequired(true); + if (!page.isExternalAuthOnly()) { + u.setMd5Password(Authenticator + .applyMd5Encoding(initialPassword)); + u.setPasswordChangeRequired(true); + } u.setStatus(Status.ACTIVE); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPage.java index ae2459ded..6662e2609 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPage.java @@ -33,6 +33,7 @@ public class UserAccountsEditPage extends UserAccountsPage { private static final String PARAMETER_USER_URI = "editAccount"; private static final String PARAMETER_EMAIL_ADDRESS = "emailAddress"; private static final String PARAMETER_EXTERNAL_AUTH_ID = "externalAuthId"; + private static final String PARAMETER_EXTERNAL_AUTH_ONLY = "externalAuthOnly"; private static final String PARAMETER_FIRST_NAME = "firstName"; private static final String PARAMETER_LAST_NAME = "lastName"; private static final String PARAMETER_ROLE = "role"; @@ -57,6 +58,7 @@ public class UserAccountsEditPage extends UserAccountsPage { private String userUri = ""; private String emailAddress = ""; private String externalAuthId = ""; + private boolean externalAuthOnly; private String firstName = ""; private String lastName = ""; private String selectedRoleUri = ""; @@ -93,6 +95,7 @@ public class UserAccountsEditPage extends UserAccountsPage { userUri = getStringParameter(PARAMETER_USER_URI, ""); emailAddress = getStringParameter(PARAMETER_EMAIL_ADDRESS, ""); externalAuthId = getStringParameter(PARAMETER_EXTERNAL_AUTH_ID, ""); + externalAuthOnly = isFlagOnRequest(PARAMETER_EXTERNAL_AUTH_ONLY); firstName = getStringParameter(PARAMETER_FIRST_NAME, ""); lastName = getStringParameter(PARAMETER_LAST_NAME, ""); selectedRoleUri = getStringParameter(PARAMETER_ROLE, ""); @@ -190,6 +193,10 @@ public class UserAccountsEditPage extends UserAccountsPage { body.put("selectedRole", selectedRoleUri); body.put(PARAMETER_NEW_PROFILE_CLASS_URI, newProfileClassUri); + if (externalAuthOnly) { + body.put(PARAMETER_EXTERNAL_AUTH_ONLY, Boolean.TRUE); + } + if (!associatedProfileUri.isEmpty()) { body.put("associatedProfileInfo", buildProfileInfo(associatedProfileUri)); @@ -202,6 +209,10 @@ public class UserAccountsEditPage extends UserAccountsPage { body.put("selectedRole", getExistingRoleUri()); body.put(PARAMETER_NEW_PROFILE_CLASS_URI, ""); + if (userAccount.isExternalAuthOnly()) { + body.put(PARAMETER_EXTERNAL_AUTH_ONLY, Boolean.TRUE); + } + List associatedInds = SelfEditingConfiguration.getBean( vreq).getAssociatedIndividuals(indDao, userAccount); if (!associatedInds.isEmpty()) { @@ -252,11 +263,20 @@ public class UserAccountsEditPage extends UserAccountsPage { userAccount.setLastName(lastName); userAccount.setExternalAuthId(externalAuthId); + if (externalAuthOnly) { + userAccount.setMd5Password(""); + userAccount.setOldPassword(""); + userAccount.setPasswordChangeRequired(false); + userAccount.setPasswordLinkExpires(0L); + } + if (isRootUser()) { userAccount.setPermissionSetUris(Collections. emptySet()); + userAccount.setExternalAuthOnly(false); } else { userAccount.setPermissionSetUris(Collections .singleton(selectedRoleUri)); + userAccount.setExternalAuthOnly(externalAuthOnly); } strategy.setAdditionalProperties(userAccount); @@ -295,4 +315,7 @@ public class UserAccountsEditPage extends UserAccountsPage { return userAccount; } + boolean isExternalAuthOnly() { + return externalAuthOnly; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPageStrategy.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPageStrategy.java index c71029fc5..a95105402 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPageStrategy.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/admin/UserAccountsEditPageStrategy.java @@ -9,7 +9,6 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; -import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.accounts.UserAccountsPage; @@ -58,7 +57,7 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage { private static class EmailStrategy extends UserAccountsEditPageStrategy { private static final String PARAMETER_RESET_PASSWORD = "resetPassword"; private static final String EMAIL_TEMPLATE = "userAccounts-passwordResetPendingEmail.ftl"; - + public static final String RESET_PASSWORD_URL = "/accounts/resetPassword"; private boolean resetPassword; @@ -81,7 +80,7 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage { @Override protected void setAdditionalProperties(UserAccount u) { - if (resetPassword) { + if (resetPassword && !page.isExternalAuthOnly()) { u.setPasswordLinkExpires(figureExpirationDate().getTime()); } } @@ -99,6 +98,9 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage { if (!resetPassword) { return; } + if (page.isExternalAuthOnly()) { + return; + } Map body = new HashMap(); body.put("userAccount", page.getUpdatedAccount()); @@ -115,7 +117,7 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage { sentEmail = true; } - + private String buildResetPasswordLink() { try { String email = page.getUpdatedAccount().getEmailAddress(); @@ -165,6 +167,11 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage { @Override protected String additionalValidations() { + if (page.isExternalAuthOnly()) { + // No need to check the password info on external-only accounts + return ""; + } + if (newPassword.isEmpty() && confirmPassword.isEmpty()) { return ""; } else if (!checkPasswordLength(newPassword)) { @@ -186,7 +193,7 @@ public abstract class UserAccountsEditPageStrategy extends UserAccountsPage { @Override protected void setAdditionalProperties(UserAccount u) { - if (!newPassword.isEmpty()) { + if (!page.isExternalAuthOnly() && !newPassword.isEmpty()) { u.setMd5Password(Authenticator.applyMd5Encoding(newPassword)); u.setPasswordChangeRequired(true); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java index 7b1d00572..fd556b155 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsFirstTimeExternalPage.java @@ -192,6 +192,7 @@ public class UserAccountsFirstTimeExternalPage extends UserAccountsPage { u.setExternalAuthId(externalAuthId); u.setPasswordChangeRequired(false); u.setPasswordLinkExpires(0); + u.setExternalAuthOnly(true); u.setLoginCount(0); u.setStatus(Status.ACTIVE); u.setPermissionSetUris(Collections diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java index e14c65b71..d95023575 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPage.java @@ -134,6 +134,9 @@ public class UserAccountsMyAccountPage extends UserAccountsPage { } body.put("formUrls", buildUrlsMap()); + if (userAccount.isExternalAuthOnly()) { + body.put("externalAuthOnly", Boolean.TRUE); + } if (!errorCode.isEmpty()) { body.put(errorCode, Boolean.TRUE); } @@ -159,4 +162,7 @@ public class UserAccountsMyAccountPage extends UserAccountsPage { confirmationCode = strategy.getConfirmationCode(); } + boolean isExternalAuthOnly() { + return (userAccount != null) && userAccount.isExternalAuthOnly(); + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPageStrategy.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPageStrategy.java index d962165cd..4a1435db3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPageStrategy.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsMyAccountPageStrategy.java @@ -107,7 +107,7 @@ public abstract class UserAccountsMyAccountPageStrategy extends private static final String ERROR_WRONG_PASSWORD_LENGTH = "errorPasswordIsWrongLength"; private static final String ERROR_PASSWORDS_DONT_MATCH = "errorPasswordsDontMatch"; - + private static final String EMAIL_TEMPLATE = "userAccounts-confirmEmailChangedEmail.ftl"; private final String originalEmail; @@ -129,12 +129,16 @@ public abstract class UserAccountsMyAccountPageStrategy extends @Override public String additionalValidations() { - if (newPassword.isEmpty() && confirmPassword.isEmpty()) { - return ""; - } else if (!newPassword.equals(confirmPassword)) { - return ERROR_PASSWORDS_DONT_MATCH; - } else if (!checkPasswordLength(newPassword)) { - return ERROR_WRONG_PASSWORD_LENGTH; + if (!page.isExternalAuthOnly()) { + if (newPassword.isEmpty() && confirmPassword.isEmpty()) { + return ""; + } else if (!newPassword.equals(confirmPassword)) { + return ERROR_PASSWORDS_DONT_MATCH; + } else if (!checkPasswordLength(newPassword)) { + return ERROR_WRONG_PASSWORD_LENGTH; + } else { + return ""; + } } else { return ""; } @@ -150,7 +154,7 @@ public abstract class UserAccountsMyAccountPageStrategy extends @Override public void setAdditionalProperties(UserAccount userAccount) { - if (!newPassword.isEmpty()) { + if (!newPassword.isEmpty() && !page.isExternalAuthOnly()) { userAccount.setMd5Password(Authenticator .applyMd5Encoding(newPassword)); userAccount.setPasswordChangeRequired(false); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsPasswordBasePage.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsPasswordBasePage.java index 2cf64c585..73b2b09a6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsPasswordBasePage.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/accounts/user/UserAccountsPasswordBasePage.java @@ -81,15 +81,22 @@ public abstract class UserAccountsPasswordBasePage extends UserAccountsPage { } if (userAccount.getPasswordLinkExpires() == 0L) { - log.warn("Password request for '" + userEmail + log.info("Password request for '" + userEmail + "' is bogus: password change is not pending."); bogusMessage = passwordChangeNotPendingMessage(); return; } + if (userAccount.isExternalAuthOnly()) { + log.info("Password request for '" + userEmail + + "' is bogus: account is external auth only."); + bogusMessage = passwordChangeNotPendingMessage(); + return; + } + Date expirationDate = new Date(userAccount.getPasswordLinkExpires()); if (expirationDate.before(new Date())) { - log.warn("Password request for '" + userEmail + log.info("Password request for '" + userEmail + "' is bogus: expiration date has passed."); bogusMessage = BOGUS_STANDARD_MESSAGE; return; @@ -146,5 +153,6 @@ public abstract class UserAccountsPasswordBasePage extends UserAccountsPage { } protected abstract String passwordChangeNotPendingMessage(); + protected abstract String templateName(); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java index 470e52d17..4ba887039 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VitroVocabulary.java @@ -163,6 +163,7 @@ public class VitroVocabulary { public static final String USERACCOUNT_PASSWORD_LINK_EXPIRES = VITRO_AUTH + "passwordLinkExpires"; public static final String USERACCOUNT_PASSWORD_CHANGE_REQUIRED = VITRO_AUTH + "passwordChangeRequired"; public static final String USERACCOUNT_EXTERNAL_AUTH_ID = VITRO_AUTH + "externalAuthId"; + public static final String USERACCOUNT_EXTERNAL_AUTH_ONLY = VITRO_AUTH + "externalAuthOnly"; public static final String USERACCOUNT_HAS_PERMISSION_SET = VITRO_AUTH + "hasPermissionSet"; public static final String PERMISSIONSET = VITRO_AUTH + "PermissionSet"; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoCon.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoCon.java index ecd7aecb9..930cd79af 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoCon.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDaoCon.java @@ -137,6 +137,7 @@ public class JenaBaseDaoCon { protected DatatypeProperty USERACCOUNT_PASSWORD_LINK_EXPIRES = _constModel.createDatatypeProperty(VitroVocabulary.USERACCOUNT_PASSWORD_LINK_EXPIRES); protected DatatypeProperty USERACCOUNT_PASSWORD_CHANGE_REQUIRED = _constModel.createDatatypeProperty(VitroVocabulary.USERACCOUNT_PASSWORD_CHANGE_REQUIRED); protected DatatypeProperty USERACCOUNT_EXTERNAL_AUTH_ID = _constModel.createDatatypeProperty(VitroVocabulary.USERACCOUNT_EXTERNAL_AUTH_ID); + protected DatatypeProperty USERACCOUNT_EXTERNAL_AUTH_ONLY = _constModel.createDatatypeProperty(VitroVocabulary.USERACCOUNT_EXTERNAL_AUTH_ONLY); protected ObjectProperty USERACCOUNT_HAS_PERMISSION_SET = _constModel.createObjectProperty(VitroVocabulary.USERACCOUNT_HAS_PERMISSION_SET); protected OntClass PERMISSIONSET = _constModel.createClass(VitroVocabulary.PERMISSIONSET); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java index 64ca0bd5c..9989e5e00 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJena.java @@ -97,8 +97,11 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao USERACCOUNT_PASSWORD_LINK_EXPIRES)); u.setPasswordChangeRequired(getPropertyBooleanValue(r, USERACCOUNT_PASSWORD_CHANGE_REQUIRED)); + u.setExternalAuthOnly(getPropertyBooleanValue(r, + USERACCOUNT_EXTERNAL_AUTH_ONLY)); u.setLoginCount(getPropertyIntValue(r, USERACCOUNT_LOGIN_COUNT)); - u.setLastLoginTime(getPropertyLongValue(r, USERACCOUNT_LAST_LOGIN_TIME)); + u.setLastLoginTime(getPropertyLongValue(r, + USERACCOUNT_LAST_LOGIN_TIME)); u.setStatusFromString(getPropertyStringValue(r, USERACCOUNT_STATUS)); u.setExternalAuthId(getPropertyStringValue(r, USERACCOUNT_EXTERNAL_AUTH_ID)); @@ -189,6 +192,8 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao userAccount.getPasswordLinkExpires(), model); addPropertyBooleanValue(res, USERACCOUNT_PASSWORD_CHANGE_REQUIRED, userAccount.isPasswordChangeRequired(), model); + addPropertyBooleanValue(res, USERACCOUNT_EXTERNAL_AUTH_ONLY, + userAccount.isExternalAuthOnly(), model); addPropertyIntValue(res, USERACCOUNT_LOGIN_COUNT, userAccount.getLoginCount(), model); addPropertyLongValue(res, USERACCOUNT_LAST_LOGIN_TIME, @@ -248,6 +253,8 @@ public class UserAccountsDaoJena extends JenaBaseDao implements UserAccountsDao updatePropertyBooleanValue(res, USERACCOUNT_PASSWORD_CHANGE_REQUIRED, userAccount.isPasswordChangeRequired(), model, true); + updatePropertyBooleanValue(res, USERACCOUNT_EXTERNAL_AUTH_ONLY, + userAccount.isExternalAuthOnly(), model, true); updatePropertyIntValue(res, USERACCOUNT_LOGIN_COUNT, userAccount.getLoginCount(), model); updatePropertyLongValue(res, USERACCOUNT_LAST_LOGIN_TIME, diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java index f48ee72c4..d01df1f55 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/dao/jena/UserAccountsDaoJenaTest.java @@ -84,6 +84,7 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEquals("oldPassword", "", u.getOldPassword()); assertEquals("linkExpires", 0L, u.getPasswordLinkExpires()); assertEquals("changeRequired", false, u.isPasswordChangeRequired()); + assertEquals("externalOnly", false, u.isExternalAuthOnly()); assertEquals("loginCount", 5, u.getLoginCount()); assertEquals("loginTime", 12345678L, u.getLastLoginTime()); assertEquals("status", Status.ACTIVE, u.getStatus()); @@ -140,6 +141,7 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { in.setOldPassword("oldHash"); in.setPasswordLinkExpires(999966663333L); in.setPasswordChangeRequired(true); + in.setExternalAuthOnly(true); in.setLoginCount(42); in.setLastLoginTime(8877665544332211L); in.setStatus(Status.INACTIVE); @@ -157,6 +159,7 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEquals("oldPassword", "oldHash", u.getOldPassword()); assertEquals("linkExpires", 999966663333L, u.getPasswordLinkExpires()); assertEquals("changeRequired", true, u.isPasswordChangeRequired()); + assertEquals("externalOnly", true, u.isExternalAuthOnly()); assertEquals("loginCount", 42, u.getLoginCount()); assertEquals("lastLoginTime", 8877665544332211L, u.getLastLoginTime()); assertEquals("status", Status.INACTIVE, u.getStatus()); @@ -189,6 +192,7 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { up.setOldPassword("oldHash"); up.setPasswordLinkExpires(1L); up.setPasswordChangeRequired(false); + up.setExternalAuthOnly(false); up.setLoginCount(43); up.setLastLoginTime(1020304050607080L); up.setStatus(Status.ACTIVE); @@ -206,6 +210,7 @@ public class UserAccountsDaoJenaTest extends AbstractTestClass { assertEquals("oldPassword", "oldHash", u.getOldPassword()); assertEquals("changeExpires", 1L, u.getPasswordLinkExpires()); assertEquals("changeRequired", false, u.isPasswordChangeRequired()); + assertEquals("externalOnly", false, u.isExternalAuthOnly()); assertEquals("loginCount", 43, u.getLoginCount()); assertEquals("lastLoginTime", 1020304050607080L, u.getLastLoginTime()); assertEquals("status", Status.ACTIVE, u.getStatus()); diff --git a/webapp/web/templates/freemarker/body/accounts/userAccounts-acctCreatedExternalOnlyEmail.ftl b/webapp/web/templates/freemarker/body/accounts/userAccounts-acctCreatedExternalOnlyEmail.ftl new file mode 100644 index 000000000..df2959656 --- /dev/null +++ b/webapp/web/templates/freemarker/body/accounts/userAccounts-acctCreatedExternalOnlyEmail.ftl @@ -0,0 +1,43 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- Confirmation that an account has been created. --> + +<#assign subject = "Your ${siteName} account has been created." /> + +<#assign html> + + + ${subject} + + +

+ ${userAccount.firstName} ${userAccount.lastName} +

+ +

+ Congratulations! +

+ +

+ We have created your new VIVO account associated with ${userAccount.emailAddress}. +

+ +

+ Thanks! +

+ + + + +<#assign text> +${userAccount.firstName} ${userAccount.lastName} + +Congratulations! + +We have created your new VIVO account associated with +${userAccount.emailAddress}. + +Thanks! + + +<@email subject=subject html=html text=text /> \ No newline at end of file