Browse Source

提交开源任务材料

10.0
LAPTOP-SB56SG4Q\86185 3 years ago
parent
commit
a8a4b9c86a
  1. BIN
      JSD-8070-需求确认书V1.docx
  2. 5
      README.md
  3. BIN
      lib/finekit-10.0.jar
  4. BIN
      lib/jldap-4.3-javadoc.jar
  5. BIN
      lib/jldap-4.3-sources.jar
  6. BIN
      lib/jldap-4.3.jar
  7. 18
      plugin.xml
  8. 130
      src/main/java/com/fr/plugin/third/party/jsdiaha/config/CustomDataConfig.java
  9. 24
      src/main/java/com/fr/plugin/third/party/jsdiaha/config/DataConfigInitializeMonitor.java
  10. 134
      src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpDataModel.java
  11. 18
      src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpTableData.java
  12. 50
      src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpTableDataDefine.java
  13. 76
      src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpTableDataPane.java
  14. 67
      src/main/java/com/fr/plugin/third/party/jsdiaha/data/DatasetData.java
  15. 95
      src/main/java/com/fr/plugin/third/party/jsdiaha/ldap/LdapInfo.java
  16. 207
      src/main/java/com/fr/plugin/third/party/jsdiaha/ldap/LdapObject.java

BIN
JSD-8070-需求确认书V1.docx

Binary file not shown.

5
README.md

@ -1,3 +1,6 @@
# open-JSD-8070
JSD-8070 LDAP用户同步
JSD-8070 LDAP用户同步\
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
仅作为开发者学习参考使用!禁止用于任何商业用途!\
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。

BIN
lib/finekit-10.0.jar

Binary file not shown.

BIN
lib/jldap-4.3-javadoc.jar

Binary file not shown.

BIN
lib/jldap-4.3-sources.jar

Binary file not shown.

BIN
lib/jldap-4.3.jar

Binary file not shown.

18
plugin.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<plugin>
<id>com.fr.plugin.third.party.jsd8070</id>
<name><![CDATA[LADP用户同步]]></name>
<active>yes</active>
<version>0.1</version>
<env-version>10.0</env-version>
<jartime>2019-01-01</jartime>
<vendor>fr.open</vendor>
<description><![CDATA[]]></description>
<change-notes><![CDATA[]]></change-notes>
<extra-designer>
<ServerTableDataDefineProvider class="com.fr.plugin.third.party.jsdiaha.data.CustomHttpTableDataDefine"/>
<TableDataDefineProvider class="com.fr.plugin.third.party.jsdiaha.data.CustomHttpTableDataDefine"/>
</extra-designer>
<function-recorder class="com.fr.plugin.third.party.jsdiaha.config.DataConfigInitializeMonitor"/>
<lifecycle-monitor class="com.fr.plugin.third.party.jsdiaha.config.DataConfigInitializeMonitor"/>
</plugin>

130
src/main/java/com/fr/plugin/third/party/jsdiaha/config/CustomDataConfig.java

