1
0
mirror of https://github.com/sismics/docs.git synced 2025-12-14 02:06:25 +00:00

19 Commits
v1.9 ... v1.10

Author SHA1 Message Date
bgamard
0a927fd320 add application/x-www-form-urlencoded to delete requests 2022-01-02 16:46:20 +01:00
bgamard
523501a592 consumes application/x-www-form-urlencoded 2022-01-02 16:40:01 +01:00
bgamard
ff8155be6a upgrade docker image to use jetty 9.4.36 2022-01-02 16:06:36 +01:00
bgamard
6c5d697051 Merge remote-tracking branch 'origin/master' 2022-01-02 15:39:11 +01:00
bgamard
b19145160e release 1.10 2022-01-02 15:39:00 +01:00
Roland Illig
c7ada71ef5 proofread German translation (#566)
* plural forms
* spelling of composed words
* spaces between numbers and measurement units
* typographic ellipsis (\u2026) instead of three dots
2021-11-20 20:34:36 +01:00
bgamard
4951229576 escape ngTranslate parameters 2021-11-16 20:01:36 +01:00
Julien Kirch
d98c1bddec Add custom parameter for exact search by title 2021-10-12 13:50:32 +02:00
Dan Schaper
b0d0e93364 Remove duplicate tesseact language and alphabetize (#579)
Signed-off-by: Dan Schaper <dan@glacialmagma.com>
2021-09-30 13:23:58 +02:00
Benjamin Gamard
f20a562439 remove form url encoded from baseresource 2021-08-20 10:45:08 +02:00
Hung Nguyen
4ae8475f5e Add Vietnamese language support (#549) 2021-06-21 10:51:31 +02:00
Benjamin Gamard
fd4c627c61 remove travis 2021-05-12 19:38:58 +02:00
Benjamin Gamard
a867d48232 remove travis 2021-05-12 19:38:45 +02:00
Somebodyisnobody
f6bf61fce9 Update de.json (#532)
Fix typo
2021-03-31 19:08:58 +02:00
bgamard
c60c9a8f74 Merge remote-tracking branch 'origin/master' 2021-02-12 21:54:33 +01:00
bgamard
dc021ab71e Closes #520: downgrade H2 to 1.4.199 2021-02-12 21:54:25 +01:00
Pascal Pischel
18b5551f6c Fix german translation 2021-02-12 21:48:57 +01:00
bgamard
6fcd8771a5 upgrade to java 11 + upgrade libraries 2021-01-25 22:40:58 +01:00
bgamard
1fef4c3d2e next dev iteration + cleanup stress project 2021-01-25 21:31:14 +01:00
35 changed files with 228 additions and 483 deletions

View File

@@ -1,33 +0,0 @@
sudo: required
dist: trusty
language: java
before_install:
- sudo add-apt-repository -y ppa:mc3man/trusty-media
- sudo apt-get -qq update
- sudo apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra tesseract-ocr-nld tesseract-ocr-tur tesseract-ocr-heb tesseract-ocr-hun tesseract-ocr-fin tesseract-ocr-swe tesseract-ocr-lav tesseract-ocr-dan tesseract-ocr-nor
- sudo apt-get -y -q install haveged && sudo service haveged start
after_success:
- |
if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
mvn -Pprod -DskipTests clean install
docker login -u $DOCKER_USER -p $DOCKER_PASS
export REPO=sismics/docs
export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH ; fi`
docker build -f Dockerfile -t $REPO:$COMMIT .
docker tag $REPO:$COMMIT $REPO:$TAG
docker tag $REPO:$COMMIT $REPO:travis-$TRAVIS_BUILD_NUMBER
docker push $REPO
cd docs-importer
export REPO=sismics/docs-importer
export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH ; fi`
docker build -f Dockerfile -t $REPO:$COMMIT .
docker tag $REPO:$COMMIT $REPO:$TAG
docker tag $REPO:$COMMIT $REPO:travis-$TRAVIS_BUILD_NUMBER
docker push $REPO
fi
env:
global:
- secure: LRGpjWORb0qy6VuypZjTAfA8uRHlFUMTwb77cenS9PPRBxuSnctC531asS9Xg3DqC5nsRxBBprgfCKotn5S8nBSD1ceHh84NASyzLSBft3xSMbg7f/2i7MQ+pGVwLncusBU6E/drnMFwZBleo+9M8Tf96axY5zuUp90MUTpSgt0=
- secure: bCDDR6+I7PmSkuTYZv1HF/z98ANX/SFEESUCqxVmV5Gs0zFC0vQXaPJQ2xaJNRop1HZBFMZLeMMPleb0iOs985smpvK2F6Rbop9Tu+Vyo0uKqv9tbZ7F8Nfgnv9suHKZlL84FNeUQZJX6vsFIYPEJ/r7K5P/M0PdUy++fEwxEhU=
- secure: ewXnzbkgCIHpDWtaWGMa1OYZJ/ki99zcIl4jcDPIC0eB3njX/WgfcC6i0Ke9mLqDqwXarWJ6helm22sNh+xtQiz6isfBtBX+novfRt9AANrBe3koCMUemMDy7oh5VflBaFNP0DVb8LSCnwf6dx6ZB5E9EB8knvk40quc/cXpGjY=
- COMMIT=${TRAVIS_COMMIT::8}

View File

@@ -1,7 +1,36 @@
FROM sismics/ubuntu-jetty:9.4.12-2 FROM sismics/ubuntu-jetty:9.4.36
MAINTAINER b.gamard@sismics.com LABEL maintainer="b.gamard@sismics.com"
RUN apt-get update && apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra tesseract-ocr-nld tesseract-ocr-tur tesseract-ocr-heb tesseract-ocr-hun tesseract-ocr-fin tesseract-ocr-swe tesseract-ocr-lav tesseract-ocr-dan tesseract-ocr-nor && \ RUN apt-get update && \
apt-get -y -q --no-install-recommends install \
ffmpeg \
mediainfo \
tesseract-ocr \
tesseract-ocr-ara \
tesseract-ocr-chi-sim \
tesseract-ocr-chi-tra \
tesseract-ocr-dan \
tesseract-ocr-deu \
tesseract-ocr-fin \
tesseract-ocr-fra \
tesseract-ocr-heb \
tesseract-ocr-hin \
tesseract-ocr-hun \
tesseract-ocr-ita \
tesseract-ocr-jpn \
tesseract-ocr-kor \
tesseract-ocr-lav \
tesseract-ocr-nld \
tesseract-ocr-nor \
tesseract-ocr-pol \
tesseract-ocr-por \
tesseract-ocr-rus \
tesseract-ocr-spa \
tesseract-ocr-swe \
tesseract-ocr-tha \
tesseract-ocr-tur \
tesseract-ocr-ukr \
tesseract-ocr-vie && \
apt-get clean && rm -rf /var/lib/apt/lists/* apt-get clean && rm -rf /var/lib/apt/lists/*
# Remove the embedded javax.mail jar from Jetty # Remove the embedded javax.mail jar from Jetty

View File

@@ -3,7 +3,6 @@
</h3> </h3>
[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
[![Build Status](https://secure.travis-ci.org/sismics/docs.png)](http://travis-ci.org/sismics/docs)
Teedy is an open source, lightweight document management system for individuals and businesses. Teedy is an open source, lightweight document management system for individuals and businesses.
@@ -63,7 +62,7 @@ A preconfigured Docker image is available, including OCR and media conversion to
**The default admin password is "admin". Don't forget to change it before going to production.** **The default admin password is "admin". Don't forget to change it before going to production.**
- Master branch, can be unstable. Not recommended for production use: `sismics/docs:latest` - Master branch, can be unstable. Not recommended for production use: `sismics/docs:latest`
- Latest stable version: `sismics/docs:v1.8` - Latest stable version: `sismics/docs:v1.10`
The data directory is `/data`. Don't forget to mount a volume on it. The data directory is `/data`. Don't forget to mount a volume on it.
@@ -106,7 +105,7 @@ version: '3'
services: services:
# Teedy Application # Teedy Application
teedy-server: teedy-server:
image: sismics/docs:v1.8 image: sismics/docs:v1.10
restart: unless-stopped restart: unless-stopped
ports: ports:
# Map internal port to host # Map internal port to host
@@ -129,7 +128,7 @@ version: '3'
services: services:
# Teedy Application # Teedy Application
teedy-server: teedy-server:
image: sismics/docs:v1.8 image: sismics/docs:v1.10
restart: unless-stopped restart: unless-stopped
ports: ports:
# Map internal port to host # Map internal port to host
@@ -185,8 +184,8 @@ Manual installation
#### Requirements #### Requirements
- Java 8 with the [Java Cryptography Extension](http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html) - Java 11
- Tesseract 3 or 4 for OCR - Tesseract 4 for OCR
- ffmpeg for video thumbnails - ffmpeg for video thumbnails
- mediainfo for video metadata extraction - mediainfo for video metadata extraction
- A webapp server like [Jetty](http://eclipse.org/jetty/) or [Tomcat](http://tomcat.apache.org/) - A webapp server like [Jetty](http://eclipse.org/jetty/) or [Tomcat](http://tomcat.apache.org/)
@@ -199,7 +198,7 @@ The latest release is downloadable here: <https://github.com/sismics/docs/releas
How to build Teedy from the sources How to build Teedy from the sources
---------------------------------- ----------------------------------
Prerequisites: JDK 8 with JCE, Maven 3, NPM, Grunt, Tesseract 3 or 4 Prerequisites: JDK 11, Maven 3, NPM, Grunt, Tesseract 4
Teedy is organized in several Maven modules: Teedy is organized in several Maven modules:

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.sismics.docs</groupId> <groupId>com.sismics.docs</groupId>
<artifactId>docs-parent</artifactId> <artifactId>docs-parent</artifactId>
<version>1.9</version> <version>1.10</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>
@@ -95,7 +95,6 @@
<dependency> <dependency>
<groupId>at.favre.lib</groupId> <groupId>at.favre.lib</groupId>
<artifactId>bcrypt</artifactId> <artifactId>bcrypt</artifactId>
<version>0.9.0</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@@ -43,7 +43,7 @@ public class Constants {
/** /**
* Supported document languages. * Supported document languages.
*/ */
public static final List<String> SUPPORTED_LANGUAGES = Lists.newArrayList("eng", "fra", "ita", "deu", "spa", "por", "pol", "rus", "ukr", "ara", "hin", "chi_sim", "chi_tra", "jpn", "tha", "kor", "nld", "tur", "heb", "hun", "fin", "swe", "lav", "dan", "nor"); public static final List<String> SUPPORTED_LANGUAGES = Lists.newArrayList("eng", "fra", "ita", "deu", "spa", "por", "pol", "rus", "ukr", "ara", "hin", "chi_sim", "chi_tra", "jpn", "tha", "kor", "nld", "tur", "heb", "hun", "fin", "swe", "lav", "dan", "nor", "vie");
/** /**
* Base URL environment variable. * Base URL environment variable.

View File

@@ -52,7 +52,7 @@ public class DocumentCriteria {
private List<List<String>> tagIdList; private List<List<String>> tagIdList;
/** /**
* Tag IDs to excluded. * Tag IDs to exclude.
* The first and second level list will be excluded. * The first and second level list will be excluded.
*/ */
private List<List<String>> excludedTagIdList; private List<List<String>> excludedTagIdList;
@@ -81,7 +81,12 @@ public class DocumentCriteria {
* MIME type of a file. * MIME type of a file.
*/ */
private String mimeType; private String mimeType;
/**
* The title.
*/
private String title;
public List<String> getTargetIdList() { public List<String> getTargetIdList() {
return targetIdList; return targetIdList;
} }
@@ -194,4 +199,12 @@ public class DocumentCriteria {
public void setMimeType(String mimeType) { public void setMimeType(String mimeType) {
this.mimeType = mimeType; this.mimeType = mimeType;
} }
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
} }

View File

@@ -86,7 +86,7 @@ public class WebhookAsyncListener {
} }
}); });
RequestBody body = RequestBody.create(JSON, "{\"event\": \"" + event.name() + "\", \"id\": \"" + id + "\"}"); RequestBody body = RequestBody.create("{\"event\": \"" + event.name() + "\", \"id\": \"" + id + "\"}", JSON);
for (String webhookUrl : webhookUrlList) { for (String webhookUrl : webhookUrlList) {
Request request = new Request.Builder() Request request = new Request.Builder()

View File

@@ -80,7 +80,7 @@ public class AppContext {
List<Class<? extends IndexingHandler>> indexingHandlerList = Lists.newArrayList( List<Class<? extends IndexingHandler>> indexingHandlerList = Lists.newArrayList(
new ClasspathScanner<IndexingHandler>().findClasses(IndexingHandler.class, "com.sismics.docs.core.util.indexing")); new ClasspathScanner<IndexingHandler>().findClasses(IndexingHandler.class, "com.sismics.docs.core.util.indexing"));
for (Class<? extends IndexingHandler> handlerClass : indexingHandlerList) { for (Class<? extends IndexingHandler> handlerClass : indexingHandlerList) {
IndexingHandler handler = handlerClass.newInstance(); IndexingHandler handler = handlerClass.getDeclaredConstructor().newInstance();
if (handler.accept()) { if (handler.accept()) {
indexingHandler = handler; indexingHandler = handler;
break; break;

View File

@@ -20,7 +20,7 @@ public class AuthenticationUtil {
.map(clazz -> { .map(clazz -> {
try { try {
return clazz.newInstance(); return clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -8,7 +8,6 @@ import com.sismics.docs.core.model.jpa.Config;
import com.sismics.docs.core.model.jpa.User; import com.sismics.docs.core.model.jpa.User;
import com.sismics.docs.core.util.ConfigUtil; import com.sismics.docs.core.util.ConfigUtil;
import com.sismics.util.ClasspathScanner; import com.sismics.util.ClasspathScanner;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.directory.api.ldap.model.cursor.EntryCursor; import org.apache.directory.api.ldap.model.cursor.EntryCursor;
import org.apache.directory.api.ldap.model.entry.Attribute; import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.Entry; import org.apache.directory.api.ldap.model.entry.Entry;
@@ -71,10 +70,7 @@ public class LdapAuthenticationHandler implements AuthenticationHandler {
config.setCredentials(ConfigUtil.getConfigStringValue(ConfigType.LDAP_ADMIN_PASSWORD)); config.setCredentials(ConfigUtil.getConfigStringValue(ConfigType.LDAP_ADMIN_PASSWORD));
DefaultLdapConnectionFactory factory = new DefaultLdapConnectionFactory(config); DefaultLdapConnectionFactory factory = new DefaultLdapConnectionFactory(config);
GenericObjectPool.Config poolConfig = new GenericObjectPool.Config(); pool = new LdapConnectionPool(new ValidatingPoolableLdapConnectionFactory(factory), null);
poolConfig.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_GROW;
poolConfig.maxWait = 500;
pool = new LdapConnectionPool(new ValidatingPoolableLdapConnectionFactory(factory), poolConfig);
} }
@Override @Override
@@ -114,7 +110,7 @@ public class LdapAuthenticationHandler implements AuthenticationHandler {
if (mailAttribute == null || mailAttribute.get() == null) { if (mailAttribute == null || mailAttribute.get() == null) {
user.setEmail(ConfigUtil.getConfigStringValue(ConfigType.LDAP_DEFAULT_EMAIL)); user.setEmail(ConfigUtil.getConfigStringValue(ConfigType.LDAP_DEFAULT_EMAIL));
} else { } else {
Value<?> value = mailAttribute.get(); Value value = mailAttribute.get();
user.setEmail(value.getString()); user.setEmail(value.getString());
} }
user.setStorageQuota(ConfigUtil.getConfigLongValue(ConfigType.LDAP_DEFAULT_STORAGE)); user.setStorageQuota(ConfigUtil.getConfigLongValue(ConfigType.LDAP_DEFAULT_STORAGE));

View File

@@ -3,6 +3,7 @@ package com.sismics.docs.core.util.format;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.sismics.util.ClasspathScanner; import com.sismics.util.ClasspathScanner;
import java.lang.reflect.InvocationTargetException;
import java.util.List; import java.util.List;
/** /**
@@ -26,12 +27,12 @@ public class FormatHandlerUtil {
public static FormatHandler find(String mimeType) { public static FormatHandler find(String mimeType) {
try { try {
for (Class<? extends FormatHandler> formatHandlerClass : FORMAT_HANDLERS) { for (Class<? extends FormatHandler> formatHandlerClass : FORMAT_HANDLERS) {
FormatHandler formatHandler = formatHandlerClass.newInstance(); FormatHandler formatHandler = formatHandlerClass.getDeclaredConstructor().newInstance();
if (formatHandler.accept(mimeType)) { if (formatHandler.accept(mimeType)) {
return formatHandler; return formatHandler;
} }
} }
} catch (InstantiationException | IllegalAccessException e) { } catch (Exception e) {
return null; return null;
} }

View File

@@ -9,7 +9,7 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor; import org.apache.poi.sl.extractor.SlideShowExtractor;
import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide; import org.apache.poi.xslf.usermodel.XSLFSlide;
@@ -50,7 +50,7 @@ public class PptxFormatHandler implements FormatHandler {
@Override @Override
public String extractContent(String language, Path file) throws Exception { public String extractContent(String language, Path file) throws Exception {
XMLSlideShow pptx = loadPPtxFile(file); XMLSlideShow pptx = loadPPtxFile(file);
return new XSLFPowerPointExtractor(pptx).getText(); return new SlideShowExtractor<>(pptx).getText();
} }
@Override @Override

View File

@@ -37,9 +37,9 @@ import org.apache.lucene.search.spell.LuceneDictionary;
import org.apache.lucene.search.suggest.Lookup; import org.apache.lucene.search.suggest.Lookup;
import org.apache.lucene.search.suggest.analyzing.FuzzySuggester; import org.apache.lucene.search.suggest.analyzing.FuzzySuggester;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.store.NIOFSDirectory;
import org.apache.lucene.store.NoLockFactory; import org.apache.lucene.store.NoLockFactory;
import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -116,7 +116,7 @@ public class LuceneIndexingHandler implements IndexingHandler {
} else if (luceneStorage.equals("FILE")) { } else if (luceneStorage.equals("FILE")) {
Path luceneDirectory = DirectoryUtil.getLuceneDirectory(); Path luceneDirectory = DirectoryUtil.getLuceneDirectory();
log.info("Using file Lucene storage: {}", luceneDirectory); log.info("Using file Lucene storage: {}", luceneDirectory);
directory = new SimpleFSDirectory(luceneDirectory, NoLockFactory.INSTANCE); directory = new NIOFSDirectory(luceneDirectory, NoLockFactory.INSTANCE);
} }
// Create an index writer // Create an index writer
@@ -295,6 +295,10 @@ public class LuceneIndexingHandler implements IndexingHandler {
criteriaList.add("d.DOC_UPDATEDATE_D <= :updateDateMax"); criteriaList.add("d.DOC_UPDATEDATE_D <= :updateDateMax");
parameterMap.put("updateDateMax", criteria.getUpdateDateMax()); parameterMap.put("updateDateMax", criteria.getUpdateDateMax());
} }
if (criteria.getTitle() != null) {
criteriaList.add("d.DOC_TITLE_C = :title");
parameterMap.put("title", criteria.getTitle());
}
if (criteria.getTagIdList() != null && !criteria.getTagIdList().isEmpty()) { if (criteria.getTagIdList() != null && !criteria.getTagIdList().isEmpty()) {
int index = 0; int index = 0;
for (List<String> tagIdList : criteria.getTagIdList()) { for (List<String> tagIdList : criteria.getTagIdList()) {

View File

@@ -1,6 +1,6 @@
package com.sismics.util; package com.sismics.util;
import org.jsoup.helper.StringUtil; import org.jsoup.internal.StringUtil;
import org.jsoup.nodes.Element; import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node; import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode; import org.jsoup.nodes.TextNode;
@@ -28,7 +28,7 @@ public class HtmlToPlainText {
} }
// the formatting rules, implemented in a breadth-first DOM traverse // the formatting rules, implemented in a breadth-first DOM traverse
private class FormattingVisitor implements NodeVisitor { static private class FormattingVisitor implements NodeVisitor {
private static final int maxWidth = 80; private static final int maxWidth = 80;
private int width = 0; private int width = 0;
private StringBuilder accum = new StringBuilder(); // holds the accumulated text private StringBuilder accum = new StringBuilder(); // holds the accumulated text
@@ -64,7 +64,7 @@ public class HtmlToPlainText {
return; // don't accumulate long runs of empty spaces return; // don't accumulate long runs of empty spaces
if (text.length() + width > maxWidth) { // won't fit, needs to wrap if (text.length() + width > maxWidth) { // won't fit, needs to wrap
String words[] = text.split("\\s+"); String[] words = text.split("\\s+");
for (int i = 0; i < words.length; i++) { for (int i = 0; i < words.length; i++) {
String word = words[i]; String word = words[i];
boolean last = i == words.length - 1; boolean last = i == words.length - 1;

View File

@@ -2,7 +2,6 @@ package com.sismics.util.jpa;
import com.sismics.docs.core.util.DirectoryUtil; import com.sismics.docs.core.util.DirectoryUtil;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Environment;
import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistry;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -34,7 +33,6 @@ public final class EMF {
try { try {
properties = getEntityManagerProperties(); properties = getEntityManagerProperties();
Environment.verifyProperties(properties);
ConfigurationHelper.resolvePlaceHolders(properties); ConfigurationHelper.resolvePlaceHolders(properties);
ServiceRegistry reg = new StandardServiceRegistryBuilder().applySettings(properties).build(); ServiceRegistry reg = new StandardServiceRegistryBuilder().applySettings(properties).build();

View File

@@ -137,7 +137,6 @@ public class TestFileUtil {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfUtil.convertToPdf(documentDto, Lists.newArrayList(file0, file1, file2, file3, file4, file5), true, true, 10, outputStream); PdfUtil.convertToPdf(documentDto, Lists.newArrayList(file0, file1, file2, file3, file4, file5), true, true, 10, outputStream);
Assert.assertTrue(outputStream.toByteArray().length > 0); Assert.assertTrue(outputStream.toByteArray().length > 0);
com.google.common.io.Files.write(outputStream.toByteArray(), new java.io.File("C:\\Users\\Jendib\\Downloads\\test.pdf"));
} }
} }
} }

View File

@@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<groupId>com.sismics.docs</groupId>
<artifactId>docs-parent</artifactId>
<version>1.9</version>
<relativePath>..</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>docs-stress</artifactId>
<packaging>jar</packaging>
<name>Docs Stress</name>
<dependencies>
<!-- Dependencies to Jersey -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
</dependency>
<!-- Depenedencies to Docs -->
<dependency>
<groupId>com.sismics.docs</groupId>
<artifactId>docs-web-common</artifactId>
</dependency>
<dependency>
<groupId>com.sismics.docs</groupId>
<artifactId>docs-web-common</artifactId>
<type>test-jar</type>
</dependency>
<!-- Other external dependencies -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project>

View File

@@ -1,135 +0,0 @@
package com.sismics.docs.stress;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.io.Resources;
import com.sismics.docs.rest.util.ClientUtil;
import com.sismics.util.filter.TokenBasedSecurityFilter;
import org.glassfish.jersey.client.ClientResponse;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.media.multipart.file.StreamDataBodyPart;
import org.junit.Assert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.json.JsonObject;
import javax.ws.rs.client.*;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response.Status;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
/**
* Stress app for Teedy.
*
* @author bgamard
*/
public class Main {
/**
* Logger.
*/
private static final Logger log = LoggerFactory.getLogger(Main.class);
private static final String API_URL = "http://localhost:9999/docs-web/api/";
private static final int USER_COUNT = 50;
private static final int DOCUMENT_PER_USER_COUNT = 2000;
private static final int TAG_PER_USER_COUNT = 20;
private static final int FILE_PER_DOCUMENT_COUNT = 10;
private static Client client = ClientBuilder.newClient();
private static Set<User> userSet = Sets.newHashSet();
/**
* Entry point.
*
* @param args Args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
log.info("Starting stress test...");
WebTarget resource = client.target(API_URL);
ClientUtil clientUtil = new ClientUtil(resource);
// Create users
for (int i = 0; i < USER_COUNT; i++) {
String username = generateString();
clientUtil.createUser(username);
userSet.add(new User(username, (clientUtil.login(username))));
log.info("Created user " + (i + 1) + "/" + USER_COUNT);
}
// Create tags for each user
int tagCreatedCount = 1;
for (User user : userSet) {
Invocation.Builder tagResource = resource.path("/tag").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, user.authToken);
for (int j = 0; j < TAG_PER_USER_COUNT; j++) {
Form form = new Form();
String name = generateString();
form.param("name", name);
form.param("color", "#ff0000");
JsonObject json = tagResource.put(Entity.form(form), JsonObject.class);
user.tagList.add(json.getString("id"));
log.info("Created tag " + (tagCreatedCount++) + "/" + TAG_PER_USER_COUNT * USER_COUNT);
}
}
// Create documents for each user
int documentCreatedCount = 1;
for (User user : userSet) {
for (int i = 0; i < DOCUMENT_PER_USER_COUNT; i++) {
long createDate = new Date().getTime();
Form form = new Form()
.param("title", generateString())
.param("description", generateString())
.param("tags", user.tagList.get(ThreadLocalRandom.current().nextInt(user.tagList.size()))) // Random tag
.param("language", "eng")
.param("create_date", Long.toString(createDate));
JsonObject json = resource.path("/document").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, user.authToken)
.put(Entity.form(form), JsonObject.class);
String documentId = json.getString("id");
log.info("Created document " + (documentCreatedCount++) + "/" + DOCUMENT_PER_USER_COUNT * USER_COUNT + " for user: " + user.username);
// Add files for each document
for (int j = 0; j < FILE_PER_DOCUMENT_COUNT; j++) {
try (InputStream is = Resources.getResource("empty.png").openStream()) {
StreamDataBodyPart streamDataBodyPart = new StreamDataBodyPart("file", is, "empty.png");
@SuppressWarnings("resource")
ClientResponse response = resource
.register(MultiPartFeature.class)
.path("/file").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, user.authToken)
.put(Entity.entity(new FormDataMultiPart().field("id", documentId).bodyPart(streamDataBodyPart),
MediaType.MULTIPART_FORM_DATA_TYPE), ClientResponse.class);
Assert.assertEquals(Status.OK, Status.fromStatusCode(response.getStatus()));
}
}
}
}
}
private static String generateString() {
return UUID.randomUUID().toString().replace("-", "");
}
private static class User {
String username;
List<String> tagList = Lists.newArrayList();
String authToken;
User(String username, String authToken) {
this.username = username;
this.authToken = authToken;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 921 B

View File

@@ -1,6 +0,0 @@
log4j.rootCategory=WARN, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{DATE} %p %l %m %n
log4j.logger.com.sismics=DEBUG

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.sismics.docs</groupId> <groupId>com.sismics.docs</groupId>
<artifactId>docs-parent</artifactId> <artifactId>docs-parent</artifactId>
<version>1.9</version> <version>1.10</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.sismics.docs</groupId> <groupId>com.sismics.docs</groupId>
<artifactId>docs-parent</artifactId> <artifactId>docs-parent</artifactId>
<version>1.9</version> <version>1.10</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>
@@ -209,54 +209,6 @@
</build> </build>
</profile> </profile>
<!-- Stress profile -->
<profile>
<id>stress</id>
<activation>
<property>
<name>env</name>
<value>stress</value>
</property>
</activation>
<build>
<resources>
<resource>
<directory>src/stress/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/config.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/stress/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/config.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<systemProperties>
<systemProperty>
<name>application.mode</name>
<value>dev</value>
</systemProperty>
</systemProperties>
<webApp>
<contextPath>/docs-web</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!-- Production profile --> <!-- Production profile -->
<profile> <profile>
<id>prod</id> <id>prod</id>

View File

@@ -8,8 +8,10 @@ import com.sismics.security.UserPrincipal;
import com.sismics.util.filter.SecurityFilter; import com.sismics.util.filter.SecurityFilter;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.security.Principal; import java.security.Principal;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -19,6 +21,7 @@ import java.util.Set;
* *
* @author jtremeaux * @author jtremeaux
*/ */
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public abstract class BaseResource { public abstract class BaseResource {
/** /**
* @apiDefine admin Admin * @apiDefine admin Admin

View File

@@ -598,6 +598,10 @@ public class DocumentResource extends BaseResource {
// New fulltext search criteria // New fulltext search criteria
fullQuery.add(params[1]); fullQuery.add(params[1]);
break; break;
case "title":
// New title criteria
documentCriteria.setTitle(params[1]);
break;
default: default:
fullQuery.add(criteria); fullQuery.add(criteria);
break; break;

View File

@@ -424,7 +424,7 @@ angular.module('docs',
// Configuring Angular Translate // Configuring Angular Translate
$translateProvider $translateProvider
.useSanitizeValueStrategy(null) .useSanitizeValueStrategy('escapeParameters')
.useStaticFilesLoader({ .useStaticFilesLoader({
prefix: 'locale/', prefix: 'locale/',
suffix: '.json?@build.date@' suffix: '.json?@build.date@'
@@ -462,6 +462,9 @@ angular.module('docs',
// Configuring $http to act like jQuery.ajax // Configuring $http to act like jQuery.ajax
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.defaults.headers.delete = {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
};
$httpProvider.defaults.transformRequest = [function(data) { $httpProvider.defaults.transformRequest = [function(data) {
var param = function(obj) { var param = function(obj) {
var query = ''; var query = '';
@@ -541,7 +544,8 @@ angular.module('docs',
{ key: 'swe', label: 'Svenska' }, { key: 'swe', label: 'Svenska' },
{ key: 'lav', label: 'Latviešu' }, { key: 'lav', label: 'Latviešu' },
{ key: 'dan', label: 'Dansk' }, { key: 'dan', label: 'Dansk' },
{ key: 'nor', label: 'Norsk' } { key: 'nor', label: 'Norsk' },
{ key: 'vie', label: 'Tiếng Việt' }
]; ];
}) })
/** /**

View File

@@ -56,7 +56,7 @@ angular.module('share',
// Configuring Angular Translate // Configuring Angular Translate
$translateProvider $translateProvider
.useSanitizeValueStrategy(null) .useSanitizeValueStrategy('escapeParameters')
.useStaticFilesLoader({ .useStaticFilesLoader({
prefix: 'locale/', prefix: 'locale/',
suffix: '.json?@build.date@' suffix: '.json?@build.date@'
@@ -88,6 +88,9 @@ angular.module('share',
// Configuring $http to act like jQuery.ajax // Configuring $http to act like jQuery.ajax
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.defaults.headers.delete = {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
};
$httpProvider.defaults.transformRequest = [function(data) { $httpProvider.defaults.transformRequest = [function(data) {
var param = function(obj) { var param = function(obj) {
var query = ''; var query = '';

View File

@@ -32,24 +32,24 @@
"nav_documents": "Dokumente", "nav_documents": "Dokumente",
"nav_tags": "Tags", "nav_tags": "Tags",
"nav_users_groups": "Benutzer & Gruppen", "nav_users_groups": "Benutzer & Gruppen",
"error_info": "{{ count }} neuer Fehler{{ count > 1 ? 's' : '' }}", "error_info": "{{ count }} {{ count > 1 ? 'neue' : 'neuer' }} Fehler",
"logged_as": "Eingeloggt als {{ username }}", "logged_as": "Eingeloggt als {{ username }}",
"nav_settings": "Einstellungen", "nav_settings": "Einstellungen",
"logout": "Logout", "logout": "Logout",
"global_quota_warning": "<strong>Warnung!</strong> Der frei zur Verfügung stehende, maximale Speicherplatz ist fast erreicht bei {{ current | number: 0 }}MB ({{ percent | number: 1 }}%) verwendet {{ total | number: 0 }}MB" "global_quota_warning": "<strong>Warnung!</strong> Der verfügbare Speicherplatz beträgt {{ total | number: 0 }}\u00A0MB, davon sind {{ current | number: 0 }}\u00A0MB ({{ percent | number: 1 }}\u00A0%) bereits verwendet"
}, },
"document": { "document": {
"navigation_up": "Eine Stufe höher", "navigation_up": "Eine Ebene höher",
"toggle_navigation": "Navigation ein-/ausblenden", "toggle_navigation": "Navigation ein-/ausblenden",
"display_mode_list": "Dokumente in Liste anzeigen", "display_mode_list": "Dokumente in Liste anzeigen",
"display_mode_grid": "Dokumente im Raster anzeigen", "display_mode_grid": "Dokumente im Raster anzeigen",
"search_simple": "Einfache Suche", "search_simple": "Einfache Suche",
"search_fulltext": "Volltext Suche", "search_fulltext": "Volltextsuche",
"search_creator": "Urheber", "search_creator": "Urheber",
"search_language": "Sprache", "search_language": "Sprache",
"search_before_date": "Vor diesem Datum", "search_before_date": "Vor diesem Datum",
"search_after_date": "Nach diesem Datum", "search_after_date": "Nach diesem Datum",
"search_before_update_date": "Bearbeitet bevor diesem Datum", "search_before_update_date": "Bearbeitet vor diesem Datum",
"search_after_update_date": "Bearbeitet nach diesem Datum", "search_after_update_date": "Bearbeitet nach diesem Datum",
"search_tags": "Tags", "search_tags": "Tags",
"search_shared": "Nur freigegebene Dokumente", "search_shared": "Nur freigegebene Dokumente",
@@ -83,9 +83,9 @@
"page_size_10": "10 pro Seite", "page_size_10": "10 pro Seite",
"page_size_20": "20 pro Seite", "page_size_20": "20 pro Seite",
"page_size_30": "30 pro Seite", "page_size_30": "30 pro Seite",
"upgrade_quota": "Fragen Sie Ihren Administrator, um Ihr Speicherplatz zu erweitern.", "upgrade_quota": "Fragen Sie Ihren Administrator, um Ihren Speicherplatz zu erweitern.",
"quota": "{{ current | number: 0 }}MB ({{ percent | number: 1 }}%) verwendet von {{ total | number: 0 }}MB", "quota": "{{ current | number: 0 }}\u00A0MB ({{ percent | number: 1 }}\u00A0%) verwendet von {{ total | number: 0 }}\u00A0MB",
"count": "{{ count }} Dokument{{ count > 1 ? 'e' : '' }} gefunden", "count": "{{ count }} {{ count > 1 ? 'Dokumente' : 'Dokument' }} gefunden",
"last_updated": "Zuletzt bearbeitet {{ date | timeAgo: dateFormat }}", "last_updated": "Zuletzt bearbeitet {{ date | timeAgo: dateFormat }}",
"view": { "view": {
"delete_comment_title": "Kommentar löschen", "delete_comment_title": "Kommentar löschen",
@@ -104,7 +104,7 @@
"add_comment": "Fügen sie einen Kommentar hinzu", "add_comment": "Fügen sie einen Kommentar hinzu",
"error_loading_comments": "Fehler beim Laden eines Kommentars", "error_loading_comments": "Fehler beim Laden eines Kommentars",
"workflow_current": "Aktueller Workflow-Status", "workflow_current": "Aktueller Workflow-Status",
"workflow_comment": "Fügen Sie einen Workflow Kommentar hinzu", "workflow_comment": "Fügen Sie einen Workflow-Kommentar hinzu",
"workflow_validated_title": "Workflow-Schritt validiert", "workflow_validated_title": "Workflow-Schritt validiert",
"workflow_validated_message": "Der Workflow-Schritt wurde erfolgreich validiert.", "workflow_validated_message": "Der Workflow-Schritt wurde erfolgreich validiert.",
"display_mode_list": "Dateien in Liste anzeigen", "display_mode_list": "Dateien in Liste anzeigen",
@@ -113,13 +113,13 @@
"content": "Inhalt", "content": "Inhalt",
"delete_file_title": "Datei löschen", "delete_file_title": "Datei löschen",
"delete_file_message": "Wollen Sie diese Datei wirklich löschen?", "delete_file_message": "Wollen Sie diese Datei wirklich löschen?",
"upload_pending": "Ausstehend...", "upload_pending": "Ausstehend\u2026",
"upload_progress": "Hochladen...", "upload_progress": "Hochladen\u2026",
"upload_error": "Fehler beim Hochladen", "upload_error": "Fehler beim Hochladen",
"upload_error_quota": "Maximaler Speicherplatz erreicht", "upload_error_quota": "Maximaler Speicherplatz erreicht",
"drop_zone": "Drag & Drop Dateien hierherziehen, um diese hochzuladen", "drop_zone": "Legen Sie Dateien hier ab, um sie hochzuladen",
"add_files": "Dateien hinzufügen", "add_files": "Dateien hinzufügen",
"file_processing_indicator": "Diese Datei wird gerade bearbeitet. Die Suche wird nicht verfügbar sein, bevor der Vorgang abgeschlossen ist.", "file_processing_indicator": "Diese Datei wird gerade verarbeitet. Die Suche ist erst verfügbar, wenn diese Verarbeitung abgeschlossen ist.",
"reprocess_file": "Diese Datei erneut verarbeiten", "reprocess_file": "Diese Datei erneut verarbeiten",
"upload_new_version": "Neue Version hochladen", "upload_new_version": "Neue Version hochladen",
"open_versions": "Versionshistorie anzeigen" "open_versions": "Versionshistorie anzeigen"
@@ -158,27 +158,27 @@
"title_placeholder": "Titel des Dokuments", "title_placeholder": "Titel des Dokuments",
"description_placeholder": "Zusammenfassung, Inhaltsverzeichnis oder Freitext", "description_placeholder": "Zusammenfassung, Inhaltsverzeichnis oder Freitext",
"new_files": "neue Dateien", "new_files": "neue Dateien",
"orphan_files": "+ {{ count }} Datei{{ count > 1 ? 's' : '' }}", "orphan_files": "+ {{ count }} {{ count > 1 ? 'Dateien' : 'Datei' }}",
"additional_metadata": "Weitere Metadaten", "additional_metadata": "Weitere Metadaten",
"subject_placeholder": "Schlüsselwörter, abstrakte Sätze oder Klassifizierungscodes", "subject_placeholder": "Schlüsselwörter, abstrakte Sätze oder Klassifizierungscodes",
"identifier_placeholder": "Eindeutiger Identifikator", "identifier_placeholder": "Eindeutiger Identifikator",
"publisher_placeholder": "Name der Person, Organisation oder Abteilung, von der aus das Dokument veröffentlicht wurde.", "publisher_placeholder": "Name der Person, Organisation oder Abteilung, von der aus das Dokument veröffentlicht wurde.",
"format_placeholder": "MIME-Typ oder physisches Format des Dokuments", "format_placeholder": "MIME-Typ oder physisches Format des Dokuments",
"source_placeholder": "Ressource, aus der das Dokument stammt", "source_placeholder": "Ressource, aus der das Dokument stammt",
"uploading_files": "Dateien hochladen..." "uploading_files": "Dateien hochladen\u2026"
}, },
"default": { "default": {
"upload_pending": "Ausstehend...", "upload_pending": "Ausstehend\u2026",
"upload_progress": "Lädt hoch...", "upload_progress": "Lädt hoch\u2026",
"upload_error": "Fehler beim Hochladen", "upload_error": "Fehler beim Hochladen",
"upload_error_quota": "Maximaler Speicherplatz erreicht", "upload_error_quota": "Maximaler Speicherplatz erreicht",
"quick_upload": "Schnelles Hochladen", "quick_upload": "Schnelles Hochladen",
"drop_zone": "Drag & Drop Dateien hierherziehen, um diese hochzuladen", "drop_zone": "Legen Sie Dateien hier ab, um sie hochzuladen",
"add_files": "Dateien hinzufügen", "add_files": "Dateien hinzufügen",
"add_new_document": "Neues Dokument hinzufügen", "add_new_document": "Neues Dokument hinzufügen",
"latest_activity": "Letzte Aktivitäten", "latest_activity": "Letzte Aktivitäten",
"footer_sismics": "Programmiert mit <span class=\"fas fa-heart\"></span> von <a href=\"https://www.sismics.com\" target=\"_blank\">Sismics</a>", "footer_sismics": "Programmiert mit <span class=\"fas fa-heart\"></span> von <a href=\"https://www.sismics.com\" target=\"_blank\">Sismics</a>",
"api_documentation": "API Dokumentation", "api_documentation": "API-Dokumentation",
"feedback": "Geben Sie uns Ihr Feedback", "feedback": "Geben Sie uns Ihr Feedback",
"workflow_document_list": "Mir zugeordnete Dokumente", "workflow_document_list": "Mir zugeordnete Dokumente",
"select_all": "Alle auswählen", "select_all": "Alle auswählen",
@@ -186,8 +186,8 @@
}, },
"pdf": { "pdf": {
"export_title": "Export als PDF", "export_title": "Export als PDF",
"export_metadata": "Export Metadaten", "export_metadata": "Metadaten exportieren",
"export_comments": "Export Kommentare", "export_comments": "Kommentare exportieren",
"fit_to_page": "Bild an Seite anpassen", "fit_to_page": "Bild an Seite anpassen",
"margin": "Rand", "margin": "Rand",
"millimeter": "mm" "millimeter": "mm"
@@ -200,17 +200,17 @@
}, },
"file": { "file": {
"view": { "view": {
"previous": "Vorheriges", "previous": "Vorherige",
"next": "Nächstes", "next": "Nächste",
"not_found": "Datei nicht gefunden" "not_found": "Datei nicht gefunden"
}, },
"edit": { "edit": {
"title": "Datei bearbeiten", "title": "Datei bearbeiten",
"name": "Dateinamen" "name": "Dateiname"
}, },
"versions": { "versions": {
"title": "Versionshistorie", "title": "Versionshistorie",
"filename": "Datiename", "filename": "Dateiname",
"mimetype": "Typ", "mimetype": "Typ",
"create_date": "Erstellungsdatum", "create_date": "Erstellungsdatum",
"version": "Version" "version": "Version"
@@ -223,17 +223,17 @@
"title": "Tags", "title": "Tags",
"message_1": "<strong>Tags</strong> sind Kategorien, die den Dokumenten zugeordnet sind.", "message_1": "<strong>Tags</strong> sind Kategorien, die den Dokumenten zugeordnet sind.",
"message_2": "Ein Dokument kann mit mehreren Tags versehen werden und ein Tag kann auf mehrere Dokumente angewendet werden.", "message_2": "Ein Dokument kann mit mehreren Tags versehen werden und ein Tag kann auf mehrere Dokumente angewendet werden.",
"message_3": "Unter Verwendung der <span class=\"glyphicon glyphicon-pencil\"></span> Schaltfläche können Sie die Berechtigungen für ein Tag bearbeiten.", "message_3": "Mit der <span class=\"glyphicon glyphicon-pencil\"></span>-Schaltfläche können Sie die Berechtigungen für ein Tag bearbeiten.",
"message_4": "Wenn ein Tag von einem anderen Benutzer oder einer anderen Gruppe gelesen werden kann, können die zugehörigen Dokumente auch von diesen Personen gelesen werden.", "message_4": "Wenn ein Tag von einem anderen Benutzer oder einer anderen Gruppe gelesen werden kann, können die zugehörigen Dokumente auch von diesen Personen gelesen werden.",
"message_5": "Kennzeichnen Sie z.B. Ihre Firmendokumente mit einem Tag <span class=\"label label-info\">MyCompany</span> und fügen Sie die Berechtigung <strong>Can read</strong> zu einer Gruppe hinzu <span class=\"btn btn-default\">employees</span>" "message_5": "Kennzeichnen Sie z.\u00A0B. Ihre Firmendokumente mit einem Tag <span class=\"label label-info\">MyCompany</span> und fügen Sie die Berechtigung <strong>Kann lesen</strong> zu einer Gruppe <span class=\"btn btn-default\">Mitarbeiter</span> hinzu"
}, },
"edit": { "edit": {
"delete_tag_title": "Tag löschen", "delete_tag_title": "Tag löschen",
"delete_tag_message": "Wollen Sie diesen Tag wirklich löschen?", "delete_tag_message": "Wollen Sie dieses Tag wirklich löschen?",
"name": "Name", "name": "Name",
"color": "Farbe", "color": "Farbe",
"parent": "Übergeordnet", "parent": "Übergeordnet",
"info": "Berechtigungen für dieses Tag werden auch auf Dokumente angewendet, die mit einem Tag versehen sind <span class=\"label label-info\" ng-style=\"{ 'background': color }\">{{ name }}</span>", "info": "Berechtigungen für dieses Tag werden auch auf Dokumente angewendet, die mit einem Tag <span class=\"label label-info\" ng-style=\"{ 'background': color }\">{{ name }}</span> versehen sind",
"circular_reference_title": "Zirkuläre Referenz", "circular_reference_title": "Zirkuläre Referenz",
"circular_reference_message": "Die Hierarchie der übergeordneten Tags bildet eine Schleife. Bitte wählen Sie ein anderes übergeordnetes Tag." "circular_reference_message": "Die Hierarchie der übergeordneten Tags bildet eine Schleife. Bitte wählen Sie ein anderes übergeordnetes Tag."
} }
@@ -250,7 +250,7 @@
"profile": { "profile": {
"groups": "Gruppen", "groups": "Gruppen",
"quota_used": "Benutzter Speicherplatz", "quota_used": "Benutzter Speicherplatz",
"percent_used": "{{ percent | number: 0 }}% genutzt", "percent_used": "{{ percent | number: 0 }}\u00A0% genutzt",
"related_links": "Weiterführende Links", "related_links": "Weiterführende Links",
"document_created": "Dokumente erstellt von {{ username }}", "document_created": "Dokumente erstellt von {{ username }}",
"edit_user": "Benutzer {{ username }} bearbeiten" "edit_user": "Benutzer {{ username }} bearbeiten"
@@ -258,8 +258,8 @@
}, },
"usergroup": { "usergroup": {
"search_groups": "In Gruppen suchen", "search_groups": "In Gruppen suchen",
"search_users": "In Benutzer suchen", "search_users": "In Benutzern suchen",
"you": "Eigenes Benutzerkonto!", "you": "Das sind Sie!",
"default": { "default": {
"title": "Benutzer und Gruppen", "title": "Benutzer und Gruppen",
"message": "Hier können Sie Informationen über Benutzer und Gruppen einsehen." "message": "Hier können Sie Informationen über Benutzer und Gruppen einsehen."
@@ -270,15 +270,15 @@
"menu_user_account": "Benutzerkonto", "menu_user_account": "Benutzerkonto",
"menu_two_factor_auth": "Zwei-Faktor-Authentifizierung", "menu_two_factor_auth": "Zwei-Faktor-Authentifizierung",
"menu_opened_sessions": "Geöffnete Sitzungen", "menu_opened_sessions": "Geöffnete Sitzungen",
"menu_file_importer": "Massen Datei Importer", "menu_file_importer": "Massen-Datei-Importer",
"menu_general_settings": "Generelle Einstellungen", "menu_general_settings": "Allgemeine Einstellungen",
"menu_workflow": "Workflows", "menu_workflow": "Workflows",
"menu_users": "Benutzerverwaltung", "menu_users": "Benutzerverwaltung",
"menu_groups": "Gruppenverwaltung", "menu_groups": "Gruppenverwaltung",
"menu_vocabularies": "Vokabulareinträge", "menu_vocabularies": "Vokabulareinträge",
"menu_configuration": "Einstellungen", "menu_configuration": "Einstellungen",
"menu_inbox": "Posteingang durchsuchen", "menu_inbox": "Posteingang durchsuchen",
"menu_metadata": "Benutzerdefinierte Metadaten", "menu_metadata": "Benutzerdefinierte Metadaten",
"menu_monitoring": "Überwachung", "menu_monitoring": "Überwachung",
"user": { "user": {
"title": "Benutzerverwaltung", "title": "Benutzerverwaltung",
@@ -290,13 +290,13 @@
"delete_user_title": "Benutzer löschen", "delete_user_title": "Benutzer löschen",
"delete_user_message": "Möchten Sie diesen Benutzer wirklich löschen? Alle zugehörigen Dokumente, Dateien und Tags werden gelöscht", "delete_user_message": "Möchten Sie diesen Benutzer wirklich löschen? Alle zugehörigen Dokumente, Dateien und Tags werden gelöscht",
"user_used_title": "Benutzer in Verwendung", "user_used_title": "Benutzer in Verwendung",
"user_used_message": "Dieser Benutzer wird im Workflow \"{{ name }}\" benutzt", "user_used_message": "Dieser Benutzer wird im Workflow \"{{ name }}\" benutzt",
"edit_user_failed_title": "Dieser Benutzer existiert bereits", "edit_user_failed_title": "Dieser Benutzer existiert bereits",
"edit_user_failed_message": "Dieser Benutzername wurde bereits von einem anderen Benutzer gewählt", "edit_user_failed_message": "Dieser Benutzername wurde bereits von einem anderen Benutzer gewählt",
"edit_user_title": "Bearbeiten \"{{ username }}\"", "edit_user_title": "Benutzer \"{{ username }}\" bearbeiten",
"add_user_title": "Neuen Benutzer hinzufügen", "add_user_title": "Neuen Benutzer hinzufügen",
"username": "Benutzername", "username": "Benutzername",
"email": "E-mail", "email": "E-Mail",
"groups": "Gruppen", "groups": "Gruppen",
"storage_quota": "Speicherkontingent", "storage_quota": "Speicherkontingent",
"storage_quota_placeholder": "Speicherkontingent (in MB)", "storage_quota_placeholder": "Speicherkontingent (in MB)",
@@ -304,8 +304,8 @@
"password_confirm": "Passwort (bestätigen)", "password_confirm": "Passwort (bestätigen)",
"disabled": "Deaktivierter Benutzer", "disabled": "Deaktivierter Benutzer",
"password_reset_btn": "Senden Sie eine E-Mail zum Zurücksetzen des Kennworts an diesen Benutzer", "password_reset_btn": "Senden Sie eine E-Mail zum Zurücksetzen des Kennworts an diesen Benutzer",
"password_lost_sent_title": "Passwort zurücksetzen Email gesendet", "password_lost_sent_title": "Passwort-zurücksetzen-E-Mail gesendet",
"password_lost_sent_message": "Passwort zurücksetzen Email an <strong>{{ username }}</strong> gesendet.", "password_lost_sent_message": "Passwort-zurücksetzen-E-Mail an <strong>{{ username }}</strong> gesendet.",
"disable_totp_btn": "Zwei-Faktor-Authentifizierung für diesen Benutzer deaktivieren", "disable_totp_btn": "Zwei-Faktor-Authentifizierung für diesen Benutzer deaktivieren",
"disable_totp_title": "Zwei-Faktor-Authentifizierung deaktivieren", "disable_totp_title": "Zwei-Faktor-Authentifizierung deaktivieren",
"disable_totp_message": "Sind Sie sicher, dass sie die Zwei-Faktor-Authentifizierung für den Benutzer deaktivieren möchten?" "disable_totp_message": "Sind Sie sicher, dass sie die Zwei-Faktor-Authentifizierung für den Benutzer deaktivieren möchten?"
@@ -319,7 +319,7 @@
"edit": { "edit": {
"delete_workflow_title": "Workflow löschen", "delete_workflow_title": "Workflow löschen",
"delete_workflow_message": "Möchten Sie diesen Workflow wirklich löschen? Derzeit ausgeführte Workflows werden nicht gelöscht", "delete_workflow_message": "Möchten Sie diesen Workflow wirklich löschen? Derzeit ausgeführte Workflows werden nicht gelöscht",
"edit_workflow_title": "Bearbeiten \"{{ name }}\"", "edit_workflow_title": "Workflow \"{{ name }}\" bearbeiten",
"add_workflow_title": "Neuen Workflow hinzufügen", "add_workflow_title": "Neuen Workflow hinzufügen",
"name": "Name", "name": "Name",
"name_placeholder": "Name des Bearbeitungschritts oder der Beschreibung", "name_placeholder": "Name des Bearbeitungschritts oder der Beschreibung",
@@ -328,8 +328,8 @@
"type_approve": "Genehmigen", "type_approve": "Genehmigen",
"type_validate": "Bestätigen", "type_validate": "Bestätigen",
"target": "Zugewiesen an", "target": "Zugewiesen an",
"target_help": "<strong>Zulassen:</strong> Überprüfen und fortsetzen des Workflows <br/><strong>Genehmigen:</strong> Übernehmen oder lehnen Sie die Überprüfung ab", "target_help": "<strong>Zulassen:</strong> Überprüfen und fortsetzen des Workflows<br/><strong>Genehmigen:</strong> Übernehmen oder lehnen Sie die Überprüfung ab",
"add_step": "Workflow Schritt hinzufügen", "add_step": "Workflow-Schritt hinzufügen",
"actions": "Was passiert danach?", "actions": "Was passiert danach?",
"remove_action": "Aktion entfernen", "remove_action": "Aktion entfernen",
"acl_info": "Nur hier definierte Benutzer und Gruppen können diesen Workflow für ein Dokument starten" "acl_info": "Nur hier definierte Benutzer und Gruppen können diesen Workflow für ein Dokument starten"
@@ -339,18 +339,18 @@
"enable_totp": "Zwei-Faktor-Authentifizierung aktivieren", "enable_totp": "Zwei-Faktor-Authentifizierung aktivieren",
"enable_totp_message": "Stellen Sie sicher, dass Sie eine TOTP-kompatible Anwendung auf Ihrem Telefon haben, die bereit ist, ein neues Konto hinzuzufügen.", "enable_totp_message": "Stellen Sie sicher, dass Sie eine TOTP-kompatible Anwendung auf Ihrem Telefon haben, die bereit ist, ein neues Konto hinzuzufügen.",
"title": "Zwei-Faktor-Authentifizierung", "title": "Zwei-Faktor-Authentifizierung",
"message_1": "Die Zwei-Faktor-Authentifizierung ermöglicht Ihnen eine weitere Absicherung Ihres {{ appName }} Benutzerkontos. Bevor Sie diese Funktion aktivieren, stellen Sie sicher, dass Sie eine TOTP-kompatible Anwendung auf Ihrem Telefon haben:", "message_1": "Die Zwei-Faktor-Authentifizierung ermöglicht Ihnen eine weitere Absicherung Ihres {{ appName }}-Benutzerkontos. Bevor Sie diese Funktion aktivieren, stellen Sie sicher, dass Sie eine TOTP-kompatible Anwendung auf Ihrem Telefon haben:",
"message_google_authenticator": "Für Android, iOS, und Blackberry: <a href=\"https://support.google.com/accounts/answer/1066447\" target=\"_blank\">Google Authenticator</a>", "message_google_authenticator": "Für Android, iOS, und Blackberry: <a href=\"https://support.google.com/accounts/answer/1066447\" target=\"_blank\">Google Authenticator</a>",
"message_duo_mobile": "Für Android und iOS: <a href=\"https://guide.duo.com/third-party-accounts\" target=\"_blank\">Duo Mobile</a>", "message_duo_mobile": "Für Android und iOS: <a href=\"https://guide.duo.com/third-party-accounts\" target=\"_blank\">Duo Mobile</a>",
"message_authenticator": "Für Windows Phone: <a href=\"https://www.microsoft.com/en-US/store/apps/Authenticator/9WZDNCRFJ3RJ\" target=\"_blank\">Authenticator</a>", "message_authenticator": "Für Windows Phone: <a href=\"https://www.microsoft.com/en-US/store/apps/Authenticator/9WZDNCRFJ3RJ\" target=\"_blank\">Authenticator</a>",
"message_2": "Diese Anwendungen generieren automatisch einen Validierungscode, der sich nach einer gewissen Zeitspanne ändert. Sie müssen diesen Validierungscode jedes Mal eingeben, wenn Sie sich bei {{ appName }} anmelden. </strong>.", "message_2": "Diese Anwendungen generieren automatisch einen Validierungscode, der sich nach einer gewissen Zeitspanne ändert. Sie müssen diesen Validierungscode jedes Mal eingeben, wenn Sie sich bei {{ appName }} anmelden</strong>.",
"secret_key": "Ihr geheimer Schlüssel lautet: <strong>{{ secret }}</strong>", "secret_key": "Ihr geheimer Schlüssel lautet: <strong>{{ secret }}</strong>",
"secret_key_warning": "Konfigurieren Sie Ihre TOTP-App jetzt mit diesem geheimen Schlüssel auf Ihrem Telefon. Sie können später nicht mehr darauf zugreifen.", "secret_key_warning": "Konfigurieren Sie Ihre TOTP-App jetzt mit diesem geheimen Schlüssel auf Ihrem Telefon. Sie können später nicht mehr auf diesen Schlüssel zugreifen.",
"totp_enabled_message": "Die Zwei-Faktor-Authentifizierung ist in Ihrem Konto aktiviert.<br/>Bei jeder Anmeldung auf <strong>{{ appName }}</strong>, werden Sie in Ihrer konfigurierten Telefon-App nach einem Bestätigungscode gefragt.<br/>Wenn Sie Ihr Telefon verlieren, können Sie sich nicht in Ihrem Konto anmelden, aber aktive Sitzungen ermöglichen es Ihnen, einen geheimen Schlüssel neu zu generieren.", "totp_enabled_message": "Die Zwei-Faktor-Authentifizierung ist in Ihrem Konto aktiviert.<br/>Bei jeder Anmeldung auf <strong>{{ appName }}</strong> werden Sie in Ihrer konfigurierten Telefon-App nach einem Bestätigungscode gefragt.<br/>Wenn Sie Ihr Telefon verlieren, können Sie sich nicht in Ihrem Konto anmelden, aber aktive Sitzungen ermöglichen es Ihnen, einen geheimen Schlüssel neu zu generieren.",
"disable_totp": { "disable_totp": {
"disable_totp": "Deaktivieren der Zwei-Faktor-Authentifizierung", "disable_totp": "Deaktivieren der Zwei-Faktor-Authentifizierung",
"message": "Ihr Konto wird nicht mehr durch die Zwei-Faktor-Authentifizierung geschützt.", "message": "Ihr Konto wird nicht mehr durch die Zwei-Faktor-Authentifizierung geschützt.",
"confirm_password": "Bestätigen Sie ihr Passwort", "confirm_password": "Bestätigen Sie Ihr Passwort",
"submit": "Deaktivieren der Zwei-Faktor-Authentifizierung" "submit": "Deaktivieren der Zwei-Faktor-Authentifizierung"
}, },
"test_totp": "Bitte geben Sie den auf Ihrem Telefon angezeigten Validierungscode ein:", "test_totp": "Bitte geben Sie den auf Ihrem Telefon angezeigten Validierungscode ein:",
@@ -365,13 +365,13 @@
"delete_group_title": "Gruppe löschen", "delete_group_title": "Gruppe löschen",
"delete_group_message": "Wollen Sie diese Gruppe wirklich löschen?", "delete_group_message": "Wollen Sie diese Gruppe wirklich löschen?",
"edit_group_failed_title": "Gruppe existiert bereits", "edit_group_failed_title": "Gruppe existiert bereits",
"edit_group_failed_message": "Dieser Gruppenname wird bereits von einer anderen Gruppe übernommen", "edit_group_failed_message": "Dieser Gruppenname wird bereits von einer anderen Gruppe verwendet",
"group_used_title": "Gruppe in Verwendung", "group_used_title": "Gruppe in Verwendung",
"group_used_message": "Diese Gruppe wird im Workflow \"{{ name }}\" verwendet", "group_used_message": "Diese Gruppe wird im Workflow \"{{ name }}\" verwendet",
"edit_group_title": "Bearbeiten \"{{ name }}\"", "edit_group_title": "Gruppe \"{{ name }}\" bearbeiten",
"add_group_title": "Neue Gruppe hinzufügen", "add_group_title": "Neue Gruppe hinzufügen",
"name": "Name", "name": "Name",
"parent_group": "Übergruppe", "parent_group": "Übergeordnete Gruppe",
"search_group": "Gruppe suchen", "search_group": "Gruppe suchen",
"members": "Mitglieder", "members": "Mitglieder",
"new_member": "Neue Mitglieder", "new_member": "Neue Mitglieder",
@@ -386,7 +386,7 @@
}, },
"config": { "config": {
"title_guest_access": "Gastzugang", "title_guest_access": "Gastzugang",
"message_guest_access": "Der Gastzugang ist ein Modus, in dem jeder auf {{appName}} ohne Kennwort zugreifen kann. <br/> Wie ein normaler Benutzer kann der Gastbenutzer nur auf seine Dokumente und diejenigen zugreifen, auf die er über Berechtigungen zugreifen kann.<br/>", "message_guest_access": "Der Gastzugang ist ein Modus, in dem jeder auf {{appName}} ohne Kennwort zugreifen kann.<br/>Wie ein normaler Benutzer kann der Gastbenutzer nur auf seine Dokumente und diejenigen zugreifen, auf die er über Berechtigungen zugreifen kann.<br/>",
"enable_guest_access": "Gastzugang aktivieren", "enable_guest_access": "Gastzugang aktivieren",
"disable_guest_access": "Gastzugang deaktivieren", "disable_guest_access": "Gastzugang deaktivieren",
"title_theme": "Aussehen anpassen", "title_theme": "Aussehen anpassen",
@@ -399,13 +399,13 @@
"logo": "Logo (quadratische Größe)", "logo": "Logo (quadratische Größe)",
"background_image": "Hintergrundbild", "background_image": "Hintergrundbild",
"uploading_image": "Bild hochladen...", "uploading_image": "Bild hochladen...",
"title_smtp": "SMTP Email Einstellungen <small>für das Zürucksetzen des Passworts</small>", "title_smtp": "SMTP-E-Mail-Einstellungen <small>für das Zurücksetzen des Passworts</small>",
"smtp_hostname": "SMTP Server", "smtp_hostname": "SMTP-Server",
"smtp_port": "SMTP Port", "smtp_port": "SMTP-Port",
"smtp_from": "Absender E-Mail", "smtp_from": "Absender-E-Mail",
"smtp_username": "SMTP Benutzername", "smtp_username": "SMTP-Benutzername",
"smtp_password": "SMTP Passwort", "smtp_password": "SMTP-Passwort",
"smtp_updated": "SMTP Konfiguration erfolgreich aktualisiert", "smtp_updated": "SMTP-Konfiguration erfolgreich aktualisiert",
"webhooks": "Webhooks", "webhooks": "Webhooks",
"webhooks_explain": "Webhooks werden aufgerufen, wenn das angegebene Ereignis eintritt. Die angegebene URL wird mit einer JSON-Payload gepostet, die den Ereignisnamen und die ID der betreffenden Ressource enthält.", "webhooks_explain": "Webhooks werden aufgerufen, wenn das angegebene Ereignis eintritt. Die angegebene URL wird mit einer JSON-Payload gepostet, die den Ereignisnamen und die ID der betreffenden Ressource enthält.",
"webhook_event": "Ereignisse", "webhook_event": "Ereignisse",
@@ -416,35 +416,35 @@
"metadata": { "metadata": {
"title": "Konfiguration benutzerdefinierter Metadaten", "title": "Konfiguration benutzerdefinierter Metadaten",
"message": "Hier können Sie Ihren Dokumenten benutzerdefinierte Metadaten wie eine interne Kennung oder ein Ablaufdatum hinzufügen. Bitte beachten Sie, dass der Metadatentyp nach der Erstellung nicht mehr geändert werden kann.", "message": "Hier können Sie Ihren Dokumenten benutzerdefinierte Metadaten wie eine interne Kennung oder ein Ablaufdatum hinzufügen. Bitte beachten Sie, dass der Metadatentyp nach der Erstellung nicht mehr geändert werden kann.",
"name": "Metadatensatz Name", "name": "Metadatensatz-Name",
"type": "Metadatensatz Typ" "type": "Metadatensatz-Typ"
}, },
"inbox": { "inbox": {
"title": "Posteingang durchsuchen", "title": "Posteingang durchsuchen",
"message": "Wenn Sie diese Funktion aktivieren, durchsucht das System den angegebenen Posteingang jede Minute nach <strong>ungelesenen</strong> E-Mails und importiert diese automatisch.<br/>Nach dem Import einer E-Mail wird diese als gelesen markiert.<br/>Folgen Sie den Links zu Konfigurationseinstellungen für <a href=\"https://support.google.com/mail/answer/7126229?hl=en\" target=\"_blank\">Gmail</a>, <a href=\"https://support.office.com/en-us/article/pop-imap-and-smtp-settings-for-outlook-com-d088b986-291d-42b8-9564-9c414e2aa040\" target=\"_blank\">Outlook.com</a>, <a href=\"https://help.yahoo.com/kb/SLN4075.html\" target=\"_blank\">Yahoo</a>.", "message": "Wenn Sie diese Funktion aktivieren, durchsucht das System den angegebenen Posteingang jede Minute nach <strong>ungelesenen</strong> E-Mails und importiert diese automatisch.<br/>Nach dem Import einer E-Mail wird diese als gelesen markiert.<br/>Folgen Sie den Links zu Konfigurationseinstellungen für <a href=\"https://support.google.com/mail/answer/7126229?hl=en\" target=\"_blank\">Gmail</a>, <a href=\"https://support.office.com/en-us/article/pop-imap-and-smtp-settings-for-outlook-com-d088b986-291d-42b8-9564-9c414e2aa040\" target=\"_blank\">Outlook.com</a>, <a href=\"https://help.yahoo.com/kb/SLN4075.html\" target=\"_blank\">Yahoo</a>.",
"enabled": "Durchsuchen des Posteingangs aktivieren", "enabled": "Durchsuchen des Posteingangs aktivieren",
"hostname": "IMAP Server", "hostname": "IMAP-Server",
"port": "IMAP Port (143 oder 993)", "port": "IMAP-Port (143 oder 993)",
"username": "IMAP Benutzername", "username": "IMAP-Benutzername",
"password": "IMAP Passwort", "password": "IMAP-Passwort",
"folder": "IMAP Ordner", "folder": "IMAP-Ordner",
"tag": "Folgenden Tag zu importierten Dokumenten hinzufügen", "tag": "Folgendes Tag zu importierten Dokumenten hinzufügen",
"test": "Konfiguration testen", "test": "Konfiguration testen",
"last_sync": "Letzte Synchronisation: {{ data.date | date: 'medium' }}, {{ data.count }} E-Mail(s){{ data.count > 1 ? 's' : '' }} importiert", "last_sync": "Letzte Synchronisation: {{ data.date | date: 'medium' }}, {{ data.count }} {{ data.count > 1 ? 'E-Mails' : 'E-Mail' }} importiert",
"test_success": "Die Verbindung zum Posteingang war erfolgreich ({{ count }} <strong>unread</strong> message{{ count > 1 ? 's' : '' }})", "test_success": "Die Verbindung zum Posteingang war erfolgreich ({{ count }} <strong>ungelesene</strong> {{ count > 1 ? 'Nachrichten' : 'Nachricht' }})",
"test_fail": "Beim Verbinden mit dem Posteingang ist ein Fehler aufgetreten, bitte überprüfen Sie die Einstellungen", "test_fail": "Beim Verbinden mit dem Posteingang ist ein Fehler aufgetreten, bitte überprüfen Sie die Einstellungen",
"saved": "IMAP Konfiguration erfolgreich gespeichert" "saved": "IMAP-Konfiguration erfolgreich gespeichert"
}, },
"monitoring": { "monitoring": {
"background_tasks": "Hintergrundaufgaben", "background_tasks": "Hintergrundaufgaben",
"queued_tasks": "Es gibt derzeit {{ count }} anstehende Tasks.", "queued_tasks": "Es gibt derzeit {{ count }} {{ count > 1 ? 'anstehende Aufgaben' : 'anstehende Aufgabe' }}.",
"queued_tasks_explain": "Dateiverarbeitung, Thumbnail-Erstellung, Index-Update, optische Zeichenerkennung sind Hintergrundaufgaben. Eine große Anzahl unbearbeiteter Aufgaben führt zu unvollständigen Suchergebnissen.", "queued_tasks_explain": "Dateiverarbeitung, Thumbnail-Erstellung, Index-Update, optische Zeichenerkennung sind Hintergrundaufgaben. Eine große Anzahl unbearbeiteter Aufgaben führt zu unvollständigen Suchergebnissen.",
"server_logs": "Server Logs", "server_logs": "Server-Logs",
"log_date": "Datum", "log_date": "Datum",
"log_tag": "Tag", "log_tag": "Tag",
"log_message": "Nachricht", "log_message": "Nachricht",
"indexing": "Indexierung", "indexing": "Indexierung",
"indexing_info": "Wenn Sie Unstimmigkeiten in den Suchergebnissen feststellen, können Sie versuchen, eine vollständige Neuindizierung durchzuführen. Die Suchergebnisse sind bis zum Abschluss dieser Operation unvollständig.", "indexing_info": "Wenn Sie Unstimmigkeiten in den Suchergebnissen feststellen, können Sie versuchen, eine vollständige Neuindizierung durchzuführen. Die Suchergebnisse sind bis zum Abschluss dieser Aufgabe unvollständig.",
"start_reindexing": "Vollständige Neuindizierung starten", "start_reindexing": "Vollständige Neuindizierung starten",
"reindexing_started": "Neuindizierung wurde gestartet, bitte warten Sie, bis es keine Hintergrundaufgaben mehr gibt." "reindexing_started": "Neuindizierung wurde gestartet, bitte warten Sie, bis es keine Hintergrundaufgaben mehr gibt."
}, },
@@ -469,14 +469,14 @@
"new_entry": "Neuer Eintrag" "new_entry": "Neuer Eintrag"
}, },
"fileimporter": { "fileimporter": {
"title": "Massen Datei Importer", "title": "Massen-Datei-Importer",
"advanced_users": "Für fortgeschrittene Benutzer!", "advanced_users": "Für fortgeschrittene Benutzer!",
"need_intro": "Wenn Sie:", "need_intro": "Wenn Sie:",
"need_1": "Ganze Verzeichnisse von Dateien auf einmal importieren möchten", "need_1": "Ganze Verzeichnisse von Dateien auf einmal importieren möchten",
"need_2": "Ein Verzeichnis nach neuen Dateien durchsuchen lassen und gefunden Dateien importieren lassen möchten", "need_2": "Ein Verzeichnis nach neuen Dateien durchsuchen lassen und gefunden Dateien importieren lassen möchten",
"line_1": "Gehen Sie zu <a href=\"https://github.com/sismics/docs/releases\">sismics/docs/releases</a> und laden Sie das Datei-Importer-Tool für Ihr System herunter.", "line_1": "Gehen Sie zu <a href=\"https://github.com/sismics/docs/releases\">sismics/docs/releases</a> und laden Sie das Datei-Importer-Tool für Ihr System herunter.",
"line_2": "Folgen Sie den <a href=\"https://github.com/sismics/docs/tree/master/docs-importer\">Anweisungen</a>, um das Import-Tool zu nutzen.", "line_2": "Folgen Sie den <a href=\"https://github.com/sismics/docs/tree/master/docs-importer\">Anweisungen</a>, um das Import-Tool zu nutzen.",
"line_3": "Ihre Dateien werden in <a href=\"#/document\">Modus 'Schnelles Hochladen'</a> importiert. Danach können Sie die Dateien weiterbearbeiten und Dokumenten zuordnen oder Dokumente erstellen.", "line_3": "Ihre Dateien werden im <a href=\"#/document\">Modus 'Schnelles Hochladen'</a> importiert. Danach können Sie die Dateien weiterbearbeiten und Dokumenten zuordnen oder Dokumente erstellen.",
"download": "Herunterladen", "download": "Herunterladen",
"instructions": "Anweisungen" "instructions": "Anweisungen"
} }
@@ -522,14 +522,14 @@
"Webhook": "Webhook" "Webhook": "Webhook"
}, },
"selectrelation": { "selectrelation": {
"typeahead": "Tippen Sie einen Dokumentnamen ein" "typeahead": "Geben Sie einen Dokumentnamen ein"
}, },
"selecttag": { "selecttag": {
"typeahead": "Tippen Sie einen Tagnamen ein" "typeahead": "Geben Sie einen Tagnamen ein"
}, },
"datepicker": { "datepicker": {
"current": "Heute", "current": "Heute",
"clear": "Bereinigen", "clear": "Leeren",
"close": "Erledigt" "close": "Erledigt"
} }
}, },
@@ -579,7 +579,7 @@
"onboarding": { "onboarding": {
"step1": { "step1": {
"title": "Das erste Mal?", "title": "Das erste Mal?",
"description": "Wenn Sie Teedy zum ersten Mal nutzen, klicken Sie auf die Schaltfläche Weiter. Andernfalls können Sie mich schließen." "description": "Wenn Sie Teedy zum ersten Mal nutzen, klicken Sie auf die Schaltfläche \"Weiter\". Andernfalls können Sie diese Box schließen."
}, },
"step2": { "step2": {
"title": "Dokumente", "title": "Dokumente",
@@ -599,12 +599,12 @@
} }
}, },
"yes": "Ja", "yes": "Ja",
"no": "Nein", "no": "Nein",
"ok": "OK", "ok": "OK",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"share": "Teilen", "share": "Teilen",
"unshare": "Nicht mehr teilen", "unshare": "Nicht mehr teilen",
"close": "Schliessen", "close": "Schließen",
"add": "Hinzufügen", "add": "Hinzufügen",
"open": "Öffnen", "open": "Öffnen",
"see": "Ansehen", "see": "Ansehen",
@@ -613,8 +613,8 @@
"edit": "Bearbeiten", "edit": "Bearbeiten",
"delete": "Löschen", "delete": "Löschen",
"rename": "Umbenennen", "rename": "Umbenennen",
"download": "Herunterladen", "download": "Herunterladen",
"loading": "Lädt...", "loading": "Lädt\u2026",
"send": "Absenden", "send": "Absenden",
"enabled": "Aktiviert", "enabled": "Aktiviert",
"disabled": "Deaktiviert" "disabled": "Deaktiviert"

View File

@@ -8,4 +8,5 @@ log4j.appender.MEMORY.size=1000
log4j.logger.com.sismics=INFO log4j.logger.com.sismics=INFO
log4j.logger.org.apache.pdfbox=ERROR log4j.logger.org.apache.pdfbox=ERROR
log4j.logger.org.glassfish.jersey.servlet.WebComponent=ERROR log4j.logger.org.glassfish.jersey.servlet.WebComponent=ERROR
log4j.logger.org.apache.directory=ERROR log4j.logger.org.apache.directory=ERROR
log4j.logger.org.odftoolkit=ERROR

View File

@@ -1,3 +0,0 @@
api.current_version=${project.version}
api.min_version=1.0
db.version=27

View File

@@ -1 +0,0 @@
\ugggg

View File

@@ -1,8 +0,0 @@
log4j.rootCategory=WARN, CONSOLE, MEMORY
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{DATE} %p %l %m %n
log4j.appender.MEMORY=com.sismics.util.log4j.MemoryAppender
log4j.appender.MEMORY.size=1000
log4j.logger.com.sismics=DEBUG

View File

@@ -143,7 +143,7 @@ public class TestDocumentResource extends BaseJerseyTest {
json = target().path("/document").request() json = target().path("/document").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, document3Token) .cookie(TokenBasedSecurityFilter.COOKIE_NAME, document3Token)
.put(Entity.form(new Form() .put(Entity.form(new Form()
.param("title", "My super title document 3") .param("title", "My_super_title_document_3")
.param("description", "My super description for document 3") .param("description", "My super description for document 3")
.param("language", "eng") .param("language", "eng")
.param("create_date", Long.toString(create3Date))), JsonObject.class); .param("create_date", Long.toString(create3Date))), JsonObject.class);
@@ -217,6 +217,7 @@ public class TestDocumentResource extends BaseJerseyTest {
Assert.assertEquals(1, searchDocuments("mime:image/png", document1Token)); Assert.assertEquals(1, searchDocuments("mime:image/png", document1Token));
Assert.assertEquals(0, searchDocuments("mime:empty/void", document1Token)); Assert.assertEquals(0, searchDocuments("mime:empty/void", document1Token));
Assert.assertEquals(1, searchDocuments("after:2010 before:2040-08 tag:super shared:yes lang:eng simple:title simple:description full:uranium", document1Token)); Assert.assertEquals(1, searchDocuments("after:2010 before:2040-08 tag:super shared:yes lang:eng simple:title simple:description full:uranium", document1Token));
Assert.assertEquals(1, searchDocuments("title:My_super_title_document_3", document3Token));
// Search documents (nothing) // Search documents (nothing)
Assert.assertEquals(0, searchDocuments("random", document1Token)); Assert.assertEquals(0, searchDocuments("random", document1Token));
@@ -228,6 +229,7 @@ public class TestDocumentResource extends BaseJerseyTest {
Assert.assertEquals(0, searchDocuments("before:2040-05-38", document1Token)); Assert.assertEquals(0, searchDocuments("before:2040-05-38", document1Token));
Assert.assertEquals(0, searchDocuments("tag:Nop", document1Token)); Assert.assertEquals(0, searchDocuments("tag:Nop", document1Token));
Assert.assertEquals(0, searchDocuments("lang:fra", document1Token)); Assert.assertEquals(0, searchDocuments("lang:fra", document1Token));
Assert.assertEquals(0, searchDocuments("title:Unknown title", document3Token));
// Get document 1 // Get document 1
json = target().path("/document/" + document1Id).request() json = target().path("/document/" + document1Id).request()

View File

@@ -1,8 +1,10 @@
package com.sismics.docs.rest.resource; package com.sismics.docs.rest.resource;
import javax.json.JsonObject; import javax.json.JsonObject;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
/** /**
@@ -23,6 +25,7 @@ public class ThirdPartyWebhookResource extends BaseResource {
* @return Response * @return Response
*/ */
@POST @POST
@Consumes(MediaType.APPLICATION_JSON)
public Response webhook(JsonObject request) { public Response webhook(JsonObject request) {
lastPayload = request; lastPayload = request;
return Response.ok().build(); return Response.ok().build();

View File

@@ -10,4 +10,6 @@ log4j.logger.com.sismics.util.jpa=ERROR
log4j.logger.org.hibernate=ERROR log4j.logger.org.hibernate=ERROR
log4j.logger.org.apache.pdfbox=INFO log4j.logger.org.apache.pdfbox=INFO
log4j.logger.com.mchange=ERROR log4j.logger.com.mchange=ERROR
log4j.logger.org.apache.directory=ERROR log4j.logger.org.apache.directory=ERROR
log4j.logger.org.glassfish.grizzly=ERROR
log4j.logger.org.odftoolkit=ERROR

78
pom.xml
View File

@@ -6,13 +6,13 @@
<groupId>com.sismics.docs</groupId> <groupId>com.sismics.docs</groupId>
<artifactId>docs-parent</artifactId> <artifactId>docs-parent</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>1.9</version> <version>1.10</version>
<name>Docs Parent</name> <name>Docs Parent</name>
<properties> <properties>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Dependencies version (external) --> <!-- Dependencies version (external) -->
@@ -20,48 +20,48 @@
<commons-lang.commons-lang.version>2.6</commons-lang.commons-lang.version> <commons-lang.commons-lang.version>2.6</commons-lang.commons-lang.version>
<commons-io.commons-io.version>2.6</commons-io.commons-io.version> <commons-io.commons-io.version>2.6</commons-io.commons-io.version>
<org.apache.commons.commons-email.version>1.5</org.apache.commons.commons-email.version> <org.apache.commons.commons-email.version>1.5</org.apache.commons.commons-email.version>
<org.freemarker.freemarker.version>2.3.28</org.freemarker.freemarker.version> <org.freemarker.freemarker.version>2.3.30</org.freemarker.freemarker.version>
<commons-dbcp.version>1.4</commons-dbcp.version> <commons-dbcp.version>1.4</commons-dbcp.version>
<com.google.guava.guava.version>28.2-jre</com.google.guava.guava.version> <com.google.guava.guava.version>30.1-jre</com.google.guava.guava.version>
<log4j.log4j.version>1.2.16</log4j.log4j.version> <log4j.log4j.version>1.2.17</log4j.log4j.version>
<org.slf4j.version>1.6.4</org.slf4j.version> <org.slf4j.version>1.7.30</org.slf4j.version>
<org.slf4j.jcl-over-slf4j.version>1.6.6</org.slf4j.jcl-over-slf4j.version> <org.slf4j.jcl-over-slf4j.version>1.7.30</org.slf4j.jcl-over-slf4j.version>
<org.slf4j.jul-to-slf4j.version>1.6.6</org.slf4j.jul-to-slf4j.version> <org.slf4j.jul-to-slf4j.version>1.7.30</org.slf4j.jul-to-slf4j.version>
<junit.junit.version>4.12</junit.junit.version> <junit.junit.version>4.13.1</junit.junit.version>
<com.h2database.h2.version>1.4.197</com.h2database.h2.version> <com.h2database.h2.version>1.4.199</com.h2database.h2.version>
<org.glassfish.jersey.version>2.27</org.glassfish.jersey.version> <org.glassfish.jersey.version>2.33</org.glassfish.jersey.version>
<org.glassfish.javax.json.version>1.1.3</org.glassfish.javax.json.version> <org.glassfish.javax.json.version>1.1.4</org.glassfish.javax.json.version>
<org.mindrot.jbcrypt>0.3m</org.mindrot.jbcrypt> <at.favre.lib.bcrypt.version>0.9.0</at.favre.lib.bcrypt.version>
<org.apache.lucene.version>7.5.0</org.apache.lucene.version> <org.apache.lucene.version>8.7.0</org.apache.lucene.version>
<org.imgscalr.imgscalr-lib.version>4.2</org.imgscalr.imgscalr-lib.version> <org.imgscalr.imgscalr-lib.version>4.2</org.imgscalr.imgscalr-lib.version>
<org.apache.pdfbox.pdfbox.version>2.0.12</org.apache.pdfbox.pdfbox.version> <org.apache.pdfbox.pdfbox.version>2.0.22</org.apache.pdfbox.pdfbox.version>
<org.bouncycastle.bcprov-jdk15on.version>1.61</org.bouncycastle.bcprov-jdk15on.version> <org.bouncycastle.bcprov-jdk15on.version>1.68</org.bouncycastle.bcprov-jdk15on.version>
<joda-time.joda-time.version>2.10</joda-time.joda-time.version> <joda-time.joda-time.version>2.10.9</joda-time.joda-time.version>
<org.hibernate.hibernate.version>5.3.7.Final</org.hibernate.hibernate.version> <org.hibernate.hibernate.version>5.4.27.Final</org.hibernate.hibernate.version>
<javax.servlet.javax.servlet-api.version>4.0.1</javax.servlet.javax.servlet-api.version> <javax.servlet.javax.servlet-api.version>4.0.1</javax.servlet.javax.servlet-api.version>
<fr.opensagres.xdocreport.version>2.0.1</fr.opensagres.xdocreport.version> <fr.opensagres.xdocreport.version>2.0.2</fr.opensagres.xdocreport.version>
<net.java.dev.jna.jna.version>4.2.1</net.java.dev.jna.jna.version> <net.java.dev.jna.jna.version>5.6.0</net.java.dev.jna.jna.version>
<com.twelvemonkeys.imageio.version>3.3.2</com.twelvemonkeys.imageio.version> <com.twelvemonkeys.imageio.version>3.6.2</com.twelvemonkeys.imageio.version>
<com.levigo.jbig2.levigo-jbig2-imageio.version>1.6.5</com.levigo.jbig2.levigo-jbig2-imageio.version> <com.levigo.jbig2.levigo-jbig2-imageio.version>2.0</com.levigo.jbig2.levigo-jbig2-imageio.version>
<com.github.jai-imageio.jai-imageio-jpeg2000.version>1.3.0</com.github.jai-imageio.jai-imageio-jpeg2000.version> <com.github.jai-imageio.jai-imageio-jpeg2000.version>1.4.0</com.github.jai-imageio.jai-imageio-jpeg2000.version>
<org.postgresql.postgresql.version>42.2.5</org.postgresql.postgresql.version> <org.postgresql.postgresql.version>42.2.18</org.postgresql.postgresql.version>
<org.subethamail.subethasmtp-wiser.version>1.2</org.subethamail.subethasmtp-wiser.version> <org.subethamail.subethasmtp-wiser.version>1.2</org.subethamail.subethasmtp-wiser.version>
<com.icegreen.greenmail.version>1.5.8</com.icegreen.greenmail.version> <com.icegreen.greenmail.version>1.5.8</com.icegreen.greenmail.version>
<com.sun.mail.javax.mail.version>1.6.2</com.sun.mail.javax.mail.version> <com.sun.mail.javax.mail.version>1.6.2</com.sun.mail.javax.mail.version>
<org.jsoup.jsoup.version>1.11.3</org.jsoup.jsoup.version> <org.jsoup.jsoup.version>1.13.1</org.jsoup.jsoup.version>
<com.squareup.okhttp3.okhttp.version>3.11.0</com.squareup.okhttp3.okhttp.version> <com.squareup.okhttp3.okhttp.version>4.9.0</com.squareup.okhttp3.okhttp.version>
<org.apache.directory.api.api-all.version>1.0.0</org.apache.directory.api.api-all.version> <org.apache.directory.api.api-all.version>2.0.1</org.apache.directory.api.api-all.version>
<org.eclipse.jetty.jetty-server.version>9.4.17.v20190418</org.eclipse.jetty.jetty-server.version> <org.eclipse.jetty.jetty-server.version>9.4.36.v20210114</org.eclipse.jetty.jetty-server.version>
<org.eclipse.jetty.jetty-webapp.version>9.4.17.v20190418</org.eclipse.jetty.jetty-webapp.version> <org.eclipse.jetty.jetty-webapp.version>9.4.36.v20210114</org.eclipse.jetty.jetty-webapp.version>
<org.eclipse.jetty.jetty-servlet.version>9.4.17.v20190418</org.eclipse.jetty.jetty-servlet.version> <org.eclipse.jetty.jetty-servlet.version>9.4.36.v20210114</org.eclipse.jetty.jetty-servlet.version>
<!-- Plugins version --> <!-- Plugins version -->
<org.apache.maven.plugins.maven-antrun-plugin.version>1.8</org.apache.maven.plugins.maven-antrun-plugin.version> <org.apache.maven.plugins.maven-antrun-plugin.version>3.0.0</org.apache.maven.plugins.maven-antrun-plugin.version>
<org.apache.maven.plugins.maven-jar-plugin.version>3.1.0</org.apache.maven.plugins.maven-jar-plugin.version> <org.apache.maven.plugins.maven-jar-plugin.version>3.2.0</org.apache.maven.plugins.maven-jar-plugin.version>
<org.apache.maven.plugins.maven-war-plugin.version>3.2.2</org.apache.maven.plugins.maven-war-plugin.version> <org.apache.maven.plugins.maven-war-plugin.version>3.3.1</org.apache.maven.plugins.maven-war-plugin.version>
<org.apache.maven.plugins.maven-surefire-plugin.version>2.22.1</org.apache.maven.plugins.maven-surefire-plugin.version> <org.apache.maven.plugins.maven-surefire-plugin.version>3.0.0-M5</org.apache.maven.plugins.maven-surefire-plugin.version>
<org.eclipse.jetty.jetty-maven-plugin.version>9.4.17.v20190418</org.eclipse.jetty.jetty-maven-plugin.version> <org.eclipse.jetty.jetty-maven-plugin.version>9.4.36.v20210114</org.eclipse.jetty.jetty-maven-plugin.version>
</properties> </properties>
<scm> <scm>
@@ -256,9 +256,9 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.mindrot</groupId> <groupId>at.favre.lib</groupId>
<artifactId>jbcrypt</artifactId> <artifactId>bcrypt</artifactId>
<version>${org.mindrot.jbcrypt}</version> <version>${at.favre.lib.bcrypt.version}</version>
</dependency> </dependency>
<dependency> <dependency>