From 04f1cc0b5351b6d39dc43cd574d92359573c9ea2 Mon Sep 17 00:00:00 2001
From: Chris Ridd <chris.ridd@forgerock.com>
Date: Tue, 06 Aug 2013 15:39:09 +0000
Subject: [PATCH] CR-2124 Fix OPENDJ-1016 Control panel does not follow static group recommendation from documentation
---
opends/src/guitools/org/opends/guitools/controlpanel/ui/NewGroupPanel.java | 21 ++++--
opends/src/messages/messages/admin_tool_es.properties | 3
opends/src/guitools/org/opends/guitools/controlpanel/ui/AddToGroupPanel.java | 6 +
opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java | 24 ++++---
opends/src/messages/messages/admin_tool_de.properties | 3
opends/src/messages/messages/admin_tool_fr.properties | 3
opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java | 35 +++++++----
opends/src/guitools/org/opends/guitools/controlpanel/ui/LDAPEntrySelectionPanel.java | 4 +
opends/src/messages/messages/admin_tool.properties | 1
opends/src/messages/messages/admin_tool_ja.properties | 3
opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java | 15 ++++
opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java | 3 +
opends/src/messages/messages/admin_tool_zh_CN.properties | 3
13 files changed, 84 insertions(+), 40 deletions(-)
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java b/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java
index bf3ae5a..9e7ba52 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/browser/IconPool.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.browser;
@@ -44,6 +45,7 @@
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.quicksetup.ui.UIFactory;
+import org.opends.server.util.ServerConstants;
/**
* This class is used as a cache containing the icons that are used by the
@@ -86,23 +88,32 @@
private static final String[] ICON_PATH = {
- "person", "ds-user.png",
- "organization", "ds-folder.png",
- "organizationalunit", "ds-ou.png",
- "groupofuniquenames", "ds-group.png",
- "groupofurls", "ds-group.png",
- "ds-virtual-static-group", "ds-group.png",
+ ServerConstants.OC_PERSON, "ds-user.png",
+ ServerConstants.OC_ORGANIZATION, "ds-folder.png",
+ ServerConstants.OC_ORGANIZATIONAL_UNIT_LC, "ds-ou.png",
+ ServerConstants.OC_GROUP_OF_NAMES_LC, "ds-group.png",
+ ServerConstants.OC_GROUP_OF_ENTRIES_LC, "ds-group.png",
+ ServerConstants.OC_GROUP_OF_UNIQUE_NAMES_LC, "ds-group.png",
+ ServerConstants.OC_GROUP_OF_URLS_LC, "ds-group.png",
+ ServerConstants.OC_VIRTUAL_STATIC_GROUP, "ds-group.png",
"passwordpolicy", "ds-ppol.png"
};
private static final String[] DESCRIPTION = {
- "person", INFO_PERSON_ICON_DESCRIPTION.get().toString(),
- "organization", INFO_ORGANIZATION_ICON_DESCRIPTION.get().toString(),
- "organizationalunit",
+ ServerConstants.OC_PERSON, INFO_PERSON_ICON_DESCRIPTION.get().toString(),
+ ServerConstants.OC_ORGANIZATION, INFO_ORGANIZATION_ICON_DESCRIPTION.get()
+ .toString(),
+ ServerConstants.OC_ORGANIZATIONAL_UNIT_LC,
INFO_ORGANIZATIONAL_UNIT_ICON_DESCRIPTION.get().toString(),
- "groupofuniquenames", INFO_STATIC_GROUP_ICON_DESCRIPTION.get().toString(),
- "groupofurls", INFO_DYNAMIC_GROUP_ICON_DESCRIPTION.get().toString(),
- "ds-virtual-static-group",
+ ServerConstants.OC_GROUP_OF_NAMES_LC, INFO_STATIC_GROUP_ICON_DESCRIPTION
+ .get().toString(),
+ ServerConstants.OC_GROUP_OF_ENTRIES_LC, INFO_STATIC_GROUP_ICON_DESCRIPTION
+ .get().toString(),
+ ServerConstants.OC_GROUP_OF_UNIQUE_NAMES_LC,
+ INFO_STATIC_GROUP_ICON_DESCRIPTION.get().toString(),
+ ServerConstants.OC_GROUP_OF_URLS_LC, INFO_DYNAMIC_GROUP_ICON_DESCRIPTION
+ .get().toString(),
+ ServerConstants.OC_VIRTUAL_STATIC_GROUP,
INFO_VIRTUAL_STATIC_GROUP_ICON_DESCRIPTION.get().toString(),
"passwordpolicy", INFO_PASSWORD_POLICY_ICON_DESCRIPTION.get().toString()
};
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java b/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
index 34afc81..3265d9c 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/task/AddToGroupTask.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.task;
@@ -251,6 +252,8 @@
ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
ctls.setReturningAttributes(
new String[] {
+ ServerConstants.OBJECTCLASS_ATTRIBUTE_TYPE_NAME,
+ ServerConstants.ATTR_MEMBER,
ServerConstants.ATTR_UNIQUE_MEMBER
});
String filter = BrowserController.ALL_OBJECTS_FILTER;
@@ -261,11 +264,19 @@
try
{
+ String memberAttr = ServerConstants.ATTR_MEMBER;
while (result.hasMore())
{
SearchResult sr = result.next();
+ Set<String> objectClasses =
+ ConnectionUtils.getValues(sr, ServerConstants
+ .OBJECTCLASS_ATTRIBUTE_TYPE_NAME);
+ if (objectClasses.contains(ServerConstants.OC_GROUP_OF_UNIQUE_NAMES))
+ {
+ memberAttr = ServerConstants.ATTR_UNIQUE_MEMBER;
+ }
Set<String> values =
- ConnectionUtils.getValues(sr, ServerConstants.ATTR_UNIQUE_MEMBER);
+ ConnectionUtils.getValues(sr, memberAttr);
Set<String> dnsToAdd = new LinkedHashSet<String>();
if (values != null)
{
@@ -296,7 +307,7 @@
if (dnsToAdd.size() > 0)
{
Attribute attribute =
- new BasicAttribute(ServerConstants.ATTR_UNIQUE_MEMBER);
+ new BasicAttribute(memberAttr);
for (String dn : dnsToAdd)
{
attribute.add(dn);
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/AddToGroupPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/AddToGroupPanel.java
index 38065f7..f5efaba 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/AddToGroupPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/AddToGroupPanel.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.ui;
@@ -63,6 +64,7 @@
import org.opends.messages.Message;
import org.opends.server.types.DN;
import org.opends.server.types.OpenDsException;
+import org.opends.server.util.ServerConstants;
/**
* The dialog that is displayed when we want to add entries to a set of groups.
@@ -388,7 +390,9 @@
errors.add(
ERR_CTRL_PANEL_GROUP_COULD_NOT_BE_FOUND.get(groupDn));
}
- else if (!hasObjectClass(groupDn, "groupOfUniqueNames"))
+ else if (!hasObjectClass(groupDn, ServerConstants.OC_GROUP_OF_NAMES,
+ ServerConstants.OC_GROUP_OF_ENTRIES,
+ ServerConstants.OC_GROUP_OF_UNIQUE_NAMES))
{
errors.add(ERR_CTRL_PANEL_NOT_A_STATIC_GROUP.get(groupDn));
}
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/LDAPEntrySelectionPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/LDAPEntrySelectionPanel.java
index 56d8c07..5567bb5 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/LDAPEntrySelectionPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/LDAPEntrySelectionPanel.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2009 Sun Microsystems, Inc.
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.ui;
@@ -251,7 +252,8 @@
break;
case STATIC_GROUPS:
filterAttribute.setSelectedItem(LDAP_FILTER);
- super.filter.setText("objectClass=groupOfUniqueNames");
+ super.filter.setText("(|(objectClass=groupOfNames)" +
+ "(objectClass=groupOfEntries)(objectClass=groupOfUniqueNames))");
break;
case DEFAULT:
Object o = filterAttribute.getItemAt(0);
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewGroupPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewGroupPanel.java
index 5d841d7..116e85f 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewGroupPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewGroupPanel.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.ui;
@@ -734,7 +735,7 @@
protected String getLDIF()
{
StringBuilder sb = new StringBuilder();
- sb.append("dn: "+dn.getText()+"\n");
+ sb.append("dn: ").append(dn.getText()).append("\n");
String[] attrNames = {"cn", "description"};
JTextField[] textFields = {name, description};
@@ -743,14 +744,14 @@
String value = textFields[i].getText().trim();
if (value.length() > 0)
{
- sb.append(attrNames[i]+": "+value+"\n");
+ sb.append(attrNames[i]).append(": ").append(value).append("\n");
}
}
sb.append("objectclass: top\n");
if (staticGroup.isSelected())
{
- sb.append("objectClass: "+ServerConstants.OC_GROUP_OF_UNIQUE_NAMES);
+ sb.append("objectClass: ").append(ServerConstants.OC_GROUP_OF_NAMES);
String[] members = staticMembers.getText().split("\n");
LinkedHashSet<DN> dns = new LinkedHashSet<DN>();
for (String member : members)
@@ -772,19 +773,23 @@
for (DN dn : dns)
{
- sb.append("\n"+ServerConstants.ATTR_UNIQUE_MEMBER+": "+dn.toString());
+ sb.append("\n").append(ServerConstants.ATTR_MEMBER)
+ .append(": ").append(dn);
}
}
else if (dynamicGroup.isSelected())
{
- sb.append("objectClass: "+ServerConstants.OC_GROUP_OF_URLS+"\n");
- sb.append(ServerConstants.ATTR_MEMBER_URL+": "+filter.getText().trim());
+ sb.append("objectClass: ").append(ServerConstants.OC_GROUP_OF_URLS)
+ .append("\n");
+ sb.append(ServerConstants.ATTR_MEMBER_URL).append(": ")
+ .append(filter.getText().trim());
}
else
{
sb.append("objectClass: ds-virtual-static-group\n");
- sb.append("objectClass: "+ServerConstants.OC_GROUP_OF_UNIQUE_NAMES+"\n");
- sb.append("ds-target-group-dn: "+referenceGroup.getText().trim());
+ sb.append("objectClass: ").append(ServerConstants.OC_GROUP_OF_NAMES)
+ .append("\n");
+ sb.append("ds-target-group-dn: ").append(referenceGroup.getText().trim());
}
return sb.toString();
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
index 33aad38..6264508 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/SimplifiedViewEntryPanel.java
@@ -23,6 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.ui;
@@ -190,6 +191,8 @@
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME.get());
hmFriendlyAttrNames.put(ServerConstants.ATTR_UNIQUE_MEMBER_LC,
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME.get());
+ hmFriendlyAttrNames.put(ServerConstants.ATTR_MEMBER,
+ INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME.get());
hmFriendlyAttrNames.put(ServerConstants.ATTR_MEMBER_URL_LC,
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME.get());
hmFriendlyAttrNames.put(ServerConstants.ATTR_C,
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
index 0481541..161864d 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/StatusGenericPanel.java
@@ -23,7 +23,7 @@
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
- * Portions Copyright 2013 ForgeRock AS
+ * Portions Copyright 2013 ForgeRock AS.
*/
package org.opends.guitools.controlpanel.ui;
@@ -2097,15 +2097,15 @@
}
/**
- * Tells whether a given entry exists and contains the specified object class.
+ * Tells whether a given entry exists and contains one of the specified object
+ * classes.
* @param dn the DN of the entry.
- * @param objectClass the object class.
- * @return <CODE>true</CODE> if the entry exists and contains the specified
- * object class and <CODE>false</CODE> otherwise.
+ * @param objectClasses the object classes to check.
+ * @return <CODE>true</CODE> if the entry exists and contains one of the
+ * specified object classes and <CODE>false</CODE> otherwise.
*/
- protected boolean hasObjectClass(String dn, String objectClass)
+ protected boolean hasObjectClass(String dn, String... objectClasses)
{
- boolean hasObjectClass = false;
try
{
SearchControls ctls = new SearchControls();
@@ -2130,10 +2130,12 @@
{
for (String s : values)
{
- if (s.equalsIgnoreCase(objectClass))
+ for (String objectClass: objectClasses)
{
- hasObjectClass = true;
- break;
+ if (s.equalsIgnoreCase(objectClass))
+ {
+ return true;
+ }
}
}
}
@@ -2147,7 +2149,7 @@
catch (Throwable t)
{
}
- return hasObjectClass;
+ return false;
}
/**
diff --git a/opends/src/messages/messages/admin_tool.properties b/opends/src/messages/messages/admin_tool.properties
index f453013..5b60c10 100644
--- a/opends/src/messages/messages/admin_tool.properties
+++ b/opends/src/messages/messages/admin_tool.properties
@@ -2445,6 +2445,7 @@
INFO_CTRL_PANEL_FACSIMILETELEPHONENUMBER_FRIENDLY_NAME=Fax Number
INFO_CTRL_PANEL_DESCRIPTION_FRIENDLY_NAME=Description
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME=Address
+INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME=Members of Group
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME=Members of Group
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME=LDAP URL
INFO_CTRL_PANEL_C_FRIENDLY_NAME=Country
diff --git a/opends/src/messages/messages/admin_tool_de.properties b/opends/src/messages/messages/admin_tool_de.properties
index 7bcdabe..89a27ba 100644
--- a/opends/src/messages/messages/admin_tool_de.properties
+++ b/opends/src/messages/messages/admin_tool_de.properties
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
# Copyright 2006-2010 Sun Microsystems, Inc.
-# Portions Copyright 2011-2012 ForgeRock AS
+# Portions Copyright 2011-2013 ForgeRock AS
@@ -1556,6 +1556,7 @@
INFO_CTRL_PANEL_FACSIMILETELEPHONENUMBER_FRIENDLY_NAME=Faxnummer
INFO_CTRL_PANEL_DESCRIPTION_FRIENDLY_NAME=Beschreibung
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME=Adresse
+INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME=Mitglieder der Gruppe
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME=Mitglieder der Gruppe
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME=LDAP-URL
INFO_CTRL_PANEL_C_FRIENDLY_NAME=Land
diff --git a/opends/src/messages/messages/admin_tool_es.properties b/opends/src/messages/messages/admin_tool_es.properties
index 41b89fb..0815c13 100644
--- a/opends/src/messages/messages/admin_tool_es.properties
+++ b/opends/src/messages/messages/admin_tool_es.properties
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
# Copyright 2006-2010 Sun Microsystems, Inc.
-# Portions Copyright 2011-2012 ForgeRock AS
+# Portions Copyright 2011-2013 ForgeRock AS
@@ -1557,6 +1557,7 @@
INFO_CTRL_PANEL_DESCRIPTION_FRIENDLY_NAME=Descripci\u00f3n
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME=Direcci\u00f3n
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME=Miembros del grupo
+INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME=Miembros del grupo
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME=URL LDAP
INFO_CTRL_PANEL_C_FRIENDLY_NAME=Pa\u00eds
INFO_CTRL_PANEL_DS_TARGET_GROUP_DN_FRIENDLY_NAME=ND de referencia de grupo din\u00e1mico
diff --git a/opends/src/messages/messages/admin_tool_fr.properties b/opends/src/messages/messages/admin_tool_fr.properties
index 3f04aac..ed260c9 100644
--- a/opends/src/messages/messages/admin_tool_fr.properties
+++ b/opends/src/messages/messages/admin_tool_fr.properties
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
# Copyright 2006-2010 Sun Microsystems, Inc.
-# Portions Copyright 2011-2012 ForgeRock AS
+# Portions Copyright 2011-2013 ForgeRock AS
@@ -1557,6 +1557,7 @@
INFO_CTRL_PANEL_DESCRIPTION_FRIENDLY_NAME=Description
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME=Adresse
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME=Membres du groupe
+INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME=Membres du groupe
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME=Url de LDAP
INFO_CTRL_PANEL_C_FRIENDLY_NAME=Pays
INFO_CTRL_PANEL_DS_TARGET_GROUP_DN_FRIENDLY_NAME=DN de r\u00e9f\u00e9rence de groupe dynamique
diff --git a/opends/src/messages/messages/admin_tool_ja.properties b/opends/src/messages/messages/admin_tool_ja.properties
index b56a03c..b9d811d 100644
--- a/opends/src/messages/messages/admin_tool_ja.properties
+++ b/opends/src/messages/messages/admin_tool_ja.properties
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
# Copyright 2006-2010 Sun Microsystems, Inc.
-# Portions Copyright 2011-2012 ForgeRock AS
+# Portions Copyright 2011-2013 ForgeRock AS
@@ -1554,6 +1554,7 @@
INFO_CTRL_PANEL_DESCRIPTION_FRIENDLY_NAME=\u8aac\u660e
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME=\u4f4f\u6240
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME=\u30b0\u30eb\u30fc\u30d7\u306e\u30e1\u30f3\u30d0\u30fc
+INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME=\u30b0\u30eb\u30fc\u30d7\u306e\u30e1\u30f3\u30d0\u30fc
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME=LDAP URL
INFO_CTRL_PANEL_C_FRIENDLY_NAME=\u56fd\u540d
INFO_CTRL_PANEL_DS_TARGET_GROUP_DN_FRIENDLY_NAME=\u30c0\u30a4\u30ca\u30df\u30c3\u30af\u30b0\u30eb\u30fc\u30d7\u53c2\u7167 DN
diff --git a/opends/src/messages/messages/admin_tool_zh_CN.properties b/opends/src/messages/messages/admin_tool_zh_CN.properties
index 67fad9f..1ce60a5 100644
--- a/opends/src/messages/messages/admin_tool_zh_CN.properties
+++ b/opends/src/messages/messages/admin_tool_zh_CN.properties
@@ -21,7 +21,7 @@
# CDDL HEADER END
#
# Copyright 2006-2010 Sun Microsystems, Inc.
-# Portions Copyright 2011-2012 ForgeRock AS
+# Portions Copyright 2011-2013 ForgeRock AS
@@ -1557,6 +1557,7 @@
INFO_CTRL_PANEL_DESCRIPTION_FRIENDLY_NAME=\u63cf\u8ff0
INFO_CTRL_PANEL_POSTALADDRESS_FRIENDLY_NAME=\u5730\u5740
INFO_CTRL_PANEL_UNIQUEMEMBER_FRIENDLY_NAME=\u7ec4\u6210\u5458
+INFO_CTRL_PANEL_MEMBER_FRIENDLY_NAME=\u7ec4\u6210\u5458
INFO_CTRL_PANEL_MEMBERURL_FRIENDLY_NAME=LDAP URL
INFO_CTRL_PANEL_C_FRIENDLY_NAME=\u56fd\u5bb6/\u5730\u533a
INFO_CTRL_PANEL_DS_TARGET_GROUP_DN_FRIENDLY_NAME=\u52a8\u6001\u7ec4\u5f15\u7528 DN
--
Gitblit v1.10.0