This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit c7f8f87ef0684d5d7907fe4ba21b8cc69d125892 Author: Rene Cordier <rcord...@linagora.com> AuthorDate: Tue Apr 9 17:50:30 2019 +0700 JAMES-2720 provision of dockerized LinShare containers --- third-party/linshare/pom.xml | 68 +++++++++ .../java/org/apache/james/linshare/Linshare.java | 154 +++++++++++++++++++++ .../apache/james/linshare/LinshareExtension.java | 42 ++++++ .../org/apache/james/linshare/LinshareTest.java | 61 ++++++++ .../src/test/resources/conf/catalina.properties | 147 ++++++++++++++++++++ .../src/test/resources/conf/log4j.properties | 59 ++++++++ .../linshare/src/test/resources/conf/smtpd.conf | 14 ++ .../linshare/src/test/resources/docker-compose.yml | 77 +++++++++++ .../src/test/resources/logback-test.xml} | 29 ++-- third-party/linshare/src/test/resources/ssl/ca.pem | 28 ++++ .../linshare/src/test/resources/ssl/linshare.key | 28 ++++ .../linshare/src/test/resources/ssl/linshare.pem | 97 +++++++++++++ third-party/pom.xml | 2 +- 13 files changed, 786 insertions(+), 20 deletions(-) diff --git a/third-party/linshare/pom.xml b/third-party/linshare/pom.xml new file mode 100644 index 0000000..5fc4a83 --- /dev/null +++ b/third-party/linshare/pom.xml @@ -0,0 +1,68 @@ +<?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.james</groupId> + <artifactId>third-party</artifactId> + <version>3.4.0-SNAPSHOT</version> + </parent> + + <artifactId>apache-james-linshare</artifactId> + + <dependencies> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.rest-assured</groupId> + <artifactId>rest-assured</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-launcher</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>testcontainers</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/third-party/linshare/src/test/java/org/apache/james/linshare/Linshare.java b/third-party/linshare/src/test/java/org/apache/james/linshare/Linshare.java new file mode 100644 index 0000000..7f90649 --- /dev/null +++ b/third-party/linshare/src/test/java/org/apache/james/linshare/Linshare.java @@ -0,0 +1,154 @@ +/**************************************************************** + * 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.james.linshare; + +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.wait.strategy.Wait; + +public class Linshare { + private static final String WAIT_FOR_BACKEND_INIT_LOG = ".*Server startup.*"; + private static final String WAIT_FOR_DB_INIT_LOG = ".*/linshare/webservice/rest/admin/authentication/change_password.*"; + private static final int LINSHARE_BACKEND_PORT = 8080; + + private final GenericContainer<?> linshareBackend; + private final GenericContainer<?> linshareDatabase; + private final GenericContainer<?> linshareDatabaseInit; + private final GenericContainer<?> linshareSmtp; + private final GenericContainer<?> linshareLdap; + private final GenericContainer<?> linshareMongodb; + + private Network network; + + @SuppressWarnings("resource") + public Linshare() { + network = Network.newNetwork(); + linshareDatabase = createDockerDatabase(); + linshareMongodb = createDockerMongodb(); + linshareLdap = createDockerLdap(); + linshareSmtp = createDockerSmtp(); + linshareBackend = createDockerBackend(); + linshareDatabaseInit = createDockerDatabaseInit(); + } + + public void start() { + linshareDatabase.start(); + linshareMongodb.start(); + linshareLdap.start(); + linshareSmtp.start(); + linshareBackend.start(); + linshareDatabaseInit.start(); + } + + public void stop() { + linshareDatabase.stop(); + linshareMongodb.stop(); + linshareLdap.stop(); + linshareSmtp.stop(); + linshareBackend.stop(); + linshareDatabaseInit.stop(); + } + + public int getPort() { + return linshareBackend.getMappedPort(LINSHARE_BACKEND_PORT); + } + + public String getIp() { + return linshareBackend.getContainerIpAddress(); + } + + private GenericContainer createDockerDatabase() { + return new GenericContainer<>("linagora/linshare-database:2.2") + .withNetworkAliases("database", "linshare_database") + .withEnv("PGDATA", "/var/lib/postgresql/data/pgdata") + .withEnv("POSTGRES_USER", "linshare") + .withEnv("POSTGRES_PASSWORD", "linshare") + .withNetwork(network); + } + + private GenericContainer createDockerMongodb() { + return new GenericContainer<>("mongo:3.2") + .withNetworkAliases("mongodb", "linshare_mongodb") + .withCommand("mongod --smallfiles") + .withNetwork(network); + } + + private GenericContainer createDockerLdap() { + return new GenericContainer<>("linagora/linshare-ldap-for-tests:1.0") + .withNetworkAliases("ldap") + .withNetwork(network); + } + + private GenericContainer createDockerSmtp() { + return new GenericContainer<>("linagora/opensmtpd") + .withNetworkAliases("smtp", "linshare_smtp") + .withClasspathResourceMapping("./conf/smtpd.conf", + "/etc/smtpd/smtpd.conf", + BindMode.READ_ONLY) + .withNetwork(network); + } + + private GenericContainer createDockerDatabaseInit() { + return new GenericContainer<>("chibenwa/linshare-database-init:2.2") + .withEnv("TOMCAT_HOST", "backend") + .withEnv("TOMCAT_PORT", "8080") + .withEnv("TOMCAT_LDAP_NAME", "ldap-local") + .withEnv("TOMCAT_LDAP_URL", "ldap://ldap:389") + .withEnv("TOMCAT_LDAP_BASE_DN", "ou=People,dc=linshare,dc=org") + .withEnv("TOMCAT_LDAP_DN", "cn=linshare,dc=linshare,dc=org") + .withEnv("TOMCAT_LDAP_PW", "linshare") + .withEnv("TOMCAT_DOMAIN_PATTERN_NAME", "openldap-local") + .withEnv("TOMCAT_DOMAIN_PATTERN_MODEL", "868400c0-c12e-456a-8c3c-19e985290586") + .withEnv("NO_REPLY_ADDRESS", "linshare-nore...@linshare.org") + .withEnv("DEBUG", "1") + .withNetwork(network) + .waitingFor(Wait.forLogMessage(WAIT_FOR_DB_INIT_LOG, 1)); + } + + private GenericContainer createDockerBackend() { + return new GenericContainer<>("linagora/linshare-backend:2.2") + .withNetworkAliases("backend") + .withEnv("SMTP_HOST", "linshare_smtp") + .withEnv("SMTP_PORT", "25") + .withEnv("POSTGRES_HOST", "linshare_database") + .withEnv("POSTGRES_PORT", "5432") + .withEnv("POSTGRES_USER", "linshare") + .withEnv("POSTGRES_PASSWORD", "linshare") + .withEnv("MONGODB_HOST", "linshare_mongodb") + .withEnv("MONGODB_PORT", "27017") + .withEnv("THUMBNAIL_ENABLE", "false") + .withClasspathResourceMapping("./conf/catalina.properties", + "/usr/local/tomcat/conf/catalina.properties", + BindMode.READ_ONLY) + .withClasspathResourceMapping("./conf/log4j.properties", + "/etc/linshare/log4j.properties", + BindMode.READ_ONLY) + .withClasspathResourceMapping("./ssl/id_rsa", + "/etc/linshare/id_rsa", + BindMode.READ_ONLY) + .withClasspathResourceMapping("./ssl/id_rsa.pub", + "/etc/linshare/id_rsa.pub", + BindMode.READ_ONLY) + .withExposedPorts(LINSHARE_BACKEND_PORT) + .waitingFor(Wait.forLogMessage(WAIT_FOR_BACKEND_INIT_LOG, 1)) + .withNetwork(network); + } +} diff --git a/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareExtension.java b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareExtension.java new file mode 100644 index 0000000..557b29d --- /dev/null +++ b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareExtension.java @@ -0,0 +1,42 @@ +/**************************************************************** + * 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.james.linshare; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +public class LinshareExtension implements BeforeAllCallback, AfterAllCallback { + private Linshare linshare; + + @Override + public void beforeAll(ExtensionContext context) { + linshare = new Linshare(); + linshare.start(); + } + + @Override + public void afterAll(ExtensionContext extensionContext) { + linshare.stop(); + } + + public Linshare getLinshare() { + return linshare; + } +} diff --git a/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareTest.java b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareTest.java new file mode 100644 index 0000000..855f5ed --- /dev/null +++ b/third-party/linshare/src/test/java/org/apache/james/linshare/LinshareTest.java @@ -0,0 +1,61 @@ +/**************************************************************** + * 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.james.linshare; + +import static io.restassured.RestAssured.given; +import static io.restassured.config.EncoderConfig.encoderConfig; +import static io.restassured.config.RestAssuredConfig.newConfig; + +import java.nio.charset.StandardCharsets; + +import org.apache.http.HttpStatus; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.restassured.RestAssured; +import io.restassured.builder.RequestSpecBuilder; +import io.restassured.http.ContentType; + +class LinshareTest { + @RegisterExtension + static LinshareExtension linshareExtension = new LinshareExtension(); + + @BeforeEach + void setup() { + RestAssured.requestSpecification = new RequestSpecBuilder() + .setContentType(ContentType.JSON) + .setAccept(ContentType.JSON) + .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8))) + .setBaseUri("http://" + linshareExtension.getLinshare().getIp()) + .setPort(linshareExtension.getLinshare().getPort()) + .build(); + RestAssured.enableLoggingOfRequestAndResponseIfValidationFails(); + } + + @Test + void linshareShouldStart() { + given() + .auth().basic("us...@linshare.org", "password1") + .when() + .get("linshare/webservice/rest/user/v2/documents") + .then() + .statusCode(HttpStatus.SC_OK); + } +} diff --git a/third-party/linshare/src/test/resources/conf/catalina.properties b/third-party/linshare/src/test/resources/conf/catalina.properties new file mode 100644 index 0000000..e79b5c9 --- /dev/null +++ b/third-party/linshare/src/test/resources/conf/catalina.properties @@ -0,0 +1,147 @@ +# 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. + +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageAccess unless the +# corresponding RuntimePermission ("accessClassInPackage."+package) has +# been granted. +package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat. +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageDefinition unless the +# corresponding RuntimePermission ("defineClassInPackage."+package) has +# been granted. +# +# by default, no packages are restricted for definition, and none of +# the class loaders supplied with the JDK call checkPackageDefinition. +# +package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,\ +org.apache.jasper.,org.apache.naming.,org.apache.tomcat. + +# +# +# List of comma-separated paths defining the contents of the "common" +# classloader. Prefixes should be used to define what is the repository type. +# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute. +# If left as blank,the JVM system loader will be used as Catalina's "common" +# loader. +# Examples: +# "foo": Add this folder as a class repository +# "foo/*.jar": Add all the JARs of the specified folder as class +# repositories +# "foo/bar.jar": Add bar.jar as a class repository +# +# Note: Values are enclosed in double quotes ("...") in case either the +# ${catalina.base} path or the ${catalina.home} path contains a comma. +# Because double quotes are used for quoting, the double quote character +# may not appear in a path. +common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar" + +# +# List of comma-separated paths defining the contents of the "server" +# classloader. Prefixes should be used to define what is the repository type. +# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute. +# If left as blank, the "common" loader will be used as Catalina's "server" +# loader. +# Examples: +# "foo": Add this folder as a class repository +# "foo/*.jar": Add all the JARs of the specified folder as class +# repositories +# "foo/bar.jar": Add bar.jar as a class repository +# +# Note: Values may be enclosed in double quotes ("...") in case either the +# ${catalina.base} path or the ${catalina.home} path contains a comma. +# Because double quotes are used for quoting, the double quote character +# may not appear in a path. +server.loader= + +# +# List of comma-separated paths defining the contents of the "shared" +# classloader. Prefixes should be used to define what is the repository type. +# Path may be relative to the CATALINA_BASE path or absolute. If left as blank, +# the "common" loader will be used as Catalina's "shared" loader. +# Examples: +# "foo": Add this folder as a class repository +# "foo/*.jar": Add all the JARs of the specified folder as class +# repositories +# "foo/bar.jar": Add bar.jar as a class repository +# Please note that for single jars, e.g. bar.jar, you need the URL form +# starting with file:. +# +# Note: Values may be enclosed in double quotes ("...") in case either the +# ${catalina.base} path or the ${catalina.home} path contains a comma. +# Because double quotes are used for quoting, the double quote character +# may not appear in a path. +shared.loader= + +# Default list of JAR files that should not be scanned using the JarScanner +# functionality. This is typically used to scan JARs for configuration +# information. JARs that do not contain such information may be excluded from +# the scan to speed up the scanning process. This is the default list. JARs on +# this list are excluded from all scans. The list must be a comma separated list +# of JAR file names. +# The list of JARs to skip may be over-ridden at a Context level for individual +# scan types by configuring a JarScanner with a nested JarScanFilter. +# The JARs listed below include: +# - Tomcat Bootstrap JARs +# - Tomcat API JARs +# - Catalina JARs +# - Jasper JARs +# - Tomcat JARs +# - Common non-Tomcat JARs +# - Test JARs (JUnit, Cobertura and dependencies) +tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ +bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\ +annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,\ +catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-storeconfig.jar,\ +catalina-tribes.jar,\ +jasper.jar,jasper-el.jar,ecj-*.jar,\ +tomcat-api.jar,tomcat-util.jar,tomcat-util-scan.jar,tomcat-coyote.jar,\ +tomcat-dbcp.jar,tomcat-jni.jar,tomcat-websocket.jar,\ +tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\ +tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,\ +tomcat-jdbc.jar,\ +tools.jar,\ +commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,\ +commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,\ +commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,\ +commons-math*.jar,commons-pool*.jar,\ +jstl.jar,taglibs-standard-spec-*.jar,\ +geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,\ +ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,\ +jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,\ +xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\ +junit.jar,junit-*.jar,ant-launcher.jar,\ +cobertura-*.jar,asm-*.jar,dom4j-*.jar,icu4j-*.jar,jaxen-*.jar,jdom-*.jar,\ +jetty-*.jar,oro-*.jar,servlet-api-*.jar,tagsoup-*.jar,xmlParserAPIs-*.jar,\ +jclouds-bouncycastle-1.9.2.jar,bcprov-*.jar,\ +xom-*.jar + +# Default list of JAR files that should be scanned that overrides the default +# jarsToSkip list above. This is typically used to include a specific JAR that +# has been excluded by a broad file name pattern in the jarsToSkip list. +# The list of JARs to scan may be over-ridden at a Context level for individual +# scan types by configuring a JarScanner with a nested JarScanFilter. +tomcat.util.scan.StandardJarScanFilter.jarsToScan=\ +log4j-core*.jar,log4j-taglib*.jar,log4javascript*.jar,slf4j-taglib*.jar + +# String cache configuration. +tomcat.util.buf.StringCache.byte.enabled=true +#tomcat.util.buf.StringCache.char.enabled=true +#tomcat.util.buf.StringCache.trainThreshold=500000 +#tomcat.util.buf.StringCache.cacheSize=5000 diff --git a/third-party/linshare/src/test/resources/conf/log4j.properties b/third-party/linshare/src/test/resources/conf/log4j.properties new file mode 100644 index 0000000..67118a8 --- /dev/null +++ b/third-party/linshare/src/test/resources/conf/log4j.properties @@ -0,0 +1,59 @@ +# Default to info level output; this is very handy if you eventually use Hibernate as well. +log4j.rootCategory=INFO, CONSOLE + +# In order to use an external configuration file for log4j, use this key for JAVA_OPS +# JAVA_OPTS="${JAVA_OPTS} -Dlog4j.configuration=file:/etc/linshare/log4j.properties" + +# Define all the appenders +log4j.appender.LINSHARE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.LINSHARE.File=${catalina.home}/logs/linshare +#log4j.appender.LINSHARE.File=${jetty.home}/logs/linshare +log4j.appender.LINSHARE.Append=true +log4j.appender.LINSHARE.Encoding=UTF-8 +# Roll-over the log once per day +log4j.appender.LINSHARE.DatePattern='.'yyyy-MM-dd'.log' +log4j.appender.LINSHARE.layout = org.apache.log4j.PatternLayout +#log4j.appender.LINSHARE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n +log4j.appender.LINSHARE.layout.ConversionPattern=[%p]:%t:%d{yyyyMMdd.HHmmss}:%c:%M:%m%n + + +# CONSOLE is set to be a ConsoleAppender. +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +# CONSOLE uses PatternLayout. +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=[%p]:%t:%d{yyyyMMdd.HHmmss}:%c:%M:%m%n + + +# Service category names are the name of the defining module class and then the service id. +# we could set the two new logger to warn to avoid a lot of information in production mode. +log4j.category.org.linagora.linshare.services.AppModule.TimingFilter=info +log4j.category.org.linagora.linshare.view.tapestry.services.AppModule.TimingFilter=info + + +# Outputs a list of pages, components and mixins at startup. +log4j.category.org.apache.tapestry5.services.TapestryModule.ComponentClassResolver=info + +# Outputs startup statistics; time to setup and initialize the registry, and a list of +# available services. +log4j.category.org.apache.tapestry5.TapestryFilter=info + +# Disable info message "[INFO]:AbstractContextSource:afterPropertiesSet:Property 'userDn' not set - anonymous context will be used for read-write operations" +log4j.category.org.springframework.ldap.core.support.AbstractContextSource=warn + +# Turning on debug mode for a page or component will show all of the code changes that occur when the +# class is loaded. Turning on debug mode for a page will enable detailed output about +# the contruction of the page, including the runtime code modifications that occur. Verbose +# mode is rarely used, as it outputs voluminous details about the rendering of the page. + +# log4j.category.org.linagora.linshare.pages.Index=info + +# Turn on some verbose debugging about everything in the application. This is nice initially, +# while getting everything set up. You'll probably want to remove this once you are +# up and running, replacing it with more selecting debugging output. +#log4j.category.org.linagora.linshare=info + +#log4j.category.org.springframework.security=info + +log4j.category.org.linagora.linkit=info + +log4j.category.org.linagora.linshare=debug diff --git a/third-party/linshare/src/test/resources/conf/smtpd.conf b/third-party/linshare/src/test/resources/conf/smtpd.conf new file mode 100644 index 0000000..f6afe25 --- /dev/null +++ b/third-party/linshare/src/test/resources/conf/smtpd.conf @@ -0,0 +1,14 @@ +# This is the smtpd server system-wide configuration file. +# See smtpd.conf(5) for more information. + +# To accept external mail, replace with: listen on all +listen on 0.0.0.0 + +# If you edit the file, you have to run "smtpctl update table aliases" +table aliases file:/etc/smtpd/aliases + +# Uncomment the following to accept external mail for domain "example.org" +#accept from any for domain "example.org" alias <aliases> deliver to mbox + +#accept for local alias <aliases> deliver to mbox +accept from any for any relay diff --git a/third-party/linshare/src/test/resources/docker-compose.yml b/third-party/linshare/src/test/resources/docker-compose.yml new file mode 100644 index 0000000..e869bea --- /dev/null +++ b/third-party/linshare/src/test/resources/docker-compose.yml @@ -0,0 +1,77 @@ +# Docker compose file for a full-featured Linshare architecture +version: '3.7' + +services: + database: + restart: on-failure + image: linagora/linshare-database:2.2 + environment: + - PGDATA=/var/lib/postgresql/data/pgdata + - POSTGRES_USER=linshare + - POSTGRES_PASSWORD=linshare + + backend: + restart: on-failure + image: linagora/linshare-backend:2.2 + links: + - database:linshare_database + - mongodb:linshare_mongodb + depends_on: + - database + - mongodb + volumes: + - ./conf/catalina.properties:/usr/local/tomcat/conf/catalina.properties + - ./conf/log4j.properties:/etc/linshare/log4j.properties + - ./ssl/id_rsa:/etc/linshare/id_rsa + - ./ssl/id_rsa.pub:/etc/linshare/id_rsa.pub + healthcheck: + test: ["CMD", "curl", "-s", "-f", "http://localhost:8080/linshare/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + environment: + - SMTP_HOST=linshare_smtp + - SMTP_PORT=25 + - POSTGRES_HOST=linshare_database + - POSTGRES_PORT=5432 + - POSTGRES_USER=linshare + - POSTGRES_PASSWORD=linshare + - MONGODB_HOST=linshare_mongodb + - MONGODB_PORT=27017 + - THUMBNAIL_ENABLE=false + + mongodb: + restart: on-failure + image: mongo:3.2 + command: mongod --smallfiles + + smtp: + restart: on-failure + image: linagora/opensmtpd + volumes: + - ./conf/smtpd.conf:/etc/smtpd/smtpd.conf + + ldap: + image: linagora/linshare-ldap-for-tests:1.0 + tty: true + stdin_open: true + + database-init: + image: chibenwa/linshare-database-init:2.2 + links: + - backend:backend + depends_on: + - backend + environment: + - TOMCAT_HOST=backend + - TOMCAT_PORT=8080 + - TOMCAT_LDAP_NAME=ldap-local + - TOMCAT_LDAP_URL=ldap://ldap:389 + - TOMCAT_LDAP_BASE_DN=ou=People,dc=linshare,dc=org + - TOMCAT_LDAP_DN=cn=linshare,dc=linshare,dc=org + - TOMCAT_LDAP_PW=linshare + - TOMCAT_DOMAIN_PATTERN_NAME=openldap-local + - TOMCAT_DOMAIN_PATTERN_MODEL=868400c0-c12e-456a-8c3c-19e985290586 + - NO_REPLY_ADDRESS=linshare-nore...@linshare.org + - DEBUG=1 \ No newline at end of file diff --git a/third-party/pom.xml b/third-party/linshare/src/test/resources/logback-test.xml similarity index 51% copy from third-party/pom.xml copy to third-party/linshare/src/test/resources/logback-test.xml index 66b0a48..1fc9998 100644 --- a/third-party/pom.xml +++ b/third-party/linshare/src/test/resources/logback-test.xml @@ -1,4 +1,3 @@ -<?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 @@ -17,24 +16,16 @@ 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/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> +<configuration> - <parent> - <groupId>org.apache.james</groupId> - <artifactId>james-project</artifactId> - <version>3.4.0-SNAPSHOT</version> - </parent> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%date %-5level [%thread] - [%logger]- %msg%n</pattern> + </encoder> + </appender> - <artifactId>third-party</artifactId> - <packaging>pom</packaging> + <root level="INFO"> + <appender-ref ref="STDOUT" /> + </root> - <name>Apache JAMES third party</name> - <description>Common utilities for integrating with third party software</description> - <inceptionYear>2018</inceptionYear> - - <modules> - <module>spamassassin</module> - </modules> - -</project> \ No newline at end of file +</configuration> \ No newline at end of file diff --git a/third-party/linshare/src/test/resources/ssl/ca.pem b/third-party/linshare/src/test/resources/ssl/ca.pem new file mode 100644 index 0000000..208dd8d --- /dev/null +++ b/third-party/linshare/src/test/resources/ssl/ca.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIEzTCCA7WgAwIBAgIJAMikNamqqRPjMA0GCSqGSIb3DQEBCwUAMIGfMQswCQYD +VQQGEwJGUjEMMAoGA1UECBMDSWRGMQ4wDAYDVQQHEwVQYXJpczERMA8GA1UEChMI +TGluYWdvcmExETAPBgNVBAsUCFImRCBTYWFzMRQwEgYDVQQDEwtMaW5hZ29yYSBD +QTEQMA4GA1UEKRMHRWFzeVJTQTEkMCIGCSqGSIb3DQEJARYVdHNhcmJvbmlAbGlu +YWdvcmEuY29tMB4XDTE1MDkxNDA4NTAxOVoXDTI1MDkxMTA4NTAxOVowgZ8xCzAJ +BgNVBAYTAkZSMQwwCgYDVQQIEwNJZEYxDjAMBgNVBAcTBVBhcmlzMREwDwYDVQQK +EwhMaW5hZ29yYTERMA8GA1UECxQIUiZEIFNhYXMxFDASBgNVBAMTC0xpbmFnb3Jh +IENBMRAwDgYDVQQpEwdFYXN5UlNBMSQwIgYJKoZIhvcNAQkBFhV0c2FyYm9uaUBs +aW5hZ29yYS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnX76W +/7NAsYW9SvK/jPCY3QlpL5lNtiN99OV2hD/Hk1PSG34rwe9GyFCL/4YikcHTnWuk +vizK1/IDGhi482FlljecWH5UxMlHG8yxUG9ahs86pNjcsyUafDAryXC3ocFtGk4v +e2kAOatGlqlV7EH2rKi0t5jnMXdV2stMeitUNSFs8+iyDQK4V3T6n/hXpxO8VXsB +wF7vd/4+idyAcC1YwUKiB+PAbUvpot+hJ8OaM1q5i3CXEFEbUCrJLh/oC2srOdhr +7Rk4YK6oz+Pw3NQTvVZBByfziE2H6YRHWdRDVcOfWh2L0z42C5tCr23LDAray/9d +uOYKl+cLKdvv4ymHAgMBAAGjggEIMIIBBDAdBgNVHQ4EFgQUnLuJzgwZk9X8Rgb0 +QUyYz6zdILQwgdQGA1UdIwSBzDCByYAUnLuJzgwZk9X8Rgb0QUyYz6zdILShgaWk +gaIwgZ8xCzAJBgNVBAYTAkZSMQwwCgYDVQQIEwNJZEYxDjAMBgNVBAcTBVBhcmlz +MREwDwYDVQQKEwhMaW5hZ29yYTERMA8GA1UECxQIUiZEIFNhYXMxFDASBgNVBAMT +C0xpbmFnb3JhIENBMRAwDgYDVQQpEwdFYXN5UlNBMSQwIgYJKoZIhvcNAQkBFhV0 +c2FyYm9uaUBsaW5hZ29yYS5jb22CCQDIpDWpqqkT4zAMBgNVHRMEBTADAQH/MA0G +CSqGSIb3DQEBCwUAA4IBAQCiEAmG+czlm/HT0s1ahWTtqcbzGl0+j3Io/JtyVNWW +ALmmYid3VejcHYDbKd0rN+yFJtI+p6CMjpRVZCDEJo8eLZr9P7YZa+jKc0OhjSgr +mD7FVwyZePid33VuKzWaMLbKiNVIcXroKkm2pEvENdibMZWBuhgrs6Pa00iYH68g +s5Y1glQV7IeCmHkwNmHtgkiLDIzJYYukxAQSnaz7su8wnGtEJS6iz8+iCtEJm8XR +FoUzfMS1/TI+C2tU80qfkc7D4kL7eEDob0zfdlZlqMKEWen47EuVuB+4DdImaI1P +i+10msgMl2o6K4tNYVlfcM3qkHSXFfwEwvWtIqvRYsx4 +-----END CERTIFICATE----- diff --git a/third-party/linshare/src/test/resources/ssl/linshare.key b/third-party/linshare/src/test/resources/ssl/linshare.key new file mode 100644 index 0000000..58380e0 --- /dev/null +++ b/third-party/linshare/src/test/resources/ssl/linshare.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDfj54Mfv8DEqLv +AUpPAp+S2jI2I/DjBBzbvuqlsPGN4Qqlt8XPwBl8MEu4DDwingJHvK64jZ7hT3+K +3Zk/T2HGRYq1eJYAU0CLj6pAhh3kzxadxtTZHcpDZslSeFzq5bog1LKk/d5xv9we +Qu4xDxUU4a5A9jM9SyP+6YVjih5SebLRhUq2iUPmoQLvLqGz2YVq+keAbpzFcfOX +7SEfXb1le9HUxrtpVE1svtaaoZziHQYmwTLEb9yq1UWyu+LXSk/gnsnt9Iy19P4I +V2TuoaiDIXkw1HEzD+fRom38I7Wzf9t+pLuJbGrY2Az0k7NdO/Ri0G5fex3Hvc+o ++euNEa1xAgMBAAECggEBAJFzcEHzEllec7GKpl0XeNjjq417/srErz3tTd81a0OC +6hl9om6TLkGVbn41P57KLPOdeBPM2FUBExs3J/B/5j5ImoGNDhLyF2l1tDA80hA/ +CBjo9yy3bBREOLG2a8XMZzfbCsu7/FEHod/ybeRvSqkGWAgd5qJ3U9kS990WTLod +Clx2rYb6ewOhyn0ij9HcyQnPnjetGmvTeBlkIxoz3qjUg7vpxwdj4WQoSUvyTu+c +YBbLjCKWY7UIlr8EimnPFYl87IMnl6Awj9+iwLTkg3vw83pqsxepllbVpJZh55Vi +qmIBb0RtPT5mloT4AmeRERpjKFRPfoEc6U18JHCXypECgYEA9wwNviF3NQJtqlV/ +DLxgsWzPiqwT/2KqzcPzRJrKFMf4nMZFTIonXWAkIPGu6bFnsz9mfwgxZjhRMfoW +amm9NUym0So61joCkCTg08LHUYnFFKFLzesEqiMumq/FDDGMPIG7eNRVw+Pwtd3+ +h2UqcGBjtwzb4mHo8aG7SdrhXtUCgYEA56msu1ALMh2WQm81QLrBybqF7LDWyWab +65Es356ukBv0FszsCFYW1SngEFjsrcNjNdyjuMu5khxYpW0V7T/lBEnB/BcZ0xBi +2IQ4OgJH1iPJrd2yhh/U7gHbz26BRM7/hCJuO7CNcPEZJJkfRu3Vv7cohozg+1Uk +6ipxW+V4+i0CgYEA14SvdH/Tc+5DZ4agiKbKH96SDCLkazZTVaCtV9tFke2GCJa7 +m/MmNkKKIidVdU+r7ObRbt7h4ZAd3WCUL49BXf8ZxH13yK3g0IkrjfFtWse6o622 +6NQvRJHetVnDqEiNU7fFqbpre7IdqzsYMlviMxkTxHw2Uv8hbbKvJdYKKGUCgYAE +66WvlNOoDNjUMGiBJ3ZWQo/1pwvo2zUUm9DILyamCPH2SgP5aVqyzGDl9/2O80d4 +LWeM1Ubrw45edSKyF1lV7fsgz5zMztxKnQRUtxevhLMT7lGMZ8CuDXwNu9sjCwKC +W/jba7SVYYmXLWlsqECSAeHqebONoxFVp/Egco9PQQKBgE1iQ30yPc6EaYnVoXGe +j5BQw80T1yc5ePX5aixZkS0YRywb5YjR6lg6/tSqCSFsvUs7ysj9etXfMLP2JDns +7LFzDEhPP71uQASe729JCBcK92pQOmbJZO2yxFp06P6y8eMNb+giefWybRe2CTt2 +rE8Xi7dsol9Ev4pYqI4DZF9l +-----END PRIVATE KEY----- diff --git a/third-party/linshare/src/test/resources/ssl/linshare.pem b/third-party/linshare/src/test/resources/ssl/linshare.pem new file mode 100644 index 0000000..d38eea4 --- /dev/null +++ b/third-party/linshare/src/test/resources/ssl/linshare.pem @@ -0,0 +1,97 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=FR, ST=IdF, L=Paris, O=Linagora, OU=R&D Saas, CN=Linagora CA/name=EasyRSA/emailAddress=tsarb...@linagora.com + Validity + Not Before: Sep 14 08:53:06 2015 GMT + Not After : Sep 11 08:53:06 2025 GMT + Subject: C=FR, ST=IdF, L=Paris, O=Linagora, OU=R&D Saas, CN=*.linshare.local/name=EasyRSA/emailAddress=tsarb...@linagora.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:df:8f:9e:0c:7e:ff:03:12:a2:ef:01:4a:4f:02: + 9f:92:da:32:36:23:f0:e3:04:1c:db:be:ea:a5:b0: + f1:8d:e1:0a:a5:b7:c5:cf:c0:19:7c:30:4b:b8:0c: + 3c:22:9e:02:47:bc:ae:b8:8d:9e:e1:4f:7f:8a:dd: + 99:3f:4f:61:c6:45:8a:b5:78:96:00:53:40:8b:8f: + aa:40:86:1d:e4:cf:16:9d:c6:d4:d9:1d:ca:43:66: + c9:52:78:5c:ea:e5:ba:20:d4:b2:a4:fd:de:71:bf: + dc:1e:42:ee:31:0f:15:14:e1:ae:40:f6:33:3d:4b: + 23:fe:e9:85:63:8a:1e:52:79:b2:d1:85:4a:b6:89: + 43:e6:a1:02:ef:2e:a1:b3:d9:85:6a:fa:47:80:6e: + 9c:c5:71:f3:97:ed:21:1f:5d:bd:65:7b:d1:d4:c6: + bb:69:54:4d:6c:be:d6:9a:a1:9c:e2:1d:06:26:c1: + 32:c4:6f:dc:aa:d5:45:b2:bb:e2:d7:4a:4f:e0:9e: + c9:ed:f4:8c:b5:f4:fe:08:57:64:ee:a1:a8:83:21: + 79:30:d4:71:33:0f:e7:d1:a2:6d:fc:23:b5:b3:7f: + db:7e:a4:bb:89:6c:6a:d8:d8:0c:f4:93:b3:5d:3b: + f4:62:d0:6e:5f:7b:1d:c7:bd:cf:a8:f9:eb:8d:11: + ad:71 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Cert Type: + SSL Server + Netscape Comment: + Easy-RSA Generated Server Certificate + X509v3 Subject Key Identifier: + 28:DD:B4:92:F2:8C:CB:0F:42:2A:CE:1F:0B:7C:02:76:D9:A4:E9:D3 + X509v3 Authority Key Identifier: + keyid:9C:BB:89:CE:0C:19:93:D5:FC:46:06:F4:41:4C:98:CF:AC:DD:20:B4 + DirName:/C=FR/ST=IdF/L=Paris/O=Linagora/OU=R&D Saas/CN=Linagora CA/name=EasyRSA/emailAddress=tsarb...@linagora.com + serial:C8:A4:35:A9:AA:A9:13:E3 + + X509v3 Extended Key Usage: + TLS Web Server Authentication + X509v3 Key Usage: + Digital Signature, Key Encipherment + Signature Algorithm: sha256WithRSAEncryption + 99:8d:66:fc:73:b4:04:ae:d1:04:5e:80:73:a5:6c:54:f3:bd: + a4:51:1a:6f:90:11:32:f4:e4:c1:f2:9d:e0:aa:fe:c6:c5:02: + 68:a1:f9:fa:8d:88:d2:62:db:6c:9d:78:dc:6a:e2:89:3f:cf: + 3f:3a:8a:89:56:b3:70:f2:db:32:da:08:07:06:11:33:05:60: + d7:31:f3:21:3f:f5:11:21:59:5e:8e:8a:ad:1d:2f:c8:88:54: + 42:90:bc:2a:fd:42:26:99:b3:45:ac:4a:98:2d:2f:51:ee:8d: + 1e:3e:01:40:b1:f2:a1:45:e3:8b:f1:91:97:e8:f8:9c:45:fe: + c2:42:2e:8f:f1:7e:24:3d:73:ad:c0:7b:6d:3e:e7:5e:c5:36: + 70:e3:32:ee:8e:d0:47:46:d6:63:5e:8d:5c:e3:ee:08:3e:56: + 53:3f:ca:39:02:23:1d:d5:fd:90:20:cd:37:a5:4f:83:21:c9: + 5b:41:cc:cb:57:51:9c:b9:a6:31:1c:74:fa:24:a4:84:a0:98: + a0:69:3e:b1:eb:a5:1c:84:ac:9d:4d:e0:37:e9:a0:f2:e6:9d: + ca:7b:26:0a:66:d9:91:f8:b0:f3:49:4f:85:59:cf:58:b5:b5: + 15:7c:86:0b:c0:a8:42:4b:bd:3c:90:54:70:8b:dd:c1:bd:cb: + ba:67:13:a9 +-----BEGIN CERTIFICATE----- +MIIFMjCCBBqgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBnzELMAkGA1UEBhMCRlIx +DDAKBgNVBAgTA0lkRjEOMAwGA1UEBxMFUGFyaXMxETAPBgNVBAoTCExpbmFnb3Jh +MREwDwYDVQQLFAhSJkQgU2FhczEUMBIGA1UEAxMLTGluYWdvcmEgQ0ExEDAOBgNV +BCkTB0Vhc3lSU0ExJDAiBgkqhkiG9w0BCQEWFXRzYXJib25pQGxpbmFnb3JhLmNv +bTAeFw0xNTA5MTQwODUzMDZaFw0yNTA5MTEwODUzMDZaMIGkMQswCQYDVQQGEwJG +UjEMMAoGA1UECBMDSWRGMQ4wDAYDVQQHEwVQYXJpczERMA8GA1UEChMITGluYWdv +cmExETAPBgNVBAsUCFImRCBTYWFzMRkwFwYDVQQDFBAqLmxpbnNoYXJlLmxvY2Fs +MRAwDgYDVQQpEwdFYXN5UlNBMSQwIgYJKoZIhvcNAQkBFhV0c2FyYm9uaUBsaW5h +Z29yYS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfj54Mfv8D +EqLvAUpPAp+S2jI2I/DjBBzbvuqlsPGN4Qqlt8XPwBl8MEu4DDwingJHvK64jZ7h +T3+K3Zk/T2HGRYq1eJYAU0CLj6pAhh3kzxadxtTZHcpDZslSeFzq5bog1LKk/d5x +v9weQu4xDxUU4a5A9jM9SyP+6YVjih5SebLRhUq2iUPmoQLvLqGz2YVq+keAbpzF +cfOX7SEfXb1le9HUxrtpVE1svtaaoZziHQYmwTLEb9yq1UWyu+LXSk/gnsnt9Iy1 +9P4IV2TuoaiDIXkw1HEzD+fRom38I7Wzf9t+pLuJbGrY2Az0k7NdO/Ri0G5fex3H +vc+o+euNEa1xAgMBAAGjggFwMIIBbDAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQE +AwIGQDA0BglghkgBhvhCAQ0EJxYlRWFzeS1SU0EgR2VuZXJhdGVkIFNlcnZlciBD +ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUKN20kvKMyw9CKs4fC3wCdtmk6dMwgdQGA1Ud +IwSBzDCByYAUnLuJzgwZk9X8Rgb0QUyYz6zdILShgaWkgaIwgZ8xCzAJBgNVBAYT +AkZSMQwwCgYDVQQIEwNJZEYxDjAMBgNVBAcTBVBhcmlzMREwDwYDVQQKEwhMaW5h +Z29yYTERMA8GA1UECxQIUiZEIFNhYXMxFDASBgNVBAMTC0xpbmFnb3JhIENBMRAw +DgYDVQQpEwdFYXN5UlNBMSQwIgYJKoZIhvcNAQkBFhV0c2FyYm9uaUBsaW5hZ29y +YS5jb22CCQDIpDWpqqkT4zATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMC +BaAwDQYJKoZIhvcNAQELBQADggEBAJmNZvxztASu0QRegHOlbFTzvaRRGm+QETL0 +5MHyneCq/sbFAmih+fqNiNJi22ydeNxq4ok/zz86iolWs3Dy2zLaCAcGETMFYNcx +8yE/9REhWV6Oiq0dL8iIVEKQvCr9QiaZs0WsSpgtL1HujR4+AUCx8qFF44vxkZfo ++JxF/sJCLo/xfiQ9c63Ae20+517FNnDjMu6O0EdG1mNejVzj7gg+VlM/yjkCIx3V +/ZAgzTelT4MhyVtBzMtXUZy5pjEcdPokpISgmKBpPrHrpRyErJ1N4DfpoPLmncp7 +Jgpm2ZH4sPNJT4VZz1i1tRV8hgvAqEJLvTyQVHCL3cG9y7pnE6k= +-----END CERTIFICATE----- diff --git a/third-party/pom.xml b/third-party/pom.xml index 66b0a48..598a038 100644 --- a/third-party/pom.xml +++ b/third-party/pom.xml @@ -34,7 +34,7 @@ <inceptionYear>2018</inceptionYear> <modules> + <module>linshare</module> <module>spamassassin</module> </modules> - </project> \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org