@ -0,0 +1,130 @@
package com.fr.plugin.third.party.jsdiaha.config;
import com.fr.config.*;
import com.fr.config.holder.Conf;
import com.fr.config.holder.factory.Holders;
/**
* 配置数据保存
*/
@Visualization(category = "LADP用户同步配置")
public class CustomDataConfig extends DefaultConfiguration {
private static volatile CustomDataConfig config = null;
public String getNameSpace() {
return this.getClass().getName();
}
public static CustomDataConfig getInstance() {
if (config == null) {
config = ConfigContext.getConfigInstance(CustomDataConfig.class);
}
return config;
}
@Identifier(value = "hostname", name = "主机地址", description = "", status = Status.SHOW)
private Conf<String> hostname = Holders.simple("");
@Identifier(value = "port", name = "主机端口号", description = "", status = Status.SHOW)
private Conf<Integer> port = Holders.simple(389);
@Identifier(value = "userDN", name = "用户DN", description = "", status = Status.SHOW)
private Conf<String> userDN = Holders.simple("");
@Identifier(value = "password", name = "密码", description = "", status = Status.SHOW)
private Conf<String> password = Holders.simple("");
@Identifier(value = "baseDN", name = "基准DN", description = "", status = Status.SHOW)
private Conf<String> baseDN = Holders.simple("");
@Identifier(value = "userIdColumn", name = "用户字段名", description = "", status = Status.SHOW)
private Conf<String> userIdColumn = Holders.simple("sAMAccountName");
@Identifier(value = "usernameColumn", name = "用户姓名字段名", description = "", status = Status.SHOW)
private Conf<String> usernameColumn = Holders.simple("displayName");
@Identifier(value = "emailColumn", name = "邮箱字段名", description = "", status = Status.SHOW)
private Conf<String> emailColumn = Holders.simple("email");
public String getHostname() {
return hostname.get();
}
public void setHostname(String hostname) {
this.hostname.set(hostname);
}
public Integer getPort() {
return port.get();
}
public void setPort(Integer port) {
this.port.set(port);
}
public String getUserDN() {
return userDN.get();
}
public void setUserDN(String userDN) {
this.userDN.set(userDN);
}
public String getPassword() {
return password.get();
}
public void setPassword(String password) {
this.password.set(password);
}
public String getBaseDN() {
return baseDN.get();
}
public void setBaseDN(String baseDN) {
this.baseDN.set(baseDN);
}
public String getUserIdColumn() {
return userIdColumn.get();
}
public void setUserIdColumn(String userIdColumn) {
this.userIdColumn.set(userIdColumn);
}
public String getUsernameColumn() {
return usernameColumn.get();
}
public void setUsernameColumn(String usernameColumn) {
this.usernameColumn.set(usernameColumn);
}
public String getEmailColumn() {
return emailColumn.get();
}
public void setEmailColumn(String emailColumn) {
this.emailColumn.set(emailColumn);
}
@Override
public Object clone() throws CloneNotSupportedException {
CustomDataConfig cloned = (CustomDataConfig) super.clone();
cloned.hostname = (Conf<String>) hostname.clone();
cloned.port = (Conf<Integer>) port.clone();
cloned.userDN = (Conf<String>) userDN.clone();
cloned.password = (Conf<String>) password.clone();
cloned.baseDN = (Conf<String>) baseDN.clone();
cloned.userIdColumn = (Conf<String>) userIdColumn.clone();
cloned.usernameColumn = (Conf<String>) usernameColumn.clone();
cloned.emailColumn = (Conf<String>) emailColumn.clone();
return cloned;
}
}

24
src/main/java/com/fr/plugin/third/party/jsdiaha/config/DataConfigInitializeMonitor.java

@ -0,0 +1,24 @@
package com.fr.plugin.third.party.jsdiaha.config;
import com.fr.intelli.record.Focus;
import com.fr.intelli.record.Original;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
import com.fr.record.analyzer.EnableMetrics;
/**
* 配置信息初始化
*/
@EnableMetrics
public class DataConfigInitializeMonitor extends AbstractPluginLifecycleMonitor {
@Override
@Focus(id = "com.fr.plugin.third.party.jsd8070", text = "plugin-jsd-8070", source = Original.PLUGIN)
public void afterRun(PluginContext pluginContext) {
CustomDataConfig.getInstance();
}
@Override
public void beforeStop(PluginContext pluginContext) {
}
}

134
src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpDataModel.java

