Skip to content
Snippets Groups Projects
Commit e3087838 authored by Goik Martin's avatar Goik Martin
Browse files

Transferring RDBMS user and group data to LDAP

parent 7773b95a
No related branches found
No related tags found
No related merge requests found
Showing
with 345 additions and 0 deletions
/target/
/.settings/
.classpath
.project
version: 1
dn: ou=groups,dc=hdm-stuttgart,dc=de
objectClass: top
objectClass: organizationalUnit
ou: groups
dn: ou=users,dc=hdm-stuttgart,dc=de
objectClass: top
objectClass: organizationalUnit
ou: users
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.hdm-stuttgart.mi.sda2</groupId>
<artifactId>rdbms2ldap</artifactId>
<version>0.9</version>
<packaging>jar</packaging>
<name>rdbms2ldap</name>
<!--Fixme: Add a sensible project related domain here -->
<url>http://somedomain.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.33</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
package de.hdm_stuttgart.mi.sda2.rdbms2ldap;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class Config {
private static final String BUNDLE_NAME = "de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap"; //$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
.getBundle(BUNDLE_NAME);
private Config() {
}
public static String get(String key) {
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
}
package de.hdm_stuttgart.mi.sda2.rdbms2ldap;
import java.sql.SQLException;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
import de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap.LdapHandler;
import de.hdm_stuttgart.mi.sda2.rdbms2ldap.rdbms.RdbmsHandler;
/**
* Transfer user/group data from RDBMS to LDAP
*
*/
public class Driver {
private static Logger log = Logger.getLogger(Driver.class);
public static void main( String[] args ) {
final RdbmsHandler rdbmsHandler = new RdbmsHandler();
try {
rdbmsHandler.connect();
} catch (SQLException e1) {
log.fatal("Unable to connect to database server");
}
final LdapHandler ldapHandler = new LdapHandler();
try {
ldapHandler.connect();
} catch (NamingException e) {
log.error("Unable to connect to lDAP server:" + e.getMessage());
}
rdbmsHandler.transferUsers(ldapHandler);
rdbmsHandler.transferGroups(ldapHandler);
}
}
package de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import org.apache.log4j.Logger;
import de.hdm_stuttgart.mi.sda2.rdbms2ldap.Config;
public class LdapHandler {
private static Logger log = Logger.getLogger(LdapHandler.class);
InitialDirContext rootContext;
DirContext groupsContext, usersContext;
public void connect() throws NamingException {
Hashtable <String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, Config.get("LdapHandler.ldapCtxFactory"));
env.put(Context.PROVIDER_URL, Config.get("LdapHandler.ldapBaseDN"));
env.put(Context.SECURITY_PRINCIPAL, Config.get("LdapHandler.ldapBindDn"));
env.put(Context.SECURITY_CREDENTIALS, Config.get("LdapHandler.ldapBindPw"));
rootContext = new InitialDirContext (env);
groupsContext = (DirContext) lookupContext(rootContext, Config.get("LdapHandler.groupsRDN"), DirContext.class);
usersContext = (DirContext) lookupContext(rootContext, Config.get("LdapHandler.usersRDN"), DirContext.class);
}
public void insertGroup(final String gid, final int gidNumber) {
final Attributes groupAttrs = new BasicAttributes();
groupAttrs.put(new BasicAttribute ("objectclass", "top"));
groupAttrs.put(new BasicAttribute("objectclass", "posixGroup"));
groupAttrs.put(new BasicAttribute("cn", gid));
groupAttrs.put(new BasicAttribute("gidNumber", "" + gidNumber));
final String groupRdn = "gidNumber=" + gidNumber;
try {
groupsContext.bind(groupRdn, null, groupAttrs);
} catch (NamingException e) {
log.fatal("Unable to bind context '" + groupRdn + "' :" + e.getMessage());
System.exit(1);
}
}
public void insertUser(final String uid, final int uidNumber, final int primaryGidNumber, final String cname, final String homeDirectory, final String shell) {
final Attributes userAttrs = new BasicAttributes();
final BasicAttribute objectClass = new BasicAttribute("objectClass", "account");
objectClass.add("posixAccount");
objectClass.add("top");
userAttrs.put(objectClass);
userAttrs.put(new BasicAttribute("uid", uid));
userAttrs.put(new BasicAttribute("uidNumber", "" + uidNumber));
userAttrs.put(new BasicAttribute("gidNumber", "" + primaryGidNumber));
userAttrs.put(new BasicAttribute("cn", cname));
userAttrs.put(new BasicAttribute("homeDirectory", homeDirectory));
userAttrs.put(new BasicAttribute("loginShell", shell));
final String userRdn = "uid=" + uid;
try {
usersContext.bind(userRdn, null, userAttrs);
} catch (NamingException e) {
log.fatal("Unable to bind context '" + userRdn + "' :" + e.getMessage());
System.exit(1);
}
}
@SuppressWarnings("unchecked")
private static final <T extends Object> T lookupContext(final DirContext parent, final String rdn, Class<T> type) {
try {
final Object o = parent.lookup(rdn);
if (null == o) {
log.fatal("Context '" + rdn + "' does not exist");
} else if(type.isAssignableFrom(o.getClass())) {
return (T)o;
} else {
log.fatal("Context '" + rdn + "' is no subtype of '" + type + "'");
}
} catch (NamingException ne) {
log.fatal("Unable to retrieve context '" + rdn + "'");
System.exit(1);
}
return null;
}
}
package de.hdm_stuttgart.mi.sda2.rdbms2ldap.rdbms;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
import de.hdm_stuttgart.mi.sda2.rdbms2ldap.Config;
import de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap.LdapHandler;
public class RdbmsHandler {
private static Logger log = Logger
.getLogger(RdbmsHandler.class);
static {
try {
Class.forName(Config.get("RdbmsHandler.driverClassName"));
} catch (ClassNotFoundException e) {
System.err.println("Unable to register JDBC driver '"
+ Config.get("RdbmsHandler.jdbcUrl") + "'");
System.exit(1);
}
}
Connection conn = null;
public void connect() throws SQLException {
if (null != conn) {
conn.rollback();
conn.close();
}
conn = DriverManager.getConnection(Config.get("RdbmsHandler.jdbcUrl"),
Config.get("RdbmsHandler.user"), Config.get("RdbmsHandler.password"));
conn.setAutoCommit(true);
}
public void transferGroups(LdapHandler ldapHandler) {
try {
Statement stmt = conn.createStatement();
final ResultSet groups = stmt.executeQuery("SELECT * FROM SysGroup");
while (groups.next()) {
ldapHandler.insertGroup(groups.getString("gid"),
groups.getInt("gidNumber"));
}
} catch (SQLException e) {
log.fatal("Unable to insert groups: " + e.getMessage());
}
}
public void transferUsers(LdapHandler ldapHandler) {
try {
Statement stmt = conn.createStatement();
final ResultSet users = stmt.executeQuery("SELECT * FROM SysUser");
while (users.next()) {
ldapHandler.insertUser(
users.getString("uid")
,users.getInt("uidNumber")
,users.getInt("primaryGidNumber")
,users.getString("cname")
,users.getString("homeDirectory")
,users.getString("shell")
);
}
} catch (SQLException e) {
log.fatal("Unable to insert userss: " + e.getMessage());
}
}
}
# LDAP
LdapHandler.ldapCtxFactory=com.sun.jndi.ldap.LdapCtxFactory
LdapHandler.ldapBaseDN=ldap://localhost:389/dc=hdm-stuttgart,dc=de
LdapHandler.ldapBindDn=cn=admin,dc=hdm-stuttgart,dc=de
LdapHandler.ldapBindPw=XYZ
LdapHandler.groupsRDN=ou=groups
LdapHandler.usersRDN=ou=users
# RDBMS
RdbmsHandler.driverClassName=com.mysql.jdbc.Driver
RdbmsHandler.jdbcUrl=jdbc:mysql://localhost:3306/hdm
RdbmsHandler.password=XYZ
RdbmsHandler.user=hdmuser
#Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout comforting Eclipse's debugger.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%p: %m at %c.%M(%C{1}.java:%L)%n
# Activate per-class or package logging rules if required. For example
# reducing logging to INFO level for class de.hdm-stuttgart.mi.sda2.rdbms2ldap.App
# can be achieved by un-commenting the following line:
#log4j.logger.de.hdm-stuttgart.mi.sda2.rdbms2ldap.App.parse.Group=INFO
package de.hdm_stuttgart.mi.sda2.rdbms2ldap;
import org.junit.Assert;
import org.junit.Test;
/**
* Unit test for simple App.
*/
public class AppTest {
@Test
public void testApp() {
Assert.assertTrue( true );
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment