diff --git a/src/main/config/es/fess_user.json b/src/main/config/es/fess_user.json index 996950047..5d463182f 100644 --- a/src/main/config/es/fess_user.json +++ b/src/main/config/es/fess_user.json @@ -29,6 +29,14 @@ "type" : "string", "index" : "not_analyzed" }, + "surname" : { + "type" : "string", + "index" : "not_analyzed" + }, + "givenName" : { + "type" : "string", + "index" : "not_analyzed" + }, "roles" : { "type" : "string", "index" : "not_analyzed" diff --git a/src/main/java/org/codelibs/fess/app/web/RootAction.java b/src/main/java/org/codelibs/fess/app/web/RootAction.java index c91afd2b2..48d972aaa 100644 --- a/src/main/java/org/codelibs/fess/app/web/RootAction.java +++ b/src/main/java/org/codelibs/fess/app/web/RootAction.java @@ -15,8 +15,6 @@ */ package org.codelibs.fess.app.web; -import org.codelibs.core.lang.StringUtil; -import org.codelibs.fess.Constants; import org.codelibs.fess.app.web.base.FessSearchAction; import org.codelibs.fess.app.web.base.SearchForm; import org.codelibs.fess.util.RenderDataUtil; diff --git a/src/main/java/org/codelibs/fess/app/web/admin/user/CreateForm.java b/src/main/java/org/codelibs/fess/app/web/admin/user/CreateForm.java index 163e8bb3c..87176ca8c 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/user/CreateForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/user/CreateForm.java @@ -43,6 +43,13 @@ public class CreateForm implements Serializable { @Size(max = 100) public String confirmPassword; + @Required + @Size(max = 1000) + public String surname; + + @Size(max = 1000) + public String givenName; + public String[] roles; public String[] groups; diff --git a/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java b/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java index 9468d0588..b2d6806c5 100644 --- a/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java +++ b/src/main/java/org/codelibs/fess/app/web/login/LoginAction.java @@ -15,8 +15,6 @@ */ package org.codelibs.fess.app.web.login; -import org.codelibs.core.lang.StringUtil; -import org.codelibs.fess.Constants; import org.codelibs.fess.app.web.admin.dashboard.AdminDashboardAction; import org.codelibs.fess.app.web.base.FessSearchAction; import org.codelibs.fess.mylasta.action.FessUserBean; diff --git a/src/main/java/org/codelibs/fess/es/user/bsbhv/BsUserBhv.java b/src/main/java/org/codelibs/fess/es/user/bsbhv/BsUserBhv.java index 008c546de..e836e375d 100644 --- a/src/main/java/org/codelibs/fess/es/user/bsbhv/BsUserBhv.java +++ b/src/main/java/org/codelibs/fess/es/user/bsbhv/BsUserBhv.java @@ -77,6 +77,8 @@ public abstract class BsUserBhv extends EsAbstractBehavior { result.setGroups(toStringArray(source.get("groups"))); result.setName(DfTypeUtil.toString(source.get("name"))); result.setPassword(DfTypeUtil.toString(source.get("password"))); + result.setSurname(DfTypeUtil.toString(source.get("surname"))); + result.setGivenName(DfTypeUtil.toString(source.get("givenName"))); result.setRoles(toStringArray(source.get("roles"))); return result; } catch (InstantiationException | IllegalAccessException e) { diff --git a/src/main/java/org/codelibs/fess/es/user/bsentity/BsUser.java b/src/main/java/org/codelibs/fess/es/user/bsentity/BsUser.java index 961dbab2c..4b2545097 100644 --- a/src/main/java/org/codelibs/fess/es/user/bsentity/BsUser.java +++ b/src/main/java/org/codelibs/fess/es/user/bsentity/BsUser.java @@ -46,6 +46,12 @@ public class BsUser extends EsAbstractEntity { /** password */ protected String password; + /** surname */ + protected String surname; + + /** givenName */ + protected String givenName; + /** roles */ protected String[] roles; @@ -79,6 +85,12 @@ public class BsUser extends EsAbstractEntity { if (password != null) { sourceMap.put("password", password); } + if (surname != null) { + sourceMap.put("surname", surname); + } + if (givenName != null) { + sourceMap.put("givenName", givenName); + } if (roles != null) { sourceMap.put("roles", roles); } @@ -94,6 +106,8 @@ public class BsUser extends EsAbstractEntity { sb.append(dm).append(groups); sb.append(dm).append(name); sb.append(dm).append(password); + sb.append(dm).append(surname); + sb.append(dm).append(givenName); sb.append(dm).append(roles); if (sb.length() > dm.length()) { sb.delete(0, dm.length()); @@ -135,6 +149,26 @@ public class BsUser extends EsAbstractEntity { this.password = value; } + public String getSurname() { + checkSpecifiedProperty("surname"); + return convertEmptyToNull(surname); + } + + public void setSurname(String value) { + registerModifiedProperty("surname"); + this.surname = value; + } + + public String getGivenName() { + checkSpecifiedProperty("givenName"); + return convertEmptyToNull(givenName); + } + + public void setGivenName(String value) { + registerModifiedProperty("givenName"); + this.givenName = value; + } + public String[] getRoles() { checkSpecifiedProperty("roles"); return roles; diff --git a/src/main/java/org/codelibs/fess/es/user/bsentity/dbmeta/UserDbm.java b/src/main/java/org/codelibs/fess/es/user/bsentity/dbmeta/UserDbm.java index ce2faa348..d0b24bd41 100644 --- a/src/main/java/org/codelibs/fess/es/user/bsentity/dbmeta/UserDbm.java +++ b/src/main/java/org/codelibs/fess/es/user/bsentity/dbmeta/UserDbm.java @@ -82,6 +82,8 @@ public class UserDbm extends AbstractDBMeta { setupEpg(_epgMap, et -> ((User) et).getGroups(), (et, vl) -> ((User) et).setGroups((String[]) vl), "groups"); setupEpg(_epgMap, et -> ((User) et).getName(), (et, vl) -> ((User) et).setName(DfTypeUtil.toString(vl)), "name"); setupEpg(_epgMap, et -> ((User) et).getPassword(), (et, vl) -> ((User) et).setPassword(DfTypeUtil.toString(vl)), "password"); + setupEpg(_epgMap, et -> ((User) et).getSurname(), (et, vl) -> ((User) et).setSurname(DfTypeUtil.toString(vl)), "surname"); + setupEpg(_epgMap, et -> ((User) et).getGivenName(), (et, vl) -> ((User) et).setGivenName(DfTypeUtil.toString(vl)), "givenName"); setupEpg(_epgMap, et -> ((User) et).getRoles(), (et, vl) -> ((User) et).setRoles((String[]) vl), "roles"); } @@ -125,6 +127,10 @@ public class UserDbm extends AbstractDBMeta { 0, null, false, null, null, null, null, null, false); protected final ColumnInfo _columnPassword = cci("password", "password", null, null, String.class, "password", null, false, false, false, "String", 0, 0, null, false, null, null, null, null, null, false); + protected final ColumnInfo _columnSurname = cci("surname", "surname", null, null, String.class, "surname", null, false, false, false, + "String", 0, 0, null, false, null, null, null, null, null, false); + protected final ColumnInfo _columnGivenName = cci("givenName", "givenName", null, null, String.class, "givenName", null, false, false, + false, "String", 0, 0, null, false, null, null, null, null, null, false); protected final ColumnInfo _columnRoles = cci("roles", "roles", null, null, String[].class, "roles", null, false, false, false, "String", 0, 0, null, false, null, null, null, null, null, false); @@ -140,6 +146,14 @@ public class UserDbm extends AbstractDBMeta { return _columnPassword; } + public ColumnInfo columnSurname() { + return _columnSurname; + } + + public ColumnInfo columnGivenName() { + return _columnGivenName; + } + public ColumnInfo columnRoles() { return _columnRoles; } @@ -149,6 +163,8 @@ public class UserDbm extends AbstractDBMeta { ls.add(columnGroups()); ls.add(columnName()); ls.add(columnPassword()); + ls.add(columnSurname()); + ls.add(columnGivenName()); ls.add(columnRoles()); return ls; } diff --git a/src/main/java/org/codelibs/fess/es/user/cbean/bs/BsUserCB.java b/src/main/java/org/codelibs/fess/es/user/cbean/bs/BsUserCB.java index d07bb8c57..3b66ceef9 100644 --- a/src/main/java/org/codelibs/fess/es/user/cbean/bs/BsUserCB.java +++ b/src/main/java/org/codelibs/fess/es/user/cbean/bs/BsUserCB.java @@ -170,6 +170,14 @@ public class BsUserCB extends EsAbstractConditionBean { doColumn("password"); } + public void columnSurname() { + doColumn("surname"); + } + + public void columnGivenName() { + doColumn("givenName"); + } + public void columnRoles() { doColumn("roles"); } diff --git a/src/main/java/org/codelibs/fess/es/user/cbean/cq/bs/BsUserCQ.java b/src/main/java/org/codelibs/fess/es/user/cbean/cq/bs/BsUserCQ.java index 79b6a12b1..3b42913f7 100644 --- a/src/main/java/org/codelibs/fess/es/user/cbean/cq/bs/BsUserCQ.java +++ b/src/main/java/org/codelibs/fess/es/user/cbean/cq/bs/BsUserCQ.java @@ -673,6 +673,338 @@ public abstract class BsUserCQ extends EsAbstractConditionQuery { return this; } + public void setSurname_Equal(String surname) { + setSurname_Term(surname, null); + } + + public void setSurname_Equal(String surname, ConditionOptionCall opLambda) { + setSurname_Term(surname, opLambda); + } + + public void setSurname_Term(String surname) { + setSurname_Term(surname, null); + } + + public void setSurname_Term(String surname, ConditionOptionCall opLambda) { + TermQueryBuilder builder = regTermQ("surname", surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_NotEqual(String surname) { + setSurname_NotTerm(surname, null); + } + + public void setSurname_NotEqual(String surname, ConditionOptionCall opLambda) { + setSurname_NotTerm(surname, opLambda); + } + + public void setSurname_NotTerm(String surname) { + setSurname_NotTerm(surname, null); + } + + public void setSurname_NotTerm(String surname, ConditionOptionCall opLambda) { + NotQueryBuilder builder = QueryBuilders.notQuery(regTermQ("surname", surname)); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_Terms(Collection surnameList) { + setSurname_Terms(surnameList, null); + } + + public void setSurname_Terms(Collection surnameList, ConditionOptionCall opLambda) { + TermsQueryBuilder builder = regTermsQ("surname", surnameList); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_InScope(Collection surnameList) { + setSurname_Terms(surnameList, null); + } + + public void setSurname_InScope(Collection surnameList, ConditionOptionCall opLambda) { + setSurname_Terms(surnameList, opLambda); + } + + public void setSurname_Match(String surname) { + setSurname_Match(surname, null); + } + + public void setSurname_Match(String surname, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchQ("surname", surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_MatchPhrase(String surname) { + setSurname_MatchPhrase(surname, null); + } + + public void setSurname_MatchPhrase(String surname, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchPhraseQ("surname", surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_MatchPhrasePrefix(String surname) { + setSurname_MatchPhrasePrefix(surname, null); + } + + public void setSurname_MatchPhrasePrefix(String surname, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchPhrasePrefixQ("surname", surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_Fuzzy(String surname) { + setSurname_Fuzzy(surname, null); + } + + public void setSurname_Fuzzy(String surname, ConditionOptionCall opLambda) { + FuzzyQueryBuilder builder = regFuzzyQ("surname", surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_Prefix(String surname) { + setSurname_Prefix(surname, null); + } + + public void setSurname_Prefix(String surname, ConditionOptionCall opLambda) { + PrefixQueryBuilder builder = regPrefixQ("surname", surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_GreaterThan(String surname) { + setSurname_GreaterThan(surname, null); + } + + public void setSurname_GreaterThan(String surname, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("surname", ConditionKey.CK_GREATER_THAN, surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_LessThan(String surname) { + setSurname_LessThan(surname, null); + } + + public void setSurname_LessThan(String surname, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("surname", ConditionKey.CK_LESS_THAN, surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_GreaterEqual(String surname) { + setSurname_GreaterEqual(surname, null); + } + + public void setSurname_GreaterEqual(String surname, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("surname", ConditionKey.CK_GREATER_EQUAL, surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setSurname_LessEqual(String surname) { + setSurname_LessEqual(surname, null); + } + + public void setSurname_LessEqual(String surname, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("surname", ConditionKey.CK_LESS_EQUAL, surname); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public BsUserCQ addOrderBy_Surname_Asc() { + regOBA("surname"); + return this; + } + + public BsUserCQ addOrderBy_Surname_Desc() { + regOBD("surname"); + return this; + } + + public void setGivenName_Equal(String givenName) { + setGivenName_Term(givenName, null); + } + + public void setGivenName_Equal(String givenName, ConditionOptionCall opLambda) { + setGivenName_Term(givenName, opLambda); + } + + public void setGivenName_Term(String givenName) { + setGivenName_Term(givenName, null); + } + + public void setGivenName_Term(String givenName, ConditionOptionCall opLambda) { + TermQueryBuilder builder = regTermQ("givenName", givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_NotEqual(String givenName) { + setGivenName_NotTerm(givenName, null); + } + + public void setGivenName_NotEqual(String givenName, ConditionOptionCall opLambda) { + setGivenName_NotTerm(givenName, opLambda); + } + + public void setGivenName_NotTerm(String givenName) { + setGivenName_NotTerm(givenName, null); + } + + public void setGivenName_NotTerm(String givenName, ConditionOptionCall opLambda) { + NotQueryBuilder builder = QueryBuilders.notQuery(regTermQ("givenName", givenName)); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_Terms(Collection givenNameList) { + setGivenName_Terms(givenNameList, null); + } + + public void setGivenName_Terms(Collection givenNameList, ConditionOptionCall opLambda) { + TermsQueryBuilder builder = regTermsQ("givenName", givenNameList); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_InScope(Collection givenNameList) { + setGivenName_Terms(givenNameList, null); + } + + public void setGivenName_InScope(Collection givenNameList, ConditionOptionCall opLambda) { + setGivenName_Terms(givenNameList, opLambda); + } + + public void setGivenName_Match(String givenName) { + setGivenName_Match(givenName, null); + } + + public void setGivenName_Match(String givenName, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchQ("givenName", givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_MatchPhrase(String givenName) { + setGivenName_MatchPhrase(givenName, null); + } + + public void setGivenName_MatchPhrase(String givenName, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchPhraseQ("givenName", givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_MatchPhrasePrefix(String givenName) { + setGivenName_MatchPhrasePrefix(givenName, null); + } + + public void setGivenName_MatchPhrasePrefix(String givenName, ConditionOptionCall opLambda) { + MatchQueryBuilder builder = regMatchPhrasePrefixQ("givenName", givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_Fuzzy(String givenName) { + setGivenName_Fuzzy(givenName, null); + } + + public void setGivenName_Fuzzy(String givenName, ConditionOptionCall opLambda) { + FuzzyQueryBuilder builder = regFuzzyQ("givenName", givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_Prefix(String givenName) { + setGivenName_Prefix(givenName, null); + } + + public void setGivenName_Prefix(String givenName, ConditionOptionCall opLambda) { + PrefixQueryBuilder builder = regPrefixQ("givenName", givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_GreaterThan(String givenName) { + setGivenName_GreaterThan(givenName, null); + } + + public void setGivenName_GreaterThan(String givenName, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("givenName", ConditionKey.CK_GREATER_THAN, givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_LessThan(String givenName) { + setGivenName_LessThan(givenName, null); + } + + public void setGivenName_LessThan(String givenName, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("givenName", ConditionKey.CK_LESS_THAN, givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_GreaterEqual(String givenName) { + setGivenName_GreaterEqual(givenName, null); + } + + public void setGivenName_GreaterEqual(String givenName, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("givenName", ConditionKey.CK_GREATER_EQUAL, givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public void setGivenName_LessEqual(String givenName) { + setGivenName_LessEqual(givenName, null); + } + + public void setGivenName_LessEqual(String givenName, ConditionOptionCall opLambda) { + RangeQueryBuilder builder = regRangeQ("givenName", ConditionKey.CK_LESS_EQUAL, givenName); + if (opLambda != null) { + opLambda.callback(builder); + } + } + + public BsUserCQ addOrderBy_GivenName_Asc() { + regOBA("givenName"); + return this; + } + + public BsUserCQ addOrderBy_GivenName_Desc() { + regOBD("givenName"); + return this; + } + public void setRoles_Equal(String roles) { setRoles_Term(roles, null); } diff --git a/src/main/java/org/codelibs/fess/ldap/LdapManager.java b/src/main/java/org/codelibs/fess/ldap/LdapManager.java index c9128bea8..010b56fa8 100644 --- a/src/main/java/org/codelibs/fess/ldap/LdapManager.java +++ b/src/main/java/org/codelibs/fess/ldap/LdapManager.java @@ -16,6 +16,7 @@ package org.codelibs.fess.ldap; import java.util.ArrayList; +import java.util.Collections; import java.util.Hashtable; import java.util.List; import java.util.Locale; @@ -45,6 +46,7 @@ import org.codelibs.fess.exception.LdapOperationException; import org.codelibs.fess.helper.SystemHelper; import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.util.ComponentUtil; +import org.codelibs.fess.util.OptionalUtil; import org.codelibs.fess.util.StreamUtil; import org.dbflute.optional.OptionalEntity; import org.slf4j.Logger; @@ -176,6 +178,32 @@ public class LdapManager { } } + protected List getAttributeValueList(final NamingEnumeration result, final String name) { + try { + while (result.hasMoreElements()) { + final SearchResult srcrslt = result.next(); + final Attributes attrs = srcrslt.getAttributes(); + + final Attribute attr = attrs.get(name); + if (attr == null) { + continue; + } + + final List attrList = new ArrayList<>(); + for (int i = 0; i < attr.size(); i++) { + final Object attrValue = attr.get(i); + if (attrValue != null) { + attrList.add(attrValue); + } + } + return attrList; + } + return Collections.emptyList(); + } catch (NamingException e) { + throw new LdapOperationException("Failed to parse attribute values for " + name, e); + } + } + public void insert(final User user) { final FessConfig fessConfig = ComponentUtil.getFessConfig(); if (!fessConfig.isLdapAdminEnabled()) { @@ -190,11 +218,7 @@ public class LdapManager { adminEnv, result -> { if (result.hasMore()) { - if (user.getOriginalPassword() != null) { - final List modifyList = new ArrayList<>(); - modifyReplaceEntry(modifyList, "userPassword", user.getOriginalPassword()); - modify(userDN, modifyList, adminEnv); - } + modifyUserAttributes(user, adminEnv, userDN, result, fessConfig); final List oldGroupList = new ArrayList<>(); final List oldRoleList = new ArrayList<>(); @@ -208,7 +232,6 @@ public class LdapManager { oldRoleList.add(name); } }); - final List newGroupList = StreamUtil.of(user.getGroupNames()).collect(Collectors.toList()); StreamUtil.of(user.getGroupNames()).forEach(name -> { if (oldGroupList.contains(name)) { @@ -315,10 +338,38 @@ public class LdapManager { } + protected void modifyUserAttributes(final User user, final Supplier> adminEnv, final String userDN, + final NamingEnumeration result, final FessConfig fessConfig) { + final List modifyList = new ArrayList<>(); + if (user.getOriginalPassword() != null) { + modifyReplaceEntry(modifyList, "userPassword", user.getOriginalPassword()); + } + + final String attrSurname = fessConfig.getLdapAttrSurname(); + OptionalUtil + .ofNullable(user.getSurname()) + .filter(s -> StringUtil.isNotBlank(s)) + .ifPresent(s -> modifyReplaceEntry(modifyList, attrSurname, s)) + .orElse(() -> getAttributeValueList(result, attrSurname).stream().forEach( + v -> modifyDeleteEntry(modifyList, attrSurname, v))); + final String attrGivenName = fessConfig.getLdapAttrGivenName(); + OptionalUtil + .ofNullable(user.getGivenName()) + .filter(s -> StringUtil.isNotBlank(s)) + .ifPresent(s -> modifyReplaceEntry(modifyList, attrGivenName, s)) + .orElse(() -> getAttributeValueList(result, attrGivenName).stream().forEach( + v -> modifyDeleteEntry(modifyList, attrGivenName, v))); + modify(userDN, modifyList, adminEnv); + } + protected void addUserAttributes(final BasicAttributes entry, final User user, final FessConfig fessConfig) { entry.put(new BasicAttribute("cn", user.getName())); - entry.put(new BasicAttribute("sn", user.getName())); entry.put(new BasicAttribute("userPassword", user.getOriginalPassword())); + + OptionalUtil.ofNullable(user.getSurname()).filter(s -> StringUtil.isNotBlank(s)) + .ifPresent(s -> entry.put(new BasicAttribute(fessConfig.getLdapAttrSurname(), s))); + OptionalUtil.ofNullable(user.getGivenName()).filter(s -> StringUtil.isNotBlank(s)) + .ifPresent(s -> entry.put(new BasicAttribute(fessConfig.getLdapAttrGivenName(), s))); } public void delete(final User user) { @@ -516,7 +567,7 @@ public class LdapManager { modifyList.add(mod); } - protected void modifyDeleteEntry(final List modifyList, final String name, final String value) { + protected void modifyDeleteEntry(final List modifyList, final String name, final Object value) { final Attribute attr = new BasicAttribute(name, value); final ModificationItem mod = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr); modifyList.add(mod); diff --git a/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java b/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java index 0ddc3a006..5e1471189 100644 --- a/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java +++ b/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java @@ -2070,6 +2070,18 @@ public class FessLabels extends ActionMessages { /** The key of the message: The limit of a search time was exceeded. The partial result might be displayed. */ public static final String LABELS_process_time_is_exceeded = "{labels.process_time_is_exceeded}"; + /** The key of the message: First Name */ + public static final String LABELS_user_given_name = "{labels.user_given_name}"; + + /** The key of the message: First Name */ + public static final String LABELS_GIVEN_NAME = "{labels.givenName}"; + + /** The key of the message: Last Name */ + public static final String LABELS_user_surname = "{labels.user_surname}"; + + /** The key of the message: Last Name */ + public static final String LABELS_SURAME = "{labels.surame}"; + /** * Assert the property is not null. * @param property The value of the property. (NotNull) diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java index 4a785eb0a..9d118b68c 100644 --- a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java +++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java @@ -774,6 +774,12 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction /** The key of the configuration. e.g. R */ String LDAP_ROLE_SEARCH_ROLE_PREFIX = "ldap.role.search.role.prefix"; + /** The key of the configuration. e.g. sn */ + String LDAP_ATTR_SURNAME = "ldap.attr.surname"; + + /** The key of the configuration. e.g. givenName */ + String LDAP_ATTR_GIVEN_NAME = "ldap.attr.givenName"; + /** * Get the value of property as {@link String}. * @param propertyKey The key of the property. (NotNull) @@ -3182,6 +3188,20 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction */ String getLdapRoleSearchRolePrefix(); + /** + * Get the value for the key 'ldap.attr.surname'.
+ * The value is, e.g. sn
+ * @return The value of found property. (NotNull: if not found, exception but basically no way) + */ + String getLdapAttrSurname(); + + /** + * Get the value for the key 'ldap.attr.givenName'.
+ * The value is, e.g. givenName
+ * @return The value of found property. (NotNull: if not found, exception but basically no way) + */ + String getLdapAttrGivenName(); + /** * The simple implementation for configuration. * @author FreeGen @@ -4446,5 +4466,13 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction public String getLdapRoleSearchRolePrefix() { return get(FessConfig.LDAP_ROLE_SEARCH_ROLE_PREFIX); } + + public String getLdapAttrSurname() { + return get(FessConfig.LDAP_ATTR_SURNAME); + } + + public String getLdapAttrGivenName() { + return get(FessConfig.LDAP_ATTR_GIVEN_NAME); + } } } diff --git a/src/main/java/org/codelibs/fess/util/OptionalUtil.java b/src/main/java/org/codelibs/fess/util/OptionalUtil.java new file mode 100644 index 000000000..e9209eaf1 --- /dev/null +++ b/src/main/java/org/codelibs/fess/util/OptionalUtil.java @@ -0,0 +1,26 @@ +/* + * Copyright 2012-2016 CodeLibs Project and the Others. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.codelibs.fess.util; + +import org.dbflute.optional.OptionalEntity; + +public class OptionalUtil { + + public static OptionalEntity ofNullable(T entity) { + return OptionalEntity.ofNullable(entity, () -> {}); + } + +} diff --git a/src/main/resources/fess_config.properties b/src/main/resources/fess_config.properties index bcb3d9f81..3631210da 100644 --- a/src/main/resources/fess_config.properties +++ b/src/main/resources/fess_config.properties @@ -412,3 +412,7 @@ ldap.role.search.role.enabled=true ldap.role.search.user.prefix=1 ldap.role.search.group.prefix=2 ldap.role.search.role.prefix=R + +ldap.attr.surname=sn +ldap.attr.givenName=givenName + diff --git a/src/main/resources/fess_indices/.fess_user/user.json b/src/main/resources/fess_indices/.fess_user/user.json index 53be8e94c..3c593e9cd 100644 --- a/src/main/resources/fess_indices/.fess_user/user.json +++ b/src/main/resources/fess_indices/.fess_user/user.json @@ -15,6 +15,14 @@ "type": "string", "index": "not_analyzed" }, + "surname": { + "type": "string", + "index": "not_analyzed" + }, + "givenName": { + "type": "string", + "index": "not_analyzed" + }, "groups": { "type": "string", "index": "not_analyzed" diff --git a/src/main/resources/fess_label.properties b/src/main/resources/fess_label.properties index 3e4474fff..05ff77ee1 100644 --- a/src/main/resources/fess_label.properties +++ b/src/main/resources/fess_label.properties @@ -680,3 +680,7 @@ labels.send_testmail=Send TestMail labels.backup_configuration=Back Up labels.backup_name=Name labels.process_time_is_exceeded=The limit of a search time was exceeded. The partial result might be displayed. +labels.user_given_name=First Name +labels.givenName=First Name +labels.user_surname=Last Name +labels.surame=Last Name diff --git a/src/main/resources/fess_label_en.properties b/src/main/resources/fess_label_en.properties index 3e4474fff..05ff77ee1 100644 --- a/src/main/resources/fess_label_en.properties +++ b/src/main/resources/fess_label_en.properties @@ -680,3 +680,7 @@ labels.send_testmail=Send TestMail labels.backup_configuration=Back Up labels.backup_name=Name labels.process_time_is_exceeded=The limit of a search time was exceeded. The partial result might be displayed. +labels.user_given_name=First Name +labels.givenName=First Name +labels.user_surname=Last Name +labels.surame=Last Name diff --git a/src/main/resources/fess_label_ja.properties b/src/main/resources/fess_label_ja.properties index 509e4b69f..4d082450b 100644 --- a/src/main/resources/fess_label_ja.properties +++ b/src/main/resources/fess_label_ja.properties @@ -680,3 +680,7 @@ labels.send_testmail=\u30c6\u30b9\u30c8\u30e1\u30fc\u30eb\u306e\u9001\u4fe1 labels.backup_configuration=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7 labels.backup_name=\u540d\u524d labels.process_time_is_exceeded=\u691c\u7d22\u5f85\u3061\u6642\u9593\u306e\u4e0a\u9650\u3092\u8d85\u3048\u307e\u3057\u305f\u3002\u8868\u793a\u3055\u308c\u305f\u7d50\u679c\u306f\u691c\u7d22\u7d50\u679c\u306e\u4e00\u90e8\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 +labels.user_given_name=\u540d\u524d(\u540d) +labels.givenName=\u540d\u524d(\u540d) +labels.user_surname=\u540d\u524d(\u59d3) +labels.surame=\u540d\u524d(\u59d3) diff --git a/src/main/webapp/WEB-INF/view/admin/user/admin_user_details.jsp b/src/main/webapp/WEB-INF/view/admin/user/admin_user_details.jsp index 67c3732ba..499f8a02a 100644 --- a/src/main/webapp/WEB-INF/view/admin/user/admin_user_details.jsp +++ b/src/main/webapp/WEB-INF/view/admin/user/admin_user_details.jsp @@ -50,6 +50,14 @@ ${f:h(name)} + + + ${f:h(surname)} + + + + ${f:h(givenName)} + +
+ +
+ + +
+
+
+ +
+ + +
+