@ -0,0 +1,134 @@
package com.fr.plugin.third.party.jsdiaha.data;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.util.StringKit;
import com.fr.base.TableData;
import com.fr.data.AbstractDataModel;
import com.fr.general.data.TableDataException;
import com.fr.plugin.third.party.jsdiaha.ldap.LdapInfo;
import com.fr.plugin.third.party.jsdiaha.ldap.LdapObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class CustomHttpDataModel extends AbstractDataModel {
private static String[] COLUMN_NAMES = {"user_id", "username", "password", "mail"};
private int rowCount = TableData.RESULT_ALL;
private DatasetData datas = new DatasetData();
public CustomHttpDataModel(int count) {
this.rowCount = count;
if (this.rowCount == 0) {
return;
}
queryData();
}
@Override
public int getColumnCount() throws TableDataException {
return COLUMN_NAMES.length;
}
@Override
public String getColumnName(int i) throws TableDataException {
return COLUMN_NAMES[i];
}
@Override
public boolean hasRow(int rowIndex) throws TableDataException {
int count = getRowCount();
return rowIndex < count;
}
@Override
public int getRowCount() throws TableDataException {
if (this.datas == null) {
return 0;
}
List<List<Object>> values = this.datas.getValues();
if (values == null) {
return 0;
}
int count = values.size();
return count;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) throws TableDataException {
if (this.datas == null) {
return "";
}
List<List<Object>> values = this.datas.getValues();
if ((values == null) || (values.size() <= rowIndex)) {
return "";
}
List<Object> rowValues = values.get(rowIndex);
if ((rowValues == null) || (rowValues.size() <= columnIndex)) {
return "";
}
return rowValues.get(columnIndex);
}
@Override
public void release() throws Exception {
this.datas = null;
}
/**
* 查询数据
*/
private void queryData() {
try {
createDatas();
} catch (Exception e) {
LogKit.error("LDAP数据集获取用户信息,请求出错," + e.getMessage(), e);
throw new NullPointerException("LDAP数据集获取用户信息为空");
}
}
private void createDatas() throws Exception {
String deptName = "", jobTitle = "", userId = "", userName = "", password = "", code = "", fCode = "", mobile = "", mail = "";
LdapInfo ldapInfo = new LdapInfo();
ldapInfo.queryData();
List<LdapObject> ldapObjects = ldapInfo.getLdapObjects();
Map<String, LdapObject> orgMap = ldapInfo.getOrgMap();
LdapObject tempLdapObject, tempLdapObject1, tempLdapObject2;
for (int i = 0, max = ldapObjects.size() - 1; i <= max; i++) {
deptName = "";
jobTitle = "";
userId = "";
userName = "";
password = "111111";
mobile = "";
mail = "";
code = "";
fCode = "";
tempLdapObject = ldapObjects.get(i);
if (tempLdapObject.isPerson()) {
userId = tempLdapObject.getUserId();
userId = userId.trim();
if (StringKit.isEmpty(userId)) {
continue;
}
userName = tempLdapObject.getName();
mail = tempLdapObject.getMail();
addRowDatas(userId, userName, password, mail);
}
}
}
// {"dept_name", "job_title", "user_id", "username", "password", "mobile", "mail", "code", "fcode"};
private void addRowDatas(String userId, String userName, String password, String mail) {
List<Object> rowDatas = new ArrayList<>();
rowDatas.add(userId);
rowDatas.add(userName);
rowDatas.add(password);
rowDatas.add(mail);
List<List<Object>> values = this.datas.getValues();
values.add(rowDatas);
}
}

18
src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpTableData.java

@ -0,0 +1,18 @@
package com.fr.plugin.third.party.jsdiaha.data;
import com.fr.base.TableData;
import com.fr.data.AbstractParameterTableData;
import com.fr.general.data.DataModel;
import com.fr.script.Calculator;
public class CustomHttpTableData extends AbstractParameterTableData {
@Override
public DataModel createDataModel(Calculator calculator) {
return createDataModel(calculator, TableData.RESULT_ALL);
}
@Override
public DataModel createDataModel(Calculator calculator, int rowCount) {
return new CustomHttpDataModel(rowCount);
}
}

50
src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpTableDataDefine.java

@ -0,0 +1,50 @@
package com.fr.plugin.third.party.jsdiaha.data;
import com.fr.base.TableData;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.fun.ServerTableDataDefineProvider;
import com.fr.design.fun.impl.AbstractTableDataDefineProvider;
import com.fr.design.i18n.Toolkit;
public class CustomHttpTableDataDefine extends AbstractTableDataDefineProvider implements ServerTableDataDefineProvider {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public Class<? extends TableData> classForTableData() {
return CustomHttpTableData.class;
}
@Override
public Class<? extends TableData> classForInitTableData() {
return CustomHttpTableData.class;
}
@Override
public Class<? extends AbstractTableDataPane> appearanceForTableData() {
return CustomHttpTableDataPane.class;
}
@Override
public String nameForTableData() {
return Toolkit.i18nText("LDAP数据集");
}
@Override
public String prefixForTableData() {
return "ldap";
}
@Override
public String iconPathForTableData() {
return "";
}
}

76
src/main/java/com/fr/plugin/third/party/jsdiaha/data/CustomHttpTableDataPane.java

