You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@submarine.apache.org by li...@apache.org on 2020/05/13 04:49:32 UTC

[submarine] branch master updated: SUBMARINE-490. Synchronize user information from LDAP

This is an automated email from the ASF dual-hosted git repository.

liuxun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git


The following commit(s) were added to refs/heads/master by this push:
     new febe149  SUBMARINE-490. Synchronize user information from LDAP
febe149 is described below

commit febe149fd797ea68878a1e8511627a4a487e5755
Author: Eroschang <sa...@gmail.com>
AuthorDate: Wed May 13 02:15:35 2020 +0800

    SUBMARINE-490. Synchronize user information from LDAP
    
    ### What is this PR for?
    Test to synchronize user information from LDAP server.
    
    ### What type of PR is it?
    Feature
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * Open an issue on Jira https://issues.apache.org/jira/browse/SUBMARINE/
    * Put link here, and add [SUBMARINE-*Jira number*] in PR title, eg. [SUBMARINE-23]
    https://issues.apache.org/jira/projects/SUBMARINE/issues/SUBMARINE-490?filter=allopenissues&orderby=priority+ASC%2C+updated+DESC
    
    ### How should this be tested?
    * First time? Setup Travis CI as described on https://submarine.apache.org/contribution/contributions.html#continuous-integration
    * Strongly recommended: add automated unit tests for any new or changed behavior
    * Outline any manual steps to test the PR here.
    
    ### Screenshots (if appropriate)
    Edit the example.ldif file to add user in LDAP server.
    ![image](https://user-images.githubusercontent.com/43379142/81664370-fd4b3080-9471-11ea-9998-ab07b127831a.png)
    
    Use testList() to test and get the user name which in LDAP server.
    ![image](https://user-images.githubusercontent.com/43379142/81664430-0a681f80-9472-11ea-8412-03b92789516a.png)
    
    The user name in LDAP server.
    ![image](https://user-images.githubusercontent.com/43379142/81664518-1e138600-9472-11ea-88c5-e2d0ed03584a.png)
    
    ### Questions:
    * Does the licenses files need update? No
    * Is there breaking changes for older versions? No
    * Does this needs documentation? No
    
    Author: Eroschang <sa...@gmail.com>
    
    Closes #286 from Eroschang/submarine-ldaptest and squashes the following commits:
    
    5d59787 [Eroschang] Add Logger to output log.
    e5dac0c [Eroschang] Add embedded-ldap-junit.version number.
    340446a [Eroschang] Make the version number to be variable.
    d88b142 [Eroschang] Fix checkstyle.
    c6ff2ed [Eroschang] Fix checkstyle.
    2236cc7 [Eroschang] Change the package name and add apache license head.
    0860bd6 [Eroschang] Add apache license head.
    ccdd846 [Eroschang] Add LDAP user test.
---
 pom.xml                                            |   2 +
 submarine-commons/commons-unixusersync/pom.xml     |  96 ++++++++++++++
 .../commons/unixusersync/EmbeddedLdapRuleTest.java | 142 +++++++++++++++++++++
 .../src/test/resources/example.ldif                |  70 ++++++++++
 submarine-commons/pom.xml                          |   1 +
 5 files changed, 311 insertions(+)

diff --git a/pom.xml b/pom.xml
index de427a3..d16b378 100644
--- a/pom.xml
+++ b/pom.xml
@@ -133,6 +133,8 @@
     <jersey.test-framework>2.27</jersey.test-framework>
     <!-- integration test-->
     <plugin.failsafe.version>2.17</plugin.failsafe.version>
+    <!--  embedded-ldap-junit  -->
+    <embedded-ldap-junit.version>0.7</embedded-ldap-junit.version>
   </properties>
 
   <modules>
diff --git a/submarine-commons/commons-unixusersync/pom.xml b/submarine-commons/commons-unixusersync/pom.xml
new file mode 100644
index 0000000..a13d8b4
--- /dev/null
+++ b/submarine-commons/commons-unixusersync/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+  -->
+
+<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>
+  <parent>
+    <groupId>org.apache.submarine</groupId>
+    <artifactId>submarine-commons</artifactId>
+    <version>0.4.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <groupId>org.apache.submarine</groupId>
+  <artifactId>submarine-commons-unixusersync</artifactId>
+  <version>0.4.0-SNAPSHOT</version>
+  <name>Submarine: Commons Unixusersync</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>commons-configuration</groupId>
+      <artifactId>commons-configuration</artifactId>
+      <version>${commons-configuration.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.zapodot</groupId>
+      <artifactId>embedded-ldap-junit</artifactId>
+      <version>${embedded-ldap-junit.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>${guava.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>${slf4j.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${junit.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <configuration>
+          <skip>false</skip>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-enforcer-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/submarine-commons/commons-unixusersync/src/test/java/org/apache/submarine/commons/unixusersync/EmbeddedLdapRuleTest.java b/submarine-commons/commons-unixusersync/src/test/java/org/apache/submarine/commons/unixusersync/EmbeddedLdapRuleTest.java
new file mode 100644
index 0000000..ede890f
--- /dev/null
+++ b/submarine-commons/commons-unixusersync/src/test/java/org/apache/submarine/commons/unixusersync/EmbeddedLdapRuleTest.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.submarine.commons.unixusersync;
+
+import com.google.common.collect.Iterators;
+
+import com.unboundid.ldap.sdk.AddRequest;
+import com.unboundid.ldap.sdk.Attribute;
+import com.unboundid.ldap.sdk.LDAPConnection;
+import com.unboundid.ldap.sdk.LDAPInterface;
+import com.unboundid.ldap.sdk.SearchRequest;
+import com.unboundid.ldap.sdk.SearchResult;
+import com.unboundid.ldap.sdk.SearchResultEntry;
+import com.unboundid.ldap.sdk.SearchScope;
+import org.junit.Rule;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zapodot.junit.ldap.EmbeddedLdapRule;
+import org.zapodot.junit.ldap.EmbeddedLdapRuleBuilder;
+
+import javax.naming.Context;
+import javax.naming.NameClassPair;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.SearchControls;
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class EmbeddedLdapRuleTest {
+
+  public static final String DOMAIN_DSN = "dc=zapodot,dc=org";
+  private static final Logger LOG = LoggerFactory.getLogger(EmbeddedLdapRuleTest.class);
+
+  @Rule
+  public EmbeddedLdapRule embeddedLdapRule = EmbeddedLdapRuleBuilder
+          .newInstance()
+          .usingDomainDsn(DOMAIN_DSN)
+          .importingLdifs("example.ldif")
+          .build();
+
+  @Test
+  public void testLdapConnection() throws Exception {
+    final LDAPInterface ldapConnection = embeddedLdapRule.ldapConnection();
+    final SearchResult searchResult =
+            ldapConnection.search(DOMAIN_DSN, SearchScope.SUB, "(objectClass=person)");
+
+    assertEquals(2, searchResult.getEntryCount());
+  }
+
+  @Test
+  public void testRawLdapConnection() throws Exception {
+    final String commonName = "Test person";
+    final String dn = String.format("cn=%s,ou=people,dc=zapodot,dc=org", commonName);
+    LDAPConnection ldapConnection = embeddedLdapRule.unsharedLdapConnection();
+    try {
+      ldapConnection.add(new AddRequest(dn, Arrays.asList(
+              new Attribute("objectclass", "top",
+                      "person", "organizationalPerson", "inetOrgPerson"),
+              new Attribute("cn", commonName), new Attribute("sn", "Person"),
+              new Attribute("uid", "test"))));
+    } finally {
+      // Forces the LDAP connection to be closed.
+      // This is not necessary as the rule will usually close it for you.
+      ldapConnection.close();
+    }
+    ldapConnection = embeddedLdapRule.unsharedLdapConnection();
+    final SearchResultEntry entry = ldapConnection.searchForEntry(new SearchRequest(dn,
+          SearchScope.BASE,
+          "(objectClass=person)"));
+    assertNotNull(entry);
+  }
+
+  @Test
+  public void testDirContext() throws Exception {
+    final DirContext dirContext = embeddedLdapRule.dirContext();
+    final SearchControls searchControls = new SearchControls();
+    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+    final NamingEnumeration<javax.naming.directory.SearchResult> resultNamingEnumeration =
+            dirContext.search(DOMAIN_DSN, "(objectClass=person)", searchControls);
+    assertEquals(2, Iterators.size(Iterators.forEnumeration(resultNamingEnumeration)));
+  }
+
+  @Test
+  public void testContext() throws Exception {
+    final Context context = embeddedLdapRule.context();
+    final Object user = context.lookup("cn=Eros,ou=people,dc=zapodot,dc=org");
+    assertNotNull(user);
+  }
+
+  @Test
+  public void testList() throws Exception {
+    final Context context = embeddedLdapRule.context();
+    NamingEnumeration list = context.list("ou=semi-people,dc=zapodot,dc=org");
+
+    while (list.hasMore()){
+      NameClassPair nc = (NameClassPair) list.next();
+      System.out.println(nc.getName());
+    }
+
+    context.close();
+  }
+
+  @Test
+  public void testContextClose() throws Exception {
+    final Context context = embeddedLdapRule.context();
+    context.close();
+    assertNotNull(context.getNameInNamespace());
+  }
+
+  @Test
+  public void testEmbeddedServerPort() throws Exception {
+    assertTrue(embeddedLdapRule.embeddedServerPort() > 0);
+  }
+
+  private void assertTrue(boolean b) {
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testNoPortAssignedYet() throws Exception {
+    final EmbeddedLdapRule embeddedLdapRule = new EmbeddedLdapRuleBuilder().build();
+    embeddedLdapRule.embeddedServerPort();
+  }
+}
diff --git a/submarine-commons/commons-unixusersync/src/test/resources/example.ldif b/submarine-commons/commons-unixusersync/src/test/resources/example.ldif
new file mode 100644
index 0000000..818bd6c
--- /dev/null
+++ b/submarine-commons/commons-unixusersync/src/test/resources/example.ldif
@@ -0,0 +1,70 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+#
+version: 1
+
+dn: dc=zapodot,dc=org
+objectClass: domain
+objectClass: top
+dc: zapodot
+
+dn: ou=groups,dc=zapodot,dc=org
+objectclass: top
+objectclass: organizationalUnit
+ou: groups
+
+dn: ou=people,dc=zapodot,dc=org
+objectclass: top
+objectclass: organizationalUnit
+ou: people
+
+dn: ou=semi-people,dc=zapodot,dc=org
+objectclass: top
+objectclass: organizationalUnit
+ou: people
+
+dn: ou=group-2,dc=zapodot,dc=org
+objectclass: top
+objectclass: organizationalUnit
+ou: people
+
+dn: cn=Eros,ou=people,dc=zapodot,dc=org
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+uid: zapodot
+userPassword: password
+cn: Sondre Eikanger Kvalo
+cn:: U29uZHJlIEVpa2FuZ2VyIEt2YWzDuA==
+sn: Person
+description: Developer
+ou: people
+
+dn: cn=Fake-Eros,ou=semi-people,dc=zapodot,dc=org
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+uid: zapodot
+userPassword: password
+cn: Sondre Eikanger Kvalo
+cn:: U29uZHJlIEVpa2FuZ2VyIEt2YWzDuA==
+sn: Person
+description: Developer
+ou: people
diff --git a/submarine-commons/pom.xml b/submarine-commons/pom.xml
index 00ba26b..da83d9f 100644
--- a/submarine-commons/pom.xml
+++ b/submarine-commons/pom.xml
@@ -40,6 +40,7 @@
     <module>commons-cluster</module>
     <module>commons-metastore</module>
     <module>commons-rpc</module>
+    <module>commons-unixusersync</module>
   </modules>
 
 </project>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@submarine.apache.org
For additional commands, e-mail: dev-help@submarine.apache.org