@ -0,0 +1,76 @@
package com.fr.plugin.third.party.jsdiaha.data;
import com.fanruan.api.design.DesignKit;
import com.fanruan.api.design.ui.component.UIButton;
import com.fr.design.data.datapane.preview.PreviewTablePane;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.general.IOUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CustomHttpTableDataPane extends AbstractTableDataPane<CustomHttpTableData> {
public CustomHttpTableDataPane() {
super();
createContent();
}
@Override
public void populateBean(CustomHttpTableData ob) {
if (ob == null) {
return;
}
}
@Override
public CustomHttpTableData updateBean() {
CustomHttpTableData tableData = new CustomHttpTableData();
return tableData;
}
@Override
protected String title4PopupWindow() {
return DesignKit.i18nText("LDAP数据集");
}
private void createContent() {
setLayout(new BorderLayout());
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
add(contentPane, BorderLayout.CENTER);
JPanel connectionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5));
UIButton previewButton = createIconButton("Fine-Design_Basic_Preview", "/com/fr/design/images/m_file/preview.png");
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PreviewTablePane.previewTableData(updateBean());
}
});
connectionPanel.add(previewButton);
contentPane.add(connectionPanel, BorderLayout.NORTH);
}
/**
* 获取图标按钮
*
* @param toolTip 提示信息,国际化key
* @param iconPath 图标路径
* @return
*/
public static UIButton createIconButton(String toolTip, String iconPath) {
UIButton iconButton = new UIButton(IOUtils.readIcon(iconPath));
iconButton.setToolTipText(DesignKit.i18nText(toolTip));
return iconButton;
}
}

67
src/main/java/com/fr/plugin/third/party/jsdiaha/data/DatasetData.java

@ -0,0 +1,67 @@
package com.fr.plugin.third.party.jsdiaha.data;
import java.util.ArrayList;
import java.util.List;
/**
* 数据集数据
*/
public class DatasetData {
private String name;
private List<String> columns;
private List<List<Object>> values;
public DatasetData() {
columns = new ArrayList<String>();
values = new ArrayList<List<Object>>();
}
/**
* 获取表名
* @return 表名
*/
public String getName() {
return this.name;
}
/**
* 设置表名
* @param name 表名
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取列名
* @return 列名
*/
public List<String> getColumns() {
return this.columns;
}
/**
* 设置列名
* @param columns 列名
*/
public void setColumns(List<String> columns) {
this.columns = columns;
}
/**
* 获取表数据
* @return 表数据
*/
public List<List<Object>> getValues() {
return this.values;
}
/**
* 设置表数据
* @param values
*/
public void setValues(List<List<Object>> values) {
this.values = values;
}
}

95
src/main/java/com/fr/plugin/third/party/jsdiaha/ldap/LdapInfo.java

@ -0,0 +1,95 @@
package com.fr.plugin.third.party.jsdiaha.ldap;
import com.fr.plugin.third.party.jsdiaha.config.CustomDataConfig;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPSearchConstraints;
import com.novell.ldap.LDAPSearchResults;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LdapInfo {
private String hostName = "localhost";
private int port = 389;
private String userDN = "cn=Manager,dc=micmiu,dc=com";
private String password = "secret";
private String baseDN = "dc=micmiu,dc=com";
private String searchFilter = "objectClass=*";
private List<LdapObject> ldapObjects = new ArrayList<>();
private Map<String, LdapObject> orgMap = new HashMap<>();
public void queryData() throws Exception {
this.hostName = CustomDataConfig.getInstance().getHostname();
this.port = CustomDataConfig.getInstance().getPort();
this.userDN = CustomDataConfig.getInstance().getUserDN();
this.password = CustomDataConfig.getInstance().getPassword();
this.baseDN = CustomDataConfig.getInstance().getBaseDN();
// 查询范围
// SCOPE_BASE、SCOPE_ONE、SCOPE_SUB、SCOPE_SUBORDINATESUBTREE
int searchScope = LDAPConnection.SCOPE_SUB;
//超时30秒
int timeout = 30000;
LDAPConnection lc = new LDAPConnection(timeout);
lc.connect(this.hostName, this.port);
lc.bind(LDAPConnection.LDAP_V3, this.userDN, this.password.getBytes("UTF8"));
LDAPSearchConstraints ldsc = new LDAPSearchConstraints();
ldsc.setMaxResults(100000);
lc.setConstraints(ldsc);
LDAPSearchResults searchResults = lc.search(baseDN,
searchScope, null, null, false);
LDAPEntry nextEntry = null;
LdapObject ldapObject;
while (searchResults.hasMore()) {
nextEntry = searchResults.next();
ldapObject = new LdapObject();
ldapObject.loadData(nextEntry);
if (!ldapObject.isValidOption()) {
continue;
}
ldapObjects.add(ldapObject);
if (ldapObject.isOrg()) {
orgMap.put(ldapObject.getDn(), ldapObject);
}
/*
LogKit.info("DN =: " + nextEntry.getDN());
LogKit.info("|---- Attributes list: ");
LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
Iterator<LDAPAttribute> allAttributes = attributeSet.iterator();
while (allAttributes.hasNext()) {
LDAPAttribute attribute = allAttributes.next();
String attributeName = attribute.getName();
Enumeration<String> allValues = attribute.getStringValues();
if (null == allValues) {
continue;
}
while (allValues.hasMoreElements()) {
String value = allValues.nextElement();
//if (!Base64.isLDIFSafe(value)) {
// base64 encode and then print out
// value = Base64.encode(value.getBytes());
//}
LogKit.info("|---- ---- " + attributeName + " = " + value);
}
}*/
}
}
public List<LdapObject> getLdapObjects() {
return ldapObjects;
}
public Map<String, LdapObject> getOrgMap() {
return orgMap;
}
}

207
src/main/java/com/fr/plugin/third/party/jsdiaha/ldap/LdapObject.java

@ -0,0 +1,207 @@
package com.fr.plugin.third.party.jsdiaha.ldap;
import com.fanruan.api.util.StringKit;
import com.fr.plugin.third.party.jsdiaha.config.CustomDataConfig;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.util.Base64;
public class LdapObject {
public static String LDAP_OBJECT_TYPE_ORG = "ORG";
public static String LDAP_OBJECT_TYPE_PERSON = "PERSON";
public static String LDAP_OBJECT_TYPE_NONE = "NONE";
private LDAPEntry ldapEntry;
private String dn = "";
private String type = "";
private String objectGUID = "";
private String name = "";
private String userId;
private String jobTitle;
private String mobile;
private String mail;
private String parentDn = "";
private boolean validOption = false;
public void loadData(LDAPEntry entry) {
setValidOption(false);
if (entry == null) {
return;
}
this.ldapEntry = entry;
setDn(this.ldapEntry.getDN());
setType(createType());
if (LDAP_OBJECT_TYPE_NONE.equals(this.type)) {
return;
}
//String tempValue = getAttribute("objectGUID");
//setObjectGUID(Base64.encode(tempValue.getBytes()));
//tempValue = getAttribute("name");
//setName(tempValue);
//setParentDn(createParentDn());
//用户名(登录的username)
//用户姓名(realname)
//角色(对应域的usergroup)
//邮箱
String tempValue;
if (isPerson()) {
tempValue = getAttribute(CustomDataConfig.getInstance().getUserIdColumn());
setUserId(tempValue);
tempValue = getAttribute(CustomDataConfig.getInstance().getUsernameColumn());
setName(tempValue);
tempValue = getAttribute(CustomDataConfig.getInstance().getEmailColumn());
setMail(tempValue);
}
setValidOption(true);
}
private String getAttribute(String attrName) {
if ((this.ldapEntry == null) || (StringKit.isEmpty(attrName))) {
return "";
}
LDAPAttribute ldapAttribute = this.ldapEntry.getAttribute(attrName);
if (ldapAttribute == null) {
return "";
}
String[] values = ldapAttribute.getStringValueArray();
if ((values == null) || (values.length <= 0)) {
return "";
}
String value = values[0];
return value;
}
private String createParentDn() {
if (StringKit.isEmpty(this.dn)) {
return "";
}
int index = this.dn.indexOf(",");
if (index < 0) {
return "";
}
String tempValue = this.dn.substring(index + 1);
return tempValue;
}
private String createType() {
if (StringKit.isEmpty(this.dn)) {
return LDAP_OBJECT_TYPE_NONE;
}
if (this.dn.startsWith("CN=")) {
return LDAP_OBJECT_TYPE_PERSON;
}
if (this.dn.startsWith("OU=")) {
return LDAP_OBJECT_TYPE_ORG;
}
return LDAP_OBJECT_TYPE_NONE;
}
public boolean isOrg() {
if (LDAP_OBJECT_TYPE_ORG.equals(this.type)) {
return true;
}
return false;
}
public boolean isPerson() {
if (LDAP_OBJECT_TYPE_PERSON.equals(this.type)) {
return true;
}
return false;
}
public String getDn() {
return dn;
}
public void setDn(String dn) {
this.dn = dn;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isValidOption() {
return validOption;
}
public void setValidOption(boolean option) {
this.validOption = option;
}
public String getObjectGUID() {
return objectGUID;
}
public void setObjectGUID(String guid) {
this.objectGUID = guid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserId() {
return userId;
}
public void setUserId(String id) {
//if (StringKit.isNotEmpty(id)) {
// id = id.toUpperCase();
//}
this.userId = id;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getParentDn() {
return parentDn;
}
public void setParentDn(String dn) {
this.parentDn = dn;
}
}
Loading…
Cancel
Save