The following document contains the results of Rat (Release Audit Tool).
***************************************************** Summary ------- Generated at: 2025-03-13T08:57:25+01:00 Notes: 40 Binaries: 554 Archives: 10 Standards: 9211 Apache Licensed: 7853 Generated Documents: 2 JavaDocs are generated, thus a license header is optional. Generated files do not require license headers. 1348 Unknown Licenses ***************************************************** Files with unapproved licenses: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_session_fixation.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/rcpt_with_starttls.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/authplain.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/data_with_starttls.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/helo.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/data_starts_with_starttls.test mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithPercentWildcardInMailboxName.test mpt/impl/imap-mailbox/core/src/main/resources/logback.xml mpt/impl/imap-mailbox/cassandra/src/test/resources/cassandra-driver.conf upgrade-instructions.md code-coverage-report/pom.xml CHANGELOG.md third-party/rspamd/docker-compose.yml third-party/rspamd/src/test/resources/rspamd-config/actions.conf third-party/rspamd/src/test/resources/rspamd-config/worker-controller.inc third-party/rspamd/src/test/resources/rspamd-config/antivirus.conf third-party/rspamd/src/test/resources/rspamd-config/redis.conf third-party/rspamd/src/test/resources/rspamd-config/statistic.conf third-party/rspamd/src/test/resources/mail/ham/ham1.eml third-party/rspamd/src/test/resources/mail/attachment/inlineVirusTextAttachment.eml third-party/rspamd/src/test/resources/mail/attachment/inlineNonVirusTextAttachment.eml third-party/rspamd/src/test/resources/mail/spam/phishing.eml third-party/rspamd/src/test/resources/mail/spam/spam8.eml third-party/rspamd/README.md third-party/rspamd/sample-configuration/extensions.properties third-party/rspamd/sample-configuration/worker-controller.inc third-party/rspamd/sample-configuration/antivirus.conf third-party/rspamd/sample-configuration/redis.conf third-party/rspamd/sample-configuration/statistic.conf third-party/rspamd/sample-configuration/rspamd.properties third-party/rspamd/docker-compose-distributed.yml third-party/elasticsearch/docker-compose.yml third-party/elasticsearch/conf/extensions.properties third-party/elasticsearch/conf/elasticsearch.properties third-party/elasticsearch/README.md third-party/clamav/docker-compose.yml third-party/clamav/src/test/resources/attachment/inlineVirusTextAttachment.eml third-party/clamav/src/test/resources/attachment/inlineNonVirusTextAttachment.eml third-party/clamav/README.md third-party/crowdsec/Dockerfile third-party/crowdsec/docker-compose.yml third-party/crowdsec/src/test/resources/crowdsec/collections/james.yaml third-party/crowdsec/src/test/resources/crowdsec/parsers/james-dictionary-attack.yaml third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml third-party/crowdsec/src/test/resources/crowdsec/parsers/james-auth.yaml third-party/crowdsec/src/test/resources/crowdsec/acquis.yaml third-party/crowdsec/src/test/resources/crowdsec/scenarios/james-bf-auth.yaml third-party/crowdsec/src/test/resources/crowdsec/scenarios/james-dictionary-attack.yaml third-party/crowdsec/src/test/resources/haproxy.cfg third-party/crowdsec/src/test/resources/log/james.log third-party/crowdsec/README.md third-party/crowdsec/sample-configuration/collections/james.yaml third-party/crowdsec/sample-configuration/parsers/james-dictionary-attack.yaml third-party/crowdsec/sample-configuration/parsers/syslog-logs.yaml third-party/crowdsec/sample-configuration/parsers/james-auth.yaml third-party/crowdsec/sample-configuration/extensions.properties third-party/crowdsec/sample-configuration/acquis.yaml third-party/crowdsec/sample-configuration/scenarios/james-bf-auth.yaml third-party/crowdsec/sample-configuration/scenarios/james-dictionary-attack.yaml third-party/crowdsec/sample-configuration/crowdsec.properties third-party/spamassassin/docker-compose.yml third-party/spamassassin/src/test/resources/eml/spam.eml third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham1 third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham3 third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham2 third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam2 third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam3 third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam1 third-party/spamassassin/sample-configuration/extensions.properties third-party/spamassassin/sample-configuration/spamassassin.properties event-sourcing/event-sourcing-core/event-sourcing-core.iml backends-common/opensearch/src/test/resources/auth-es/nginx-conf/reverse_elasticsearch.conf backends-common/opensearch/src/test/resources/auth-es/nginx-conf/passwd backends-common/opensearch/src/test/resources/auth-es/NginxDockerfile backends-common/opensearch/src/test/resources/auth-es/README.md backends-common/opensearch/src/test/resources/auth-es/default.key backends-common/opensearch/src/test/resources/auth-es/default.crt backends-common/rabbitmq/src/test/resources/empty-store backends-common/redis/src/test/resources/sentinel_tls.conf backends-common/redis/src/test/resources/sentinel.conf backends-common/redis/src/test/resources/redis_cluster.conf backends-common/redis/src/test/resources/private.key backends-common/redis/src/test/resources/rootCA.crt backends-common/redis/src/test/resources/certificate.crt backends-common/redis/pom.xml backends-common/README.adoc backends-common/cassandra/src/test/resources/cassandra-driver.conf backends-common/cassandra/src/test/resources/configuration-reader-test/cassandra.properties README.adoc src/site/resources/server/rfclist/smtp/rfc1985.txt src/site/resources/server/rfclist/smtp/rfc2554.txt src/site/resources/server/rfclist/smtp/rfc1652.txt src/site/resources/server/rfclist/smtp/rfc1830.txt src/site/resources/server/rfclist/smtp/rfc2142.txt src/site/resources/server/rfclist/smtp/rfc2034.txt src/site/resources/server/rfclist/smtp/rfc1891.txt src/site/resources/server/rfclist/smtp/rfc0974.txt src/site/resources/server/rfclist/smtp/rfc2821.txt src/site/resources/server/rfclist/smtp/rfc1870.txt src/site/resources/server/rfclist/smtp/rfc2197.txt src/site/resources/server/rfclist/smtp/rfc0821.txt src/site/resources/server/rfclist/smtp/rfc1869.txt src/site/resources/server/rfclist/smtp/rfc1893.txt src/site/resources/server/rfclist/smtp/rfc6710.txt src/site/resources/server/rfclist/lmtp/rfc2033.txt src/site/resources/server/rfclist/imap4/rfc2087.txt src/site/resources/server/rfclist/imap4/rfc2221.txt src/site/resources/server/rfclist/imap4/rfc2193.txt src/site/resources/server/rfclist/imap4/rfc2192.txt src/site/resources/server/rfclist/imap4/rfc2088.txt src/site/resources/server/rfclist/imap4/rfc2060.txt src/site/resources/server/rfclist/imap4/rfc2086.txt src/site/resources/server/rfclist/imap4/rfc2342.txt src/site/resources/server/rfclist/imap4/rfc2595.txt src/site/resources/server/rfclist/imap4/rfc2195.txt src/site/resources/server/rfclist/imap4/rfc2180.txt src/site/resources/server/rfclist/imap4/rfc5256.txt src/site/resources/server/rfclist/imap4/rfc2177.txt src/site/resources/server/rfclist/imap4/rfc2683.txt src/site/resources/server/rfclist/imap4/rfc2359.txt src/site/resources/server/rfclist/imap4/rfc1731.txt src/site/resources/server/rfclist/pop3/rfc1725.txt src/site/resources/server/rfclist/pop3/rfc1939.txt src/site/resources/server/rfclist/pop3/rfc1734.txt src/site/resources/server/rfclist/ldap/rfc2830.txt src/site/resources/server/rfclist/ldap/rfc2255.txt src/site/resources/server/rfclist/ldap/rfc2252.txt src/site/resources/server/rfclist/ldap/rfc3377.txt src/site/resources/server/rfclist/ldap/rfc2256.txt src/site/resources/server/rfclist/ldap/rfc2253.txt src/site/resources/server/rfclist/ldap/rfc2829.txt src/site/resources/server/rfclist/ldap/rfc2254.txt src/site/resources/server/rfclist/ldap/rfc2251.txt src/site/resources/server/rfclist/basic/rfc0822.txt src/site/resources/server/rfclist/basic/rfc2046.txt src/site/resources/server/rfclist/basic/rfc2822.txt src/site/resources/server/rfclist/basic/rfc1123.txt src/site/resources/server/rfclist/basic/rfc2045.txt src/site/markdown/server/manage-guice-distributed-james.md src/site/markdown/server/manage-cli.md src/site/markdown/server/install/guice-cassandra-rabbitmq-s3.md src/site/markdown/server/install/guice-cassandra.md src/site/markdown/server/install/guice-jpa.md src/site/markdown/server/install/guice-jpa-smtp.md src/site/markdown/server/manage-webadmin.md src/site/markdown/mailet/release-notes.md src/site/markdown/mailet/quickstart.md src/homepage/about.md src/homepage/Gemfile.lock src/homepage/images/james-alt.svg src/homepage/images/james.svg src/homepage/_posts/2007-09-16-jspf-0.9.5.markdown src/homepage/_posts/2019-03-26-james-3.3.0.markdown src/homepage/_posts/2022-01-26-james-3.6.2.markdown src/homepage/_posts/2011-12-07-protocols-1.6.0-RC1.markdown src/homepage/_posts/2009-07-17-jMPT-0.1.markdown src/homepage/_posts/2023-06-20-fail2ban.markdown src/homepage/_posts/2007-04-05-JAMES-2.3.1-RC1.markdown src/homepage/_posts/2022-08-26-james-3.7.1.markdown src/homepage/_posts/2006-09-03-JSPF-0.9-b3.markdown src/homepage/_posts/2022-10-28-jspf-1.0.2.markdown src/homepage/_posts/2011-02-06-protocols-1.5.markdown src/homepage/_posts/2009-05-16-Mailet-crypto-0.1.markdown src/homepage/_posts/2012-01-07-mime4j-0.7.2.markdown src/homepage/_posts/2024-03-05-mime4j-0.8.11.markdown src/homepage/_posts/2007-04-15-JAMES-2.3.1.markdown src/homepage/_posts/2010-06-02-mailet-base-1.1.markdown src/homepage/_posts/2016-01-08-module-merge.markdown src/homepage/_posts/2016-02-08-moving-to-git.markdown src/homepage/_posts/2022-03-01-james-3.7.0.markdown src/homepage/_posts/2016-10-19-james-3.0.markdown src/homepage/_posts/2017-06-23-jsieve-0.7.markdown src/homepage/_posts/2024-06-07-jspf-1.0.4.markdown src/homepage/_posts/2018-05-07-mime4j-0.8.2.markdown src/homepage/_posts/2012-04-08-James-3.0-beta4.markdown src/homepage/_posts/2007-01-03-Mailet-api.markdown src/homepage/_posts/2025-03-03-jspf-1.0.5.markdown src/homepage/_posts/2007-05-15-mailet-api-lives.markdown src/homepage/_posts/2009-06-16-jsieve-03.markdown src/homepage/_posts/2016-11-19-james-3.0.markdown src/homepage/_posts/2019-08-30-latest-image-changes.markdown src/homepage/_posts/2015-10-08-james-2.3.1.markdown src/homepage/_posts/2011-01-06-imap-mailbox-0.2.markdown src/homepage/_posts/2011-11-07-jspf-1.0.0.markdown src/homepage/_posts/2021-12-02-james-3.6.1.markdown src/homepage/_posts/2021-09-21-james-joinsapachecon.markdown src/homepage/_posts/2017-10-02-BlogPostInstallingJames.markdown src/homepage/_posts/2022-10-07-jdkim-0.3.markdown src/homepage/_posts/2011-10-07-mime4j-0.7.1.markdown src/homepage/_posts/2010-05-01-mailet-1.0.markdown src/homepage/_posts/2019-03-19-mime4j-0.8.3.markdown src/homepage/_posts/2016-05-09-jmap.markdown src/homepage/_posts/2009-01-16-MAILET-2.4.markdown src/homepage/_posts/2006-10-03-JAMES-2.3.markdown src/homepage/_posts/2012-01-08-protocols-1.6.1.markdown src/homepage/_posts/2019-09-05-james-3.4.0.markdown src/homepage/_posts/2007-02-04-JSPF-0.9-beta4.markdown src/homepage/_posts/2009-10-17-jdkim.markdown src/homepage/_posts/2007-05-16-mime4j-0.3.markdown src/homepage/_posts/2020-07-16-james-3.5.0.markdown src/homepage/_posts/2011-03-06-jspf-0.9.9.markdown src/homepage/_posts/2009-03-16-Mime4j-0.6.markdown src/homepage/_posts/2010-05-02-jsieve-0.4.markdown src/homepage/_posts/2018-06-06-linagora-june-nl.markdown src/homepage/_posts/2024-01-08-mime4j-0.8.10.markdown src/homepage/_posts/2007-02-03-feathercast-fetures.markdown src/homepage/_posts/2018-11-14-james-3.2.0.markdown src/homepage/_posts/2010-12-06-protocols-1.2.markdown src/homepage/_posts/2025-01-29-james-3.7.6.markdown src/homepage/_posts/2010-11-06-james-3.0-M2.markdown src/homepage/_posts/2023-05-17-james-3.8.0.markdown src/homepage/_posts/2017-10-03-Hacktoberfest.markdown src/homepage/_posts/2016-07-09-jmap.markdown src/homepage/_posts/2008-10-16-mime4j-0.5.markdown src/homepage/_posts/2022-10-06-james-3.7.2.markdown src/homepage/_posts/2007-04-04-james-commiters-guidelines.markdown src/homepage/_posts/2022-12-30-james-3.7.3.markdown src/homepage/_posts/2009-02-16-MAILET-docs-plugin-0.1.markdown src/homepage/_posts/2015-09-08-james-2.3.1.markdown src/homepage/_posts/2020-10-29-testing-james-with-jmeter.markdown src/homepage/_posts/2009-06-17-jspf-0.9.7.markdown src/homepage/_posts/2010-09-04-imap-0.2-M1.markdown src/homepage/_posts/2023-03-20-james-3.7.4.markdown src/homepage/_posts/2009-08-17-james-2.3.2.markdown src/homepage/_posts/2018-01-26-admin-features.markdown src/homepage/_posts/2011-04-06-mime4J-0.7.markdown src/homepage/_posts/2017-07-20-james-3.0.markdown src/homepage/_posts/2017-05-16-mime4j-0.8.1.markdown src/homepage/_posts/2008-08-17-JSIEVE-0.2.markdown src/homepage/_posts/2010-11-05-james-3.0-M1.markdown src/homepage/_posts/2021-04-21-mime4j-0.8.4.markdown src/homepage/_posts/2022-12-30-mime4j-0.8.9.markdown src/homepage/_posts/2011-08-06-james-beta3.markdown src/homepage/_posts/2018-02-12-gsoc-2018.markdown src/homepage/_posts/2021-09-26-mime4j-0.8.6.markdown src/homepage/_posts/2016-07-19-jmap.markdown src/homepage/_posts/2008-03-16-gsoc-2008.markdown src/homepage/_posts/2019-11-19-apache-con-eu.markdown src/homepage/_posts/2011-05-06-jdKim0.2.markdown src/homepage/_posts/2009-09-17-hupa.markdown src/homepage/_posts/2010-06-03-jspf-0.9.8.markdown src/homepage/_posts/2022-10-28-mime4j-0.8.8.markdown src/homepage/_posts/2010-09-03-protocols-1.2-M2.markdown src/homepage/_posts/2021-03-16-james-3.6.0.markdown src/homepage/_posts/2016-09-19-james-3.0.markdown src/homepage/_posts/2022-04-01-mime4j-0.8.7.markdown src/homepage/_posts/2022-10-28-jsieve-0.8.markdown src/homepage/_posts/2009-04-16-Mailet-base-0.1.markdown src/homepage/_posts/2018-07-31-james-3.1.0.markdown src/homepage/_posts/2006-08-02-james-website-updates.markdown src/homepage/_posts/2008-08-16-mime4j-0.4.markdown src/homepage/_posts/2012-06-08-hupa-0.2.markdown src/homepage/_posts/2024-01-09-james-3.7.5.markdown src/homepage/_posts/2016-02-09-jmap.markdown src/homepage/_posts/2024-12-23-mime4j-0.8.12.markdown src/homepage/_posts/2024-01-09-james-3.8.1.markdown src/homepage/_posts/2012-01-07-protocols-1.6.0.markdown src/homepage/_posts/2021-07-02-mime4j-0.8.5.markdown src/homepage/_posts/2006-08-03-2.3.0-RC3.markdown src/homepage/_posts/2011-10-06-protocols-1.6-beta2.markdown src/homepage/_posts/2017-10-20-james-3.0.1.markdown src/homepage/_posts/2025-03-04-jdKim0.4.markdown src/homepage/_posts/2017-05-16-james-3.0.0-rc1.markdown src/homepage/_posts/2008-04-16-jspf-0.9.6.markdown src/homepage/_posts/2025-01-29-james-3.8.2.markdown src/homepage/_posts/2012-12-08-mailet-2.5.0.markdown src/homepage/_posts/2006-07-02-2.3.0on-the-way.markdown src/homepage/_config.yml src/homepage/assets/css/font-awesome.min.css src/homepage/assets/css/main.css src/homepage/assets/css/lity.min.css src/homepage/assets/css/ie8.css src/homepage/assets/css/ie9.css src/homepage/assets/css/test.html src/homepage/assets/css/lightbox.css src/homepage/assets/fonts/fontawesome-webfont.svg src/homepage/assets/js/main.js src/homepage/assets/js/github-fetch.js src/homepage/assets/js/jquery.min.js src/homepage/assets/js/lightbox.js src/homepage/assets/js/ie/PIE.htc src/homepage/assets/js/ie/respond.min.js src/homepage/assets/js/ie/html5shiv.js src/homepage/assets/js/jquery.scrolly.min.js src/homepage/assets/js/skel.min.js src/homepage/assets/js/lity.min.js src/homepage/assets/js/util.js src/homepage/assets/js/jquery.scrollex.min.js src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_syntax-highlighting.scssc src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_base.scssc src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_layout.scssc src/homepage/.sass-cache/0d97c95486dbfb22208e2f940de32f180caddfba/minima.scssc src/homepage/_site/about.md src/homepage/_site/images/james-alt.svg src/homepage/_site/images/james.svg src/homepage/_site/assets/main.css src/homepage/_site/assets/main.css.map src/homepage/_site/assets/css/font-awesome.min.css src/homepage/_site/assets/css/main.css src/homepage/_site/assets/css/lity.min.css src/homepage/_site/assets/css/ie8.css src/homepage/_site/assets/css/ie9.css src/homepage/_site/assets/css/test.html src/homepage/_site/assets/css/lightbox.css src/homepage/_site/assets/minima-social-icons.svg src/homepage/_site/assets/fonts/fontawesome-webfont.svg src/homepage/_site/assets/js/main.js src/homepage/_site/assets/js/github-fetch.js src/homepage/_site/assets/js/jquery.min.js src/homepage/_site/assets/js/lightbox.js src/homepage/_site/assets/js/ie/PIE.htc src/homepage/_site/assets/js/ie/respond.min.js src/homepage/_site/assets/js/ie/html5shiv.js src/homepage/_site/assets/js/jquery.scrolly.min.js src/homepage/_site/assets/js/skel.min.js src/homepage/_site/assets/js/lity.min.js src/homepage/_site/assets/js/util.js src/homepage/_site/assets/js/jquery.scrollex.min.js src/homepage-docker/Dockerfile src/homepage-docker/compile.sh src/site-docker/Dockerfile src/site-docker/compile.sh src/adr/0026-removing-configured-additional-mailboxListeners.md src/adr/0032-distributed-mail-queue-cleanup.md src/adr/0007-distributed-task-cancellation.md src/adr/0043-avoid-elasticsearch-on-critical-reads.md src/adr/0068-mutualize-cassandra-storge-for-quota.md src/adr/0066-modular-user-data-deletion.md src/adr/0039-distributed-blob-garbage-collector.md src/adr/0030-separate-attachment-content-and-metadata.md src/adr/0055-rspamd-spam-filtering.md src/adr/0044-against-the-use-of-cassandra-lightweight-transactions.md src/adr/0050-jmap-web-push.md src/adr/0002-make-taskmanager-distributed.md src/adr/0012-jmap-partial-reads.md src/adr/0038-distributed-eventbus.md src/adr/0031-distributed-mail-queue.md src/adr/0004-distributed-tasks-listing.md src/adr/0027-eventBus-error-handling-upon-dispatch.md src/adr/0021-cassandra-acl-inconsistency.md src/adr/0023-cassandra-mailbox-counters-inconsistencies.md src/adr/0063-temporary-file-leaks.md src/adr/0069-crowdsec-IP-filtering.md src/adr/0037-eventbus.md src/adr/0049-deduplicated-blobs-gs-with-bloom-filters.md src/adr/0024-polyglot-strategy.md src/adr/0060-adopt-bounded-elastic.md src/adr/0058-upgrade-to-netty-4.md src/adr/0042-applicative-read-repairs.md src/adr/0048-cleanup-jmap-uploads.md src/adr/0072-postgresql-flags-update-concurrency-control.md src/adr/0015-objectstorage-blobid-list.md src/adr/0017-file-mail-queue-deprecation.md src/adr/0020-cassandra-mailbox-object-consistency.md src/adr/0047-jmap-push-over-websockets.md src/adr/0009-disable-elasticsearch-dynamic-mapping.md src/adr/0006-task-serialization.md src/adr/0057-reactive-imap.md src/adr/0051-oidc.md src/adr/0019-reactor-netty-adoption.md src/adr/0054-elasticsearch-search-overrides.md src/adr/0040-quality-levels-definitions.md src/adr/0056-opensearch-migration.md src/adr/0042-james-cli-based-on-webadmin.md src/adr/0003-distributed-workqueue.md src/adr/0009-java-11-migration.md src/adr/0065-changing-username.md src/adr/0025-cassandra-blob-store-cache.md src/adr/0029-Cassandra-mailbox-deletion-cleanup.md src/adr/0064-account-delegation.md src/adr/0046-generalize-event-bus.md src/adr/0001-record-architecture-decisions.md src/adr/0034-mailbox-api-visibility-and-usage.md src/adr/0018-jmap-new-specs.md src/adr/0035-distributed-listeners-configuration.md src/adr/0062-oidc-token-introspection.md src/adr/0041-replace-jcloud-with-s3.md src/adr/0036-against-use-of-conditional-statements-in-guice-modules.md src/adr/0011-remove-elasticsearch-document-source.md src/adr/0059-upgrade-to-cassadra-driver-4.md src/adr/0071-postgresql-mailbox-tables-structure.md src/adr/0016-distributed-workqueue.md src/adr/0052-pulsar-mailqueue.md src/adr/0014-blobstore-storage-policies.md src/adr/0008-distributed-task-await.md src/adr/0053-email-rate-limiting.md src/adr/0013-precompute-jmap-preview.md src/adr/0067-quota-for-jmap-uploads.md src/adr/0028-Recompute-mailbox-quotas.md src/adr/0070-postgresql-adoption.md src/adr/0022-cassandra-message-inconsistency.md src/adr/0005-distributed-task-termination-ackowledgement.md src/adr/0033-use-scala-in-event-sourcing-modules.md src/adr/0061-delegation.md src/adr/0071-objectstorage-sse-c.md src/adr/0045-support-jmap-push-with-mailbox-changes-implementation.md src/adr/0010-enable-elasticsearch-routing.md protocols/smtp/src/test/resources/a50.eml server/README.crypto server/queue/queue-pulsar/README.adoc server/queue/queue-memory/pom.xml server/apps/memory-app/docker-configuration/logback-cli.xml server/apps/memory-app/src/main/extensions-jars/README.md server/apps/memory-app/src/main/scripts/james-cli server/apps/memory-app/src/test/resources/jwt_publickey server/apps/memory-app/src/test/resources/eml/otherDomainDkimLocalFrom.eml server/apps/memory-app/src/test/resources/eml/otherDomainDkim.eml server/apps/memory-app/src/test/resources/eml/badDkim.eml server/apps/memory-app/src/test/resources/eml/goodDkim.eml server/apps/memory-app/src/assemble/README.adoc server/apps/memory-app/src/assemble/extensions-jars.txt server/apps/memory-app/README.md server/apps/memory-app/sample-configuration/extensions.properties server/apps/memory-app/sample-configuration/deletedMessageVault.properties server/apps/memory-app/sample-configuration/jvm.properties server/apps/memory-app/sample-configuration/jmap.properties server/apps/memory-app/sample-configuration/droplists.properties server/apps/webadmin-cli/src/test/resources/jwt_publickey server/apps/webadmin-cli/src/test/resources/valid_token_admin_false.jwt server/apps/webadmin-cli/src/test/resources/valid_token_admin_true.jwt server/apps/webadmin-cli/README.md server/apps/webadmin-cli/james-cli server/apps/scaling-pulsar-smtp/docker-compose.yml server/apps/scaling-pulsar-smtp/README.adoc server/apps/scaling-pulsar-smtp/src/main/scripts/james-cli server/apps/scaling-pulsar-smtp/sample-configuration/extensions.properties server/apps/scaling-pulsar-smtp/sample-configuration/pulsar.properties server/apps/scaling-pulsar-smtp/sample-configuration/scriptFile.scala server/apps/scaling-pulsar-smtp/sample-configuration/jvm.properties server/apps/scaling-pulsar-smtp/sample-configuration/logback.xml server/apps/scaling-pulsar-smtp/sample-configuration/blob.properties server/apps/spring-app/README.crypto server/apps/spring-app/src/main/resources/log4j2.xml server/apps/spring-app/src/main/resources/jmxremote.access server/apps/spring-app/src/main/resources/jmxremote.password server/apps/spring-app/src/main/licensing/app/notice-for-binary.txt server/apps/spring-app/src/debian/control/control server/apps/distributed-pop3-app/docker-configuration/jvm.properties server/apps/distributed-pop3-app/docker-configuration/logback-cli.xml server/apps/distributed-pop3-app/docker-compose.yml server/apps/distributed-pop3-app/README.adoc server/apps/distributed-pop3-app/src/main/extensions-jars/README.md server/apps/distributed-pop3-app/src/main/scripts/james-cli server/apps/distributed-pop3-app/src/test/resources/attachment.eml server/apps/distributed-pop3-app/src/test/resources/big.eml server/apps/distributed-pop3-app/src/test/resources/batchsizes.properties server/apps/distributed-pop3-app/src/test/resources/rabbitmq.properties server/apps/distributed-pop3-app/sample-configuration/extensions.properties server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties server/apps/distributed-pop3-app/sample-configuration/jvm.properties server/apps/distributed-pop3-app/sample-configuration/logback.xml server/apps/distributed-pop3-app/sample-configuration/cassandra-driver.conf server/apps/distributed-pop3-app/sample-configuration/batchsizes.properties server/apps/distributed-pop3-app/sample-configuration/blob.properties server/apps/distributed-pop3-app/sample-configuration/cassandra.properties server/apps/distributed-pop3-app/sample-configuration/rabbitmq.properties server/apps/jpa-smtp-app/docker-configuration/logback-cli.xml server/apps/jpa-smtp-app/docker-compose.yml server/apps/jpa-smtp-app/README.adoc server/apps/jpa-smtp-app/src/main/extensions-jars/README.md server/apps/jpa-smtp-app/src/main/scripts/james-cli server/apps/jpa-smtp-app/src/assemble/extensions-jars.txt server/apps/jpa-smtp-app/conf/extensions.properties server/apps/jpa-smtp-app/conf/jvm.properties server/apps/jpa-smtp-app/conf/logback.xml server/apps/jpa-smtp-app/sample-configuration/extensions.properties server/apps/jpa-smtp-app/sample-configuration/jvm.properties server/apps/jpa-smtp-app/sample-configuration/logback.xml server/apps/conf/jmxremote.access server/apps/conf/jmxremote.password server/apps/postgres-app/clean_up.sql server/apps/postgres-app/sample-configuration-single/search.properties server/apps/postgres-app/docker-compose.yml server/apps/postgres-app/README.adoc server/apps/postgres-app/sample-configuration-distributed/blob.properties server/apps/postgres-app/sample-configuration-distributed/rabbitmq.properties server/apps/postgres-app/src/main/extensions-jars/README.md server/apps/postgres-app/src/main/scripts/james-cli server/apps/postgres-app/src/test/resources/eml/htmlMail.eml server/apps/postgres-app/src/assemble/extensions-jars.txt server/apps/postgres-app/provision.sh server/apps/postgres-app/imap-provision-conf/provisioning.properties server/apps/postgres-app/sample-configuration/extensions.properties server/apps/postgres-app/sample-configuration/jwt_publickey server/apps/postgres-app/sample-configuration/deletedMessageVault.properties server/apps/postgres-app/sample-configuration/jvm.properties server/apps/postgres-app/sample-configuration/postgres.properties server/apps/postgres-app/sample-configuration/logback.xml server/apps/postgres-app/sample-configuration/jmap.properties server/apps/postgres-app/sample-configuration/droplists.properties server/apps/postgres-app/sample-configuration/blob.properties server/apps/postgres-app/docker-compose-distributed.yml server/apps/postgres-app/performance-test.md server/apps/demo/initialdata.sh server/apps/demo/Dockerfile server/apps/demo/startup.sh server/apps/cli/README.adoc server/apps/distributed-app/docker-configuration/jvm.properties server/apps/distributed-app/docker-configuration/logback-cli.xml server/apps/distributed-app/docker-compose.yml server/apps/distributed-app/helm-chart/james/templates/secrets.yaml server/apps/distributed-app/helm-chart/james/templates/servicemonitor.yaml server/apps/distributed-app/helm-chart/james/templates/james-admin-ingress.yaml server/apps/distributed-app/helm-chart/james/templates/_docker-secrets.tpl server/apps/distributed-app/helm-chart/james/templates/_helpers.tpl server/apps/distributed-app/helm-chart/james/templates/jmap-ingress.yaml server/apps/distributed-app/helm-chart/james/templates/deployment.yaml server/apps/distributed-app/helm-chart/james/templates/service.yaml server/apps/distributed-app/helm-chart/james/templates/_urls.tpl server/apps/distributed-app/helm-chart/james/templates/configmaps.yaml server/apps/distributed-app/helm-chart/james/secrets.sample.yaml server/apps/distributed-app/helm-chart/james/Chart.yaml server/apps/distributed-app/helm-chart/james/values.yaml server/apps/distributed-app/helm-chart/james/configs/webadmin.properties server/apps/distributed-app/helm-chart/james/configs/jmap.properties server/apps/distributed-app/helm-chart/james/configs/batchsizes.properties server/apps/distributed-app/helm-chart/james/configs/blob.properties server/apps/distributed-app/helm-chart/james/configs/cassandra.properties server/apps/distributed-app/helm-chart/james/configs/rabbitmq.properties server/apps/distributed-app/helm-chart/README.md server/apps/distributed-app/docker-compose-with-pulsar.yml server/apps/distributed-app/README.adoc server/apps/distributed-app/src/main/extensions-jars/README.md server/apps/distributed-app/src/main/scripts/james-cli server/apps/distributed-app/src/test/resources/batchsizes.properties server/apps/distributed-app/src/test/resources/rabbitmq.properties server/apps/distributed-app/src/assemble/extensions-jars.txt server/apps/distributed-app/sample-configuration/extensions.properties server/apps/distributed-app/sample-configuration/deletedMessageVault.properties server/apps/distributed-app/sample-configuration/queue-pulsar.properties server/apps/distributed-app/sample-configuration/pulsar.properties server/apps/distributed-app/sample-configuration/jvm.properties server/apps/distributed-app/sample-configuration/queue.properties server/apps/distributed-app/sample-configuration/logback.xml server/apps/distributed-app/sample-configuration/jmap.properties server/apps/distributed-app/sample-configuration/cassandra-driver.conf server/apps/distributed-app/sample-configuration/batchsizes.properties server/apps/distributed-app/sample-configuration/droplists.properties server/apps/distributed-app/sample-configuration/blob.properties server/apps/distributed-app/sample-configuration/cassandra.properties server/apps/distributed-app/sample-configuration/rabbitmq.properties server/apps/distributed-app/docs/Dockerfile server/apps/distributed-app/docs/ui-overrides/partials/header-content.hbs server/apps/distributed-app/docs/ui-overrides/img/james.svg server/apps/distributed-app/docs/modules/ROOT/nav.adoc server/apps/distributed-app/docs/modules/ROOT/pages/index.adoc server/apps/distributed-app/docs/README.md server/apps/distributed-app/docs/antora-playbook-local.yml server/apps/distributed-app/docs/antora.yml server/apps/cli-integration-tests/src/test/resources/jwt_publickey server/apps/cassandra-app/docker-configuration/jvm.properties server/apps/cassandra-app/docker-configuration/logback-cli.xml server/apps/cassandra-app/docker-compose.yml server/apps/cassandra-app/README.adoc server/apps/cassandra-app/src/main/extensions-jars/README.md server/apps/cassandra-app/src/main/scripts/james-cli server/apps/cassandra-app/src/test/resources/eml/htmlMail.eml server/apps/cassandra-app/src/test/resources/ldif-files/populate.ldif server/apps/cassandra-app/src/test/resources/batchsizes.properties server/apps/cassandra-app/src/assemble/extensions-jars.txt server/apps/cassandra-app/sample-configuration/extensions.properties server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties server/apps/cassandra-app/sample-configuration/jvm.properties server/apps/cassandra-app/sample-configuration/logback.xml server/apps/cassandra-app/sample-configuration/jmap.properties server/apps/cassandra-app/sample-configuration/cassandra-driver.conf server/apps/cassandra-app/sample-configuration/batchsizes.properties server/apps/cassandra-app/sample-configuration/activemq.properties server/apps/cassandra-app/sample-configuration/blob.properties server/apps/cassandra-app/sample-configuration/cassandra.properties server/apps/jpa-app/docker-configuration/logback-cli.xml server/apps/jpa-app/docker-compose.yml server/apps/jpa-app/README.adoc server/apps/jpa-app/src/main/extensions-jars/README.md server/apps/jpa-app/src/main/scripts/james-cli server/apps/jpa-app/src/assemble/extensions-jars.txt server/apps/jpa-app/sample-configuration/extensions.properties server/apps/jpa-app/sample-configuration/jwt_publickey server/apps/jpa-app/sample-configuration/jvm.properties server/apps/jpa-app/sample-configuration/logback.xml server/apps/jpa-app/sample-configuration/droplists.properties server/blob/blob-cassandra/src/test/resources/cassandra-driver.conf server/blob/blob-s3/src/test/resources/minio/public.crt server/blob/blob-s3/src/test/resources/minio/private.key server/task/task-postgres/pom.xml server/protocols/protocols-pop3-distributed/src/test/resources/pop3server.xml server/protocols/webadmin/webadmin-mailrepository/src/test/resources/mail.eml server/protocols/webadmin/webadmin-data/src/test/resources/sieve/my_sieve server/protocols/webadmin/webadmin-pop3/README.md server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message.eml server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message-without-from.eml server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message-without-tos.eml server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java server/protocols/jmap-rfc-8621/doc/specs/rfc/src/jmap.mdown server/protocols/jmap-rfc-8621/doc/specs/rfc/src/quotas.mdown server/protocols/jmap-rfc-8621/doc/specs/rfc/src/mail.mdown server/protocols/jmap-rfc-8621/doc/specs/README.md server/protocols/jmap-rfc-8621/doc/specs/spec/mail/message.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/mailbox.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/identity.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/identitySortOrder.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/messagesubmission.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/rights.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/securityconsiderations.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/thread.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/ianaconsiderations.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/searchsnippet.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/vacationresponse.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/delegation.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/mail/intro.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/custom-quotas/quotas.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/securityconsiderations.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/ianaconsiderations.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/quota.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/intro.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/push.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/securityconsiderations.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/session.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/ianaconsiderations.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/binary.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/api.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/intro.mdown server/protocols/jmap-rfc-8621/doc/specs/spec/authentication.mdown server/protocols/jmap-rfc-8621/doc/README.md server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionSetCreatePerformer.scala server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/DelegatedAccountSet.scala server/protocols/jmap-rfc-8621/src/test/resources/spamMail.eml server/protocols/jmap-rfc-8621/src/test/resources/fullMessage.eml server/protocols/jmap-rfc-8621/src/test/resources/example.html server/protocols/jmap-rfc-8621/src/test/resources/emptyBodyMessageWithOneAttachment.eml server/protocols/jmap-rfc-8621/src/test/resources/calendar.eml server/protocols/protocols-smtp/src/test/resources/smtpserver-requireTls.xml server/protocols/protocols-smtp/src/test/resources/log4j.xml server/protocols/protocols-smtp/src/test/resources/smtpserver-advancedSecurity.xml server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml server/protocols/protocols-library/src/test/resources/testServerTLSDefaultAuth.xml server/protocols/protocols-library/src/test/resources/testServerDisabled.xml server/protocols/protocols-library/src/test/resources/testServerStartTLS.xml server/protocols/protocols-library/src/test/resources/testServerTLSNeedAuth.xml server/protocols/protocols-library/src/test/resources/testServerDefaults.xml server/protocols/protocols-library/src/test/resources/testServerPlain.xml server/protocols/protocols-library/src/test/resources/testServerTLS.xml server/protocols/protocols-managesieve/pom.xml server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/jwt_publickey server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/eml/emailWithOnlyAttachment.eml server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/jwt_publickey server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/jwt_publickey server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/eml/emailWithOnlyAttachment.eml server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/rabbitmq.properties server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/nested.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/inlined-single-attachment.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_complex.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/related_in_alternative_multipart.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/alternative.cal.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/html.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/inlined-mixed.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/multipart_simple.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_simple.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/multipart_complex.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_relate_original_message.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/html_body.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/alternative.eml server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/nested2.eml server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties server/protocols/protocols-pop3/src/test/resources/pop3server.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslJKSNotFound.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPEM.xml server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthAllowed.xml server/protocols/protocols-imap4/src/test/resources/imapServerSSLCompress.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslDefaultJKS.xml server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthEnabledWithoutRequireSSL.xml server/protocols/protocols-imap4/src/test/resources/oauth.xml server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsTrueAndStartSSLIsFalse.xml server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthDisabled.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMBadPass.xml server/protocols/protocols-imap4/src/test/resources/imapServerProxy.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12.xml server/protocols/protocols-imap4/src/test/resources/imapServerSSL.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMNoPass.xml server/protocols/protocols-imap4/src/test/resources/imapServerCompress.xml server/protocols/protocols-imap4/src/test/resources/imapServerImapConnectCheck.xml server/protocols/protocols-imap4/src/test/resources/private.nopass.key server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12MissingPassword.xml server/protocols/protocols-imap4/src/test/resources/imapServer.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslJKSBadPassword.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMExtraPass.xml server/protocols/protocols-imap4/src/test/resources/imapServerNoLimits.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslNoKeys.xml server/protocols/protocols-imap4/src/test/resources/imapSSL.xml server/protocols/protocols-imap4/src/test/resources/private.key server/protocols/protocols-imap4/src/test/resources/imapServerHealthCheck.xml server/protocols/protocols-imap4/src/test/resources/imapServerIdCommandResponseFields.xml server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsFalseAndStartSSLIsTrue.xml server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsTrueAndStartSSLIsTrue.xml server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthDisallowed.xml server/protocols/protocols-imap4/src/test/resources/imapServerStartTLS.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslJKS.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMMissingPass.xml server/protocols/protocols-imap4/src/test/resources/certs.csr server/protocols/protocols-imap4/src/test/resources/certs.self-signed.csr server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsFalseAndStartSSLIsFalse.xml server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12WrongPassword.xml server/Overview.md server/mailet/rate-limiter-redis/redis.properties server/mailet/rate-limiter-redis/docker-compose-sample/redis.properties server/mailet/rate-limiter-redis/docker-compose-sample/docker-compose-with-redis-sentinel.yml server/mailet/rate-limiter-redis/docker-compose-sample/README.md server/mailet/rate-limiter-redis/docker-compose-sample/config-template/replica/redis.conf.template server/mailet/rate-limiter-redis/docker-compose-sample/config-template/replica/docker-entrypoint-replica.sh server/mailet/rate-limiter-redis/docker-compose-sample/config-template/sentinel/docker-entrypoint-sentinel.sh server/mailet/rate-limiter-redis/docker-compose-sample/config-template/sentinel/sentinel.conf.template server/mailet/rate-limiter-redis/docker-compose-sample/config-template/master/redis.conf.template server/mailet/rate-limiter-redis/docker-compose-sample/config-template/master/docker-entrypoint-master.sh server/mailet/rate-limiter-redis/extensions.properties server/mailet/rate-limiter-redis/docker-compose.yml server/mailet/rate-limiter-redis/README.adoc server/mailet/rate-limiter-redis/healthcheck.properties server/mailet/integration-testing/src/main/resources/eml/message-multipart-8bit.eml server/mailet/integration-testing/src/main/resources/eml/mail_with_no_signature.eml server/mailet/integration-testing/src/main/resources/eml/crypted.eml server/mailet/integration-testing/src/main/resources/eml/mail_with_bad_signature.eml server/mailet/integration-testing/src/main/resources/eml/non_smime_mail.eml server/mailet/integration-testing/src/main/resources/eml/message-multipart-7bit.eml server/mailet/integration-testing/src/main/resources/eml/dlp_read_mail_with_attachment.eml server/mailet/integration-testing/src/main/resources/eml/message-text-only-8bit.eml server/mailet/integration-testing/src/main/resources/eml/crypted_with_attachment.eml server/mailet/integration-testing/src/main/resources/eml/message-text-only-7bit.eml server/mailet/integration-testing/src/main/resources/eml/calendar.eml server/mailet/integration-testing/src/main/resources/eml/bad_crypted.eml server/mailet/integration-testing/src/main/resources/eml/yahooInvitation.eml server/mailet/integration-testing/src/main/resources/smime-test-resource-set/instruction.md server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.srl server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail_with_signature.eml server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.private.key server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail_with_signature_and_content_type_xpkcs7mime.eml server/mailet/integration-testing/src/main/resources/smime-test-resource-set/private.key server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.crt server/mailet/integration-testing/src/main/resources/smime-test-resource-set/request.csr server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail-with-signature-and-multi-certs.eml server/mailet/integration-testing/src/main/resources/smime-test-resource-set/certificate.crt server/mailet/ldap/src/test/resources/ldif-files/populate.ldif server/mailet/ldap/README.md server/mailet/rate-limiter/extensions.properties server/mailet/rate-limiter/docker-compose.yml server/mailet/rate-limiter/README.adoc server/mailet/mailets/src/main/resources/managesieve.help.txt server/mailet/mailets/src/test/resources/noReplyTo.eml server/mailet/mailets/src/test/resources/brokenReplyTo.eml server/mailet/mailets/src/test/resources/spamMail.eml server/mailet/mailets/src/test/resources/eml/gmail.eml server/mailet/mock-smtp-server/README.adoc server/mailet/mock-smtp-server/src/main/jib/logback.xml server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ConfigurationClientTest.java server/container/filesystem-api/src/test/resources/classpathTest.txt server/container/filesystem-api/src/test/resources/class path Test.txt server/container/core/src/test/resources/JAMES-1593.eml server/container/core/src/test/resources/invalid.eml server/container/core/src/test/resources/mail-containing-unicode-characters.eml server/container/guice/memory/README.md server/container/guice/configuration/src/test/resources/b.properties server/container/guice/configuration/src/test/resources/a.properties server/container/guice/configuration/src/test/resources/env.properties server/container/guice/common/src/test/resources/eml/mail-containing-unicode-characters.eml server/container/guice/common/src/test/resources/test.properties server/container/guice/protocols/webadmin/src/test/resources/webadmin-two.properties server/container/guice/protocols/webadmin/src/test/resources/webadmin-one.properties server/container/guice/protocols/webadmin/src/test/resources/webadmin-empty.properties server/container/guice/protocols/webadmin/src/test/resources/webadmin-none.properties server/container/guice/utils/src/test/resources/extensions-empty.properties server/container/guice/utils/src/test/resources/extensions-two.properties server/container/guice/utils/src/test/resources/extensions-none.properties server/container/guice/utils/src/test/resources/extensions-one.properties server/container/guice/testing/custom-mailets/README.md server/container/guice/cassandra/src/test/resources/modules/mailbox/cassandra.properties server/container/mailbox-jmx/src/test/resources/eml/frnog.eml server/data/data-library/src/test/resources/sieve/my_sieve server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature server/data/data-postgres/src/test/resources/log4j.properties server/data/data-postgres/pom.xml server/data/data-ldap/src/test/resources/usersrepository-enableVirtualHosting.xml server/data/data-ldap/src/test/resources/invalid/ldif-files/populate.ldif server/data/data-ldap/src/test/resources/localpartLogin/ldif-files/populate.ldif server/data/data-ldap/src/test/resources/ldif-files/populate.ldif server/data/data-ldap/src/test/resources/usersrepository-supportsVirtualHosting.xml server/data/data-ldap/src/test/resources/usersrepository-default.xml server/data/data-jpa/src/test/resources/log4j.properties server/data/data-file/src/test/resources/org/apache/james/mailrepository/testdata/Inbox server/data/data-jmap/src/test/java/org/apache/james/jmap/api/upload/UploadUsageRepositoryContract.scala server/grafana-reporting/prometheus-datasource/README.md server/grafana-reporting/es-datasource/README.md mailet/icalendar/src/test/resources/ics_in_header.eml mailet/icalendar/src/test/resources/ics/no_event.ics mailet/icalendar/src/test/resources/ics/meeting_without_dtstamp.ics mailet/icalendar/src/test/resources/ics/ics_with_error.ics mailet/icalendar/src/test/resources/ics/meeting_without_sequence.ics mailet/icalendar/src/test/resources/ics/meeting_2.ics mailet/icalendar/src/test/resources/ics/meeting_without_uid.ics mailet/icalendar/src/test/resources/ics/meeting.ics mailet/icalendar/src/test/resources/ics/meeting_without_method.ics mailet/standard/src/test/resources/mime/sendToRemoteHttp.mime mailet/standard/src/test/resources/mime/gmail.mime mailet/standard/src/test/resources/mime/headerFolded.mime mailet/standard/src/test/resources/mime/space.eml mailet/standard/src/test/resources/mime/incorrect-headers.mime mailet/standard/LICENSE.apache mailet/standard/LICENSE.activation mailet/standard/LICENSE.mail mailet/base/src/test/resources/eml/text-only-7bit.eml mailet/base/src/test/resources/eml/multipart-7bit.eml mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt mailet/base/src/test/resources/eml/multipart-8bit.eml mailet/base/src/test/resources/eml/text-only-8bit.eml examples/custom-webadmin-route/README.md examples/metrics-graphite/docker-compose.yml examples/metrics-graphite/james/extensions.properties examples/metrics-graphite/README.md examples/custom-smtp-hooks/README.md examples/proxy-smtp/docker-compose.yml examples/proxy-smtp/haproxy.cfg examples/proxy-smtp/README.md examples/custom-smtp-command/README.md examples/custom-listeners/README.md examples/custom-imap/docker-compose.yml examples/custom-imap/README.md examples/custom-mailets/README.md examples/custom-healthcheck/README.md examples/README.md examples/imap-autoconf/content/mail/config-v1.1.xml examples/imap-autoconf/content/Autodiscover/Autodiscover.xml examples/imap-autoconf/content/.well-known/autoconfig/mail/config-v1.1.xml examples/imap-autoconf/content/autodiscover/autodiscover.xml examples/imap-autoconf/docker-compose.yml examples/imap-autoconf/README.adoc examples/imap-autoconf/default.conf examples/custom-james-assembly/custom-james-assembly.iml examples/custom-james-assembly/README.md examples/opensearch-dahsboard/docker-compose.yml examples/opensearch-dahsboard/README.md examples/opensearch-dahsboard/james-dashboard.ndjson examples/oidc/test.sh examples/oidc/docker-compose.yml examples/oidc/james/imapserver.xml examples/oidc/james/jmap.properties examples/oidc/james/smtpserver.xml examples/oidc/_media/oidc-sso.drawio examples/oidc/_media/oidc-slo.drawio examples/oidc/_media/IMAP_SMTP oidc.drawio examples/oidc/apisix/conf/apisix.yaml examples/oidc/apisix/conf/config.yaml examples/oidc/README.md examples/oidc/ldap/populate.ldif mailbox/spring/src/test/README.md mailbox/plugin/quota-mailing/src/main/resources/templates/QuotaThresholdMailBody.mustache mailbox/plugin/quota-mailing/src/main/resources/templates/QuotaThresholdMailSubject.mustache mailbox/plugin/quota-mailing/src/test/resources/templates/body1.mustache mailbox/plugin/quota-mailing/src/test/resources/templates/body2.mustache mailbox/plugin/quota-mailing/src/test/resources/templates/subject2.mustache mailbox/plugin/quota-mailing/src/test/resources/templates/subject1.mustache mailbox/opensearch/src/test/resources/eml/emailWith3Attachments.eml mailbox/opensearch/src/test/resources/eml/mailCustomStringHeader.eml mailbox/opensearch/src/test/resources/eml/bodyMakeTikaToFail.eml mailbox/opensearch/src/test/resources/eml/alternative_simple.eml mailbox/opensearch/src/test/resources/eml/mailCustomDateHeader.eml mailbox/opensearch/src/test/resources/eml/inlined-mixed.eml mailbox/opensearch/src/test/resources/eml/mailWithHeaders.eml mailbox/opensearch/src/test/resources/eml/htmlContent.txt mailbox/opensearch/src/test/resources/eml/alternative.eml mailbox/memory/src/test/resources/test.eml mailbox/tika/src/test/resources/documents/Text.txt mailbox/api/src/test/resources/eml/twoAttachmentsApi.eml mailbox/README.md mailbox/var/store/derby/db.lck mailbox/var/store/derby/service.properties mailbox/var/store/derby/log/README_DO_NOT_TOUCH_FILES.txt mailbox/var/store/derby/README_DO_NOT_TOUCH_FILES.txt mailbox/var/store/derby/seg0/README_DO_NOT_TOUCH_FILES.txt mailbox/var/store/lucene/write.lock mailbox/store/src/test/resources/eml/pgpSignedMail.eml mailbox/store/src/test/resources/eml/htmlMail.eml mailbox/store/src/test/resources/eml/mail4.eml mailbox/store/src/test/resources/eml/recursiveMail.eml mailbox/store/src/test/resources/eml/emailWithNonIndexableAttachment.eml mailbox/store/src/test/resources/eml/mailWithLongHeaders.eml mailbox/store/src/test/resources/eml/calendar2.eml mailbox/store/src/test/resources/eml/signedMessage.eml mailbox/store/src/test/resources/eml/oneAttachmentWithSimpleContentType.eml mailbox/store/src/test/resources/eml/mail5.eml mailbox/store/src/test/resources/eml/multiAttachmentsWithOneWrongContentDisposition.eml mailbox/store/src/test/resources/eml/spamMail.eml mailbox/store/src/test/resources/eml/mail.eml mailbox/store/src/test/resources/eml/mailWithManyHeaders.eml mailbox/store/src/test/resources/eml/oneAttachmentWithEmptyContentType.eml mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithNoCid.eml mailbox/store/src/test/resources/eml/invalidCharset.eml mailbox/store/src/test/resources/eml/headerWithDot.eml mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml mailbox/store/src/test/resources/eml/inlined-mixed.eml mailbox/store/src/test/resources/eml/filenameOnly.eml mailbox/store/src/test/resources/eml/noContentDispositionWithCID.eml mailbox/store/src/test/resources/eml/embeddedAttachmentWithAttachment.eml mailbox/store/src/test/resources/eml/oneInlinedAttachment.eml mailbox/store/src/test/resources/eml/james-3901.eml mailbox/store/src/test/resources/eml/messageWithNonASCIIFilenameAttachment.eml mailbox/store/src/test/resources/eml/filenameAndName.eml mailbox/store/src/test/resources/eml/invitationEmailFromOP.eml mailbox/store/src/test/resources/eml/mail3.eml mailbox/store/src/test/resources/eml/frnog.eml mailbox/store/src/test/resources/eml/twoAttachments.eml mailbox/store/src/test/resources/eml/oneAttachmentAndSomeTextInlined.eml mailbox/store/src/test/resources/eml/oneHtmlAttachmentAndSomeTextInlined.eml mailbox/store/src/test/resources/eml/unknownDisposition.eml mailbox/store/src/test/resources/eml/mail2.eml mailbox/store/src/test/resources/eml/mail1.eml mailbox/store/src/test/resources/eml/noAttachment.eml mailbox/store/src/test/resources/eml/charset.eml mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithBlankCid.eml mailbox/store/src/test/resources/eml/embeddedAttachmentWithInline.eml mailbox/store/src/test/resources/eml/oneAttachmentWithoutContentType.eml mailbox/store/src/test/resources/eml/emailWithTextAttachment.eml mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml mailbox/store/src/test/resources/eml/calendar.eml mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithEmptyCid.eml mailbox/store/src/test/resources/eml/charset2.eml mailbox/store/src/test/resources/eml/nonTextual.eml mailbox/store/src/test/resources/documents/writter.docx mailbox/store/src/test/resources/documents/Text.txt mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/FetchGroupConverterTest.java mailbox/cassandra/doc/README.md mailbox/cassandra/doc/table_structure.drawio mailbox/cassandra/src/test/resources/cassandra-driver.conf docs/Dockerfile docs/ui-overrides/partials/header-content.hbs docs/ui-overrides/img/james.svg docs/modules/customization/nav.adoc docs/modules/customization/pages/mail-processing.adoc docs/modules/customization/pages/smtp-hooks.adoc docs/modules/customization/pages/imap.adoc docs/modules/customization/pages/webadmin-routes.adoc docs/modules/customization/pages/mailbox-listeners.adoc docs/modules/customization/pages/index.adoc docs/modules/servers/nav.adoc docs/modules/servers/pages/distributed/architecture/mailqueue_combined_extend.adoc docs/modules/servers/pages/distributed/architecture/consistency_model_data_replication_extend.adoc docs/modules/servers/pages/distributed/architecture/implemented-standards.adoc docs/modules/servers/pages/distributed/architecture/specialized-instances.adoc docs/modules/servers/pages/distributed/architecture/index.adoc docs/modules/servers/pages/distributed/architecture/consistency-model.adoc docs/modules/servers/pages/distributed/extending.adoc docs/modules/servers/pages/distributed/objectives.adoc docs/modules/servers/pages/distributed/operate/metrics.adoc docs/modules/servers/pages/distributed/operate/security.adoc docs/modules/servers/pages/distributed/operate/webadmin/admin-messages-extend.adoc docs/modules/servers/pages/distributed/operate/webadmin/admin-mailboxes-extend.adoc docs/modules/servers/pages/distributed/operate/webadmin/admin-mail-queues-extend.adoc docs/modules/servers/pages/distributed/operate/migrating.adoc docs/modules/servers/pages/distributed/operate/logging/docker-compose-block.adoc docs/modules/servers/pages/distributed/operate/guide.adoc docs/modules/servers/pages/distributed/operate/performanceChecklist.adoc docs/modules/servers/pages/distributed/operate/webadmin.adoc docs/modules/servers/pages/distributed/operate/logging.adoc docs/modules/servers/pages/distributed/operate/index.adoc docs/modules/servers/pages/distributed/operate/cassandra-migration.adoc docs/modules/servers/pages/distributed/operate/cli.adoc docs/modules/servers/pages/distributed/benchmark/benchmark_prepare.adoc docs/modules/servers/pages/distributed/benchmark/db-benchmark.adoc docs/modules/servers/pages/distributed/benchmark/james-benchmark.adoc docs/modules/servers/pages/distributed/benchmark/provision.sh docs/modules/servers/pages/distributed/benchmark/index.adoc docs/modules/servers/pages/distributed/index.adoc docs/modules/servers/pages/distributed/run/k8s-secrets.adoc docs/modules/servers/pages/distributed/run/k8s-logsMetrics.adoc docs/modules/servers/pages/distributed/run/run-docker.adoc docs/modules/servers/pages/distributed/run/run-kubernetes.adoc docs/modules/servers/pages/distributed/run/k8s-values.adoc docs/modules/servers/pages/distributed/run/index.adoc docs/modules/servers/pages/distributed/run/run-java.adoc docs/modules/servers/pages/distributed/run/k8s-checklist.adoc docs/modules/servers/pages/distributed/configure/collecting-events.adoc docs/modules/servers/pages/distributed/configure/matchers.adoc docs/modules/servers/pages/distributed/configure/mailets.adoc docs/modules/servers/pages/distributed/configure/batchsizes.adoc docs/modules/servers/pages/distributed/configure/smtp-hooks.adoc docs/modules/servers/pages/distributed/configure/domainlist.adoc docs/modules/servers/pages/distributed/configure/queue.adoc docs/modules/servers/pages/distributed/configure/dsn.adoc docs/modules/servers/pages/distributed/configure/jmx.adoc docs/modules/servers/pages/distributed/configure/cassandra.adoc docs/modules/servers/pages/distributed/configure/tika.adoc docs/modules/servers/pages/distributed/configure/jvm.adoc docs/modules/servers/pages/distributed/configure/jmap.adoc docs/modules/servers/pages/distributed/configure/mailrepositorystore.adoc docs/modules/servers/pages/distributed/configure/collecting-contacts.adoc docs/modules/servers/pages/distributed/configure/droplists.adoc docs/modules/servers/pages/distributed/configure/search.adoc docs/modules/servers/pages/distributed/configure/blobstore.adoc docs/modules/servers/pages/distributed/configure/extensions.adoc docs/modules/servers/pages/distributed/configure/sieve.adoc docs/modules/servers/pages/distributed/configure/listeners.adoc docs/modules/servers/pages/distributed/configure/vault.adoc docs/modules/servers/pages/distributed/configure/imap.adoc docs/modules/servers/pages/distributed/configure/ssl.adoc docs/modules/servers/pages/distributed/configure/smtp.adoc docs/modules/servers/pages/distributed/configure/mailetcontainer.adoc docs/modules/servers/pages/distributed/configure/webadmin.adoc docs/modules/servers/pages/distributed/configure/recipientrewritetable.adoc docs/modules/servers/pages/distributed/configure/rabbitmq.adoc docs/modules/servers/pages/distributed/configure/spam.adoc docs/modules/servers/pages/distributed/configure/remote-delivery-error-handling.adoc docs/modules/servers/pages/distributed/configure/index.adoc docs/modules/servers/pages/distributed/configure/dns.adoc docs/modules/servers/pages/distributed/configure/redis.adoc docs/modules/servers/pages/distributed/configure/healthcheck.adoc docs/modules/servers/pages/distributed/configure/usersrepository.adoc docs/modules/servers/pages/distributed/configure/opensearch.adoc docs/modules/servers/pages/distributed/configure/pop3.adoc docs/modules/servers/pages/5-minute-demo.adoc docs/modules/servers/pages/15-minute-demo.adoc docs/modules/servers/pages/test.adoc docs/modules/servers/pages/demo.adoc docs/modules/servers/pages/basic/context.adoc docs/modules/servers/pages/basic/objectives.adoc docs/modules/servers/pages/basic/conf/index.adoc docs/modules/servers/pages/basic/help.adoc docs/modules/servers/pages/basic/concepts.adoc docs/modules/servers/pages/basic/architecture.adoc docs/modules/servers/pages/basic/index.adoc docs/modules/servers/pages/basic/self-hosting.notes docs/modules/servers/pages/run.adoc docs/modules/servers/pages/index.adoc docs/modules/servers/pages/postgres/architecture/mailqueue_combined_extend.adoc docs/modules/servers/pages/postgres/architecture/consistency_model_data_replication_extend.adoc docs/modules/servers/pages/postgres/architecture/implemented-standards.adoc docs/modules/servers/pages/postgres/architecture/specialized-instances.adoc docs/modules/servers/pages/postgres/architecture/index.adoc docs/modules/servers/pages/postgres/architecture/consistency-model.adoc docs/modules/servers/pages/postgres/extending.adoc docs/modules/servers/pages/postgres/objectives.adoc docs/modules/servers/pages/postgres/operate/metrics.adoc docs/modules/servers/pages/postgres/operate/security.adoc docs/modules/servers/pages/postgres/operate/webadmin/admin-messages-extend.adoc docs/modules/servers/pages/postgres/operate/webadmin/admin-mailboxes-extend.adoc docs/modules/servers/pages/postgres/operate/webadmin/admin-mail-queues-extend.adoc docs/modules/servers/pages/postgres/operate/migrating.adoc docs/modules/servers/pages/postgres/operate/logging/docker-compose-block.adoc docs/modules/servers/pages/postgres/operate/guide.adoc docs/modules/servers/pages/postgres/operate/performanceChecklist.adoc docs/modules/servers/pages/postgres/operate/webadmin.adoc docs/modules/servers/pages/postgres/operate/logging.adoc docs/modules/servers/pages/postgres/operate/index.adoc docs/modules/servers/pages/postgres/operate/cli.adoc docs/modules/servers/pages/postgres/benchmark/benchmark_prepare.adoc docs/modules/servers/pages/postgres/benchmark/db-benchmark.adoc docs/modules/servers/pages/postgres/benchmark/james-benchmark.adoc docs/modules/servers/pages/postgres/benchmark/index.adoc docs/modules/servers/pages/postgres/index.adoc docs/modules/servers/pages/postgres/extending/index.adoc docs/modules/servers/pages/postgres/run/run-docker.adoc docs/modules/servers/pages/postgres/run/index.adoc docs/modules/servers/pages/postgres/run/run-java.adoc docs/modules/servers/pages/postgres/configure/collecting-events.adoc docs/modules/servers/pages/postgres/configure/matchers.adoc docs/modules/servers/pages/postgres/configure/mailets.adoc docs/modules/servers/pages/postgres/configure/batchsizes.adoc docs/modules/servers/pages/postgres/configure/smtp-hooks.adoc docs/modules/servers/pages/postgres/configure/domainlist.adoc docs/modules/servers/pages/postgres/configure/queue.adoc docs/modules/servers/pages/postgres/configure/dsn.adoc docs/modules/servers/pages/postgres/configure/jmx.adoc docs/modules/servers/pages/postgres/configure/tika.adoc docs/modules/servers/pages/postgres/configure/jvm.adoc docs/modules/servers/pages/postgres/configure/jmap.adoc docs/modules/servers/pages/postgres/configure/mailrepositorystore.adoc docs/modules/servers/pages/postgres/configure/collecting-contacts.adoc docs/modules/servers/pages/postgres/configure/droplists.adoc docs/modules/servers/pages/postgres/configure/search.adoc docs/modules/servers/pages/postgres/configure/blobstore.adoc docs/modules/servers/pages/postgres/configure/extensions.adoc docs/modules/servers/pages/postgres/configure/sieve.adoc docs/modules/servers/pages/postgres/configure/listeners.adoc docs/modules/servers/pages/postgres/configure/vault.adoc docs/modules/servers/pages/postgres/configure/imap.adoc docs/modules/servers/pages/postgres/configure/ssl.adoc docs/modules/servers/pages/postgres/configure/smtp.adoc docs/modules/servers/pages/postgres/configure/mailetcontainer.adoc docs/modules/servers/pages/postgres/configure/webadmin.adoc docs/modules/servers/pages/postgres/configure/recipientrewritetable.adoc docs/modules/servers/pages/postgres/configure/rabbitmq.adoc docs/modules/servers/pages/postgres/configure/spam.adoc docs/modules/servers/pages/postgres/configure/remote-delivery-error-handling.adoc docs/modules/servers/pages/postgres/configure/index.adoc docs/modules/servers/pages/postgres/configure/dns.adoc docs/modules/servers/pages/postgres/configure/redis.adoc docs/modules/servers/pages/postgres/configure/healthcheck.adoc docs/modules/servers/pages/postgres/configure/usersrepository.adoc docs/modules/servers/pages/postgres/configure/opensearch.adoc docs/modules/servers/pages/postgres/configure/pop3.adoc docs/modules/servers/partials/architecture/implemented-standards.adoc docs/modules/servers/partials/architecture/specialized-instances.adoc docs/modules/servers/partials/architecture/index.adoc docs/modules/servers/partials/architecture/consistency-model.adoc docs/modules/servers/partials/IsOverQuota.adoc docs/modules/servers/partials/HasHeaderWithPrefix.adoc docs/modules/servers/partials/ManageSieveMailet.adoc docs/modules/servers/partials/AddFooter.adoc docs/modules/servers/partials/FileRegexMatcher.adoc docs/modules/servers/partials/AtMostPriority.adoc docs/modules/servers/partials/RecipientToLowerCase.adoc docs/modules/servers/partials/MailToAllUsers.adoc docs/modules/servers/partials/Expires.adoc docs/modules/servers/partials/AmqpForwardAttribute.adoc docs/modules/servers/partials/LogMessage.adoc docs/modules/servers/partials/ClamAVScan.adoc docs/modules/servers/partials/MailAttributesToMimeHeaders.adoc docs/modules/servers/partials/RemoveMimeHeader.adoc docs/modules/servers/partials/SenderIsNull.adoc docs/modules/servers/partials/SerialiseToHTTP.adoc docs/modules/servers/partials/ClassifyBounce.adoc docs/modules/servers/partials/IsSMIMESigned.adoc docs/modules/servers/partials/SubjectIs.adoc docs/modules/servers/partials/ToPlainText.adoc docs/modules/servers/partials/WithStorageDirective.adoc docs/modules/servers/partials/IsSMIMEEncrypted.adoc docs/modules/servers/partials/AtMost.adoc docs/modules/servers/partials/ExtractMDNOriginalJMAPMessageId.adoc docs/modules/servers/partials/RecipientRewriteTable.adoc docs/modules/servers/partials/RecipientIsLocal.adoc docs/modules/servers/partials/RemoveMimeHeaderByPrefix.adoc docs/modules/servers/partials/ConvertTo7Bit.adoc docs/modules/servers/partials/HostIs.adoc docs/modules/servers/partials/UserIs.adoc docs/modules/servers/partials/XOriginatingIpInNetwork.adoc docs/modules/servers/partials/ICalendarParser.adoc docs/modules/servers/partials/HasPriority.adoc docs/modules/servers/partials/LocalDelivery.adoc docs/modules/servers/partials/NESSpamCheck.adoc docs/modules/servers/partials/SPF.adoc docs/modules/servers/partials/TextCalendarBodyToAttachment.adoc docs/modules/servers/partials/WithPriority.adoc docs/modules/servers/partials/SpamAssassin.adoc docs/modules/servers/partials/Forward.adoc docs/modules/servers/partials/RecipientDomainIs.adoc docs/modules/servers/partials/SMTPIsAuthNetwork.adoc docs/modules/servers/partials/HasMailAttributeWithValueRegex.adoc docs/modules/servers/partials/ReplaceContent.adoc docs/modules/servers/partials/RemoteAddrInNetwork.adoc docs/modules/servers/partials/NotifyPostmaster.adoc docs/modules/servers/partials/HeadersToHTTP.adoc docs/modules/servers/partials/CommandForListserv.adoc docs/modules/servers/partials/RandomStoring.adoc docs/modules/servers/partials/PostmasterAlias.adoc docs/modules/servers/partials/SMIMECheckSignature.adoc docs/modules/servers/partials/RecoverAttachment.adoc docs/modules/servers/partials/StripAttachment.adoc docs/modules/servers/partials/SubAddressing.adoc docs/modules/servers/partials/DKIMSign.adoc docs/modules/servers/partials/TooManyRecipients.adoc docs/modules/servers/partials/SplitMail.adoc docs/modules/servers/partials/RemoveAllMailAttributes.adoc docs/modules/servers/partials/ICALToHeader.adoc docs/modules/servers/partials/HasMimeTypeAnySubPart.adoc docs/modules/servers/partials/AttachmentFileNameIs.adoc docs/modules/servers/partials/MimeDecodingMailet.adoc docs/modules/servers/partials/IsX509CertificateSubject.adoc docs/modules/servers/partials/Bounce.adoc docs/modules/servers/partials/RecipientCountExceeds.adoc docs/modules/servers/partials/WrapText.adoc docs/modules/servers/partials/DKIMVerify.adoc docs/modules/servers/partials/IsSenderInRRTLoop.adoc docs/modules/servers/partials/SetMimeHeader.adoc docs/modules/servers/partials/Redirect.adoc docs/modules/servers/partials/RelayLimit.adoc docs/modules/servers/partials/DeconnectionRight.adoc docs/modules/servers/partials/ICALToJsonAttribute.adoc docs/modules/servers/partials/SenderIs.adoc docs/modules/servers/partials/TooManyLines.adoc docs/modules/servers/partials/IsSingleRecipient.adoc docs/modules/servers/partials/ToRepository.adoc docs/modules/servers/partials/SenderInFakeDomain.adoc docs/modules/servers/partials/Null.adoc docs/modules/servers/partials/IsRemoteDeliveryPermanentError.adoc docs/modules/servers/partials/RemoteDelivery.adoc docs/modules/servers/partials/ServerTime.adoc docs/modules/servers/partials/AddSubjectPrefix.adoc docs/modules/servers/partials/RemoveMailAttribute.adoc docs/modules/servers/partials/Resend.adoc docs/modules/servers/partials/HasException.adoc docs/modules/servers/partials/UnwrapText.adoc docs/modules/servers/partials/ToSenderDomainRepository.adoc docs/modules/servers/partials/VacationMailet.adoc docs/modules/servers/partials/HasAttachment.adoc docs/modules/servers/partials/operate/metrics.adoc docs/modules/servers/partials/operate/security.adoc docs/modules/servers/partials/operate/migrating.adoc docs/modules/servers/partials/operate/guide.adoc docs/modules/servers/partials/operate/performanceChecklist.adoc docs/modules/servers/partials/operate/webadmin.adoc docs/modules/servers/partials/operate/logging.adoc docs/modules/servers/partials/operate/index.adoc docs/modules/servers/partials/operate/cli.adoc docs/modules/servers/partials/All.adoc docs/modules/servers/partials/benchmark/db-benchmark.adoc docs/modules/servers/partials/benchmark/james-benchmark.adoc docs/modules/servers/partials/benchmark/index.adoc docs/modules/servers/partials/CommandListservMatcher.adoc docs/modules/servers/partials/Sieve.adoc docs/modules/servers/partials/ToProcessor.adoc docs/modules/servers/partials/MailAttributesListToMimeHeaders.adoc docs/modules/servers/partials/FetchedFrom.adoc docs/modules/servers/partials/HostIsLocal.adoc docs/modules/servers/partials/SetMailAttribute.adoc docs/modules/servers/partials/HasMimeTypeParameter.adoc docs/modules/servers/partials/RemoteAddrNotInNetwork.adoc docs/modules/servers/partials/AtLeastPriority.adoc docs/modules/servers/partials/ContactExtractor.adoc docs/modules/servers/partials/Sign.adoc docs/modules/servers/partials/HasMailAttributeWithValue.adoc docs/modules/servers/partials/DSNBounce.adoc docs/modules/servers/partials/RemoteDeliveryFailedWithSMTPCode.adoc docs/modules/servers/partials/FoldLongLines.adoc docs/modules/servers/partials/HasMailAttribute.adoc docs/modules/servers/partials/ToSenderFolder.adoc docs/modules/servers/partials/SenderHostIsLocal.adoc docs/modules/servers/partials/CompareNumericHeaderValue.adoc docs/modules/servers/partials/RecipientIsRegex.adoc docs/modules/servers/partials/NotifySender.adoc docs/modules/servers/partials/LDAPMatchers.adoc docs/modules/servers/partials/SMIMESign.adoc docs/modules/servers/partials/SubjectStartsWith.adoc docs/modules/servers/partials/SenderDomainIs.adoc docs/modules/servers/partials/IsRemoteDeliveryTemporaryError.adoc docs/modules/servers/partials/SentByMailet.adoc docs/modules/servers/partials/DLP.adoc docs/modules/servers/partials/SenderIsLocal.adoc docs/modules/servers/partials/RecipientIs.adoc docs/modules/servers/partials/FromRepository.adoc docs/modules/servers/partials/InSpammerBlacklist.adoc docs/modules/servers/partials/SenderHostIs.adoc docs/modules/servers/partials/IsMarkedAsSpam.adoc docs/modules/servers/partials/SMTPAuthSuccessful.adoc docs/modules/servers/partials/HasHeader.adoc docs/modules/servers/partials/HasMimeType.adoc docs/modules/servers/partials/OnlyText.adoc docs/modules/servers/partials/UseHeaderRecipients.adoc docs/modules/servers/partials/SentByJmap.adoc docs/modules/servers/partials/ICSSanitizer.adoc docs/modules/servers/partials/SenderIsRegex.adoc docs/modules/servers/partials/configure/forProtocolsPartial.adoc docs/modules/servers/partials/configure/collecting-events.adoc docs/modules/servers/partials/configure/matchers.adoc docs/modules/servers/partials/configure/mailets.adoc docs/modules/servers/partials/configure/batchsizes.adoc docs/modules/servers/partials/configure/forStorageDependenciesPartial.adoc docs/modules/servers/partials/configure/smtp-hooks.adoc docs/modules/servers/partials/configure/domainlist.adoc docs/modules/servers/partials/configure/queue.adoc docs/modules/servers/partials/configure/dsn.adoc docs/modules/servers/partials/configure/jmx.adoc docs/modules/servers/partials/configure/tika.adoc docs/modules/servers/partials/configure/jvm.adoc docs/modules/servers/partials/configure/jmap.adoc docs/modules/servers/partials/configure/mailrepositorystore.adoc docs/modules/servers/partials/configure/collecting-contacts.adoc docs/modules/servers/partials/configure/droplists.adoc docs/modules/servers/partials/configure/search.adoc docs/modules/servers/partials/configure/blobstore.adoc docs/modules/servers/partials/configure/forCoreComponentsPartial.adoc docs/modules/servers/partials/configure/extensions.adoc docs/modules/servers/partials/configure/sieve.adoc docs/modules/servers/partials/configure/listeners.adoc docs/modules/servers/partials/configure/vault.adoc docs/modules/servers/partials/configure/imap.adoc docs/modules/servers/partials/configure/ssl.adoc docs/modules/servers/partials/configure/systemPropertiesPartial.adoc docs/modules/servers/partials/configure/smtp.adoc docs/modules/servers/partials/configure/mailetcontainer.adoc docs/modules/servers/partials/configure/webadmin.adoc docs/modules/servers/partials/configure/recipientrewritetable.adoc docs/modules/servers/partials/configure/rabbitmq.adoc docs/modules/servers/partials/configure/spam.adoc docs/modules/servers/partials/configure/remote-delivery-error-handling.adoc docs/modules/servers/partials/configure/forExtensionsPartial.adoc docs/modules/servers/partials/configure/dns.adoc docs/modules/servers/partials/configure/redis.adoc docs/modules/servers/partials/configure/healthcheck.adoc docs/modules/servers/partials/configure/usersrepository.adoc docs/modules/servers/partials/configure/opensearch.adoc docs/modules/servers/partials/configure/pop3.adoc docs/modules/servers/partials/MetricsMailet.adoc docs/modules/servers/partials/PartHasContentType.adoc docs/modules/servers/partials/SMTPAuthUserIs.adoc docs/modules/servers/partials/AddDeliveredToHeader.adoc docs/modules/servers/partials/SMIMEDecrypt.adoc docs/modules/servers/partials/SizeGreaterThan.adoc docs/modules/servers/assets/images/storage_james_postgres.svg docs/modules/concepts/nav.adoc docs/modules/concepts/pages/configuration.adoc docs/modules/concepts/pages/mail/index.adoc docs/modules/concepts/pages/storage/mailbox.adoc docs/modules/concepts/pages/storage/users.adoc docs/modules/concepts/pages/storage/index.adoc docs/modules/concepts/pages/messages/mime.adoc docs/modules/concepts/pages/messages/imf.adoc docs/modules/concepts/pages/messages/index.adoc docs/modules/concepts/pages/protocols/jmap.adoc docs/modules/concepts/pages/protocols/imap.adoc docs/modules/concepts/pages/protocols/smtp.adoc docs/modules/concepts/pages/protocols/index.adoc docs/modules/concepts/pages/protocols/pop.adoc docs/modules/concepts/pages/protocols/esmtp.adoc docs/modules/concepts/pages/protocols/lmtp.adoc docs/modules/concepts/pages/user/index.adoc docs/modules/concepts/pages/processing/index.adoc docs/modules/concepts/pages/glossary.adoc docs/modules/concepts/pages/index.adoc docs/modules/ROOT/nav.adoc docs/modules/ROOT/pages/index.adoc docs/modules/development/nav.adoc docs/modules/development/pages/deployment-tests.adoc docs/modules/development/pages/logging.adoc docs/modules/development/pages/index.adoc docs/modules/community/nav.adoc docs/modules/community/pages/support.adoc docs/modules/community/pages/website.adoc docs/modules/community/pages/guidelines.adoc docs/modules/community/pages/download.adoc docs/modules/community/pages/mailing-lists.adoc docs/modules/community/pages/release.adoc docs/modules/community/pages/index.adoc docs/modules/community/pages/contributing.adoc docs/README.md docs/antora-playbook-local.yml docs/antora.yml testing/base/src/main/resources/logback-test.xml testing/base/src/main/resources/testcontainers.properties ***************************************************** Archives: + message-fast-view-cleanup-extension.jar + server/apps/memory-app/extensions-jars/apache-mailet-crypto-3.8.1-SNAPSHOT-jar-with-dependencies.jar + server/container/guice/mailet/src/test/resources/recursive/extensions-jars/custom-mailets-implementation-3.9.0-SNAPSHOT.jar + server/container/guice/mailet/src/test/resources/recursive/extensions-jars/james-server-guice-custom-mailets-3.9.0-SNAPSHOT-jar-with-dependencies.jar + mailet/standard/src/test/resources/nested.zip + mailet/standard/src/test/resources/sonde.zip + mailbox/tika/src/test/resources/documents/slides.odp + mailbox/tika/src/test/resources/documents/writter.odt + mailbox/tika/src/test/resources/documents/calc.ods + mailbox/store/src/test/resources/eml/ديناصور.odt ***************************************************** Files with Apache License headers will be marked AL Binary files (which do not require any license headers) will be marked B Compressed archives will be marked A Notices, licenses etc. will be marked N AL metrics/metrics-logger/src/main/java/org/apache/james/metrics/logger/DefaultTimeMetric.java AL metrics/metrics-logger/src/main/java/org/apache/james/metrics/logger/DefaultMetricFactory.java AL metrics/metrics-logger/src/main/java/org/apache/james/metrics/logger/DefaultMetric.java AL metrics/metrics-logger/src/test/java/org/apache/james/metrics/logger/DefaultMetricFactoryTest.java AL metrics/metrics-logger/src/test/java/org/apache/james/metrics/logger/DefaultMetricTest.java AL metrics/metrics-logger/pom.xml AL metrics/pom.xml AL metrics/metrics-api/src/main/java/org/apache/james/metrics/api/GaugeRegistry.java AL metrics/metrics-api/src/main/java/org/apache/james/metrics/api/TimeMetric.java AL metrics/metrics-api/src/main/java/org/apache/james/metrics/api/Metric.java AL metrics/metrics-api/src/main/java/org/apache/james/metrics/api/MetricFactory.java AL metrics/metrics-api/src/main/java/org/apache/james/metrics/api/Gauge.java AL metrics/metrics-api/src/main/java/org/apache/james/metrics/api/NoopGaugeRegistry.java AL metrics/metrics-api/src/test/java/org/apache/james/metrics/api/MetricContract.java AL metrics/metrics-api/src/test/java/org/apache/james/metrics/api/MetricFactoryContract.java AL metrics/metrics-api/pom.xml AL metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardMetricFactory.java AL metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardJVMMetrics.java AL metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardMetric.java AL metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardGaugeRegistry.java AL metrics/metrics-dropwizard/src/main/java/org/apache/james/metrics/dropwizard/DropWizardTimeMetric.java AL metrics/metrics-dropwizard/src/test/java/org/apache/james/metrics/dropwizard/DropWizardMetricTest.java AL metrics/metrics-dropwizard/src/test/java/org/apache/james/metrics/dropwizard/DropWizardMetricFactoryTest.java AL metrics/metrics-dropwizard/pom.xml AL metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingTimeMetric.java AL metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetric.java AL metrics/metrics-tests/src/main/java/org/apache/james/metrics/tests/RecordingMetricFactory.java AL metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricFactoryTest.java AL metrics/metrics-tests/src/test/java/org/apache/james/metrics/tests/RecordingMetricTest.java AL metrics/metrics-tests/pom.xml AL json/src/main/java/org/apache/james/json/DTOModule.java AL json/src/main/java/org/apache/james/json/DTO.java AL json/src/main/java/org/apache/james/json/JsonGenericSerializer.java AL json/src/main/java/org/apache/james/json/DTOConverter.java AL json/src/test/java/org/apache/james/JsonSerializationVerifier.java AL json/src/test/java/org/apache/james/JsonGenericSerializerTest.java AL json/src/test/java/org/apache/james/DTOConverterTest.java AL json/src/test/java/org/apache/james/SerializationFixture.java AL json/src/test/java/org/apache/james/dto/TestNestedModule.java AL json/src/test/java/org/apache/james/dto/FirstNestedType.java AL json/src/test/java/org/apache/james/dto/FirstDTO.java AL json/src/test/java/org/apache/james/dto/TestModule.java AL json/src/test/java/org/apache/james/dto/FirstNestedDTO.java AL json/src/test/java/org/apache/james/dto/BaseType.java AL json/src/test/java/org/apache/james/dto/SecondDTO.java AL json/src/test/java/org/apache/james/dto/SecondNestedType.java AL json/src/test/java/org/apache/james/dto/NestedType.java AL json/src/test/java/org/apache/james/dto/SecondDomainObject.java AL json/src/test/java/org/apache/james/dto/FirstDomainObject.java AL json/src/test/java/org/apache/james/dto/TestModules.java AL json/src/test/java/org/apache/james/dto/SecondNestedDTO.java AL json/src/test/java/org/apache/james/JsonSerializationVerifierTest.java AL json/pom.xml N mpt/mavenplugin/LICENSE.txt N mpt/mavenplugin/NOTICE.txt AL mpt/mavenplugin/src/site/fml/faq.fml AL mpt/mavenplugin/src/site/site.xml AL mpt/mavenplugin/src/site/apt/usage.apt.vm AL mpt/mavenplugin/src/site/apt/index.apt AL mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/MailProtocolTest.java AL mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/MailProtocolTestMojo.java AL mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/AddUser.java AL mpt/mavenplugin/src/reporting-site/site.xml AL mpt/mavenplugin/pom.xml AL mpt/all/src/site/site.xml AL mpt/all/src/assemble/bin.xml AL mpt/all/src/assemble/src.xml AL mpt/all/src/reporting-site/site.xml AL mpt/all/pom.xml AL mpt/impl/smtp/pom.xml !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_session_fixation.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/rcpt_with_starttls.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/authplain.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/data_with_starttls.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/helo.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/data_starts_with_starttls.test !????? mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test AL mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpAuthCommandTest.java AL mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java AL mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java AL mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/InMemoryDnsExtension.java AL mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpStarttlsCommandTest.java AL mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestExtension.java AL mpt/impl/smtp/core/pom.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/dnsservice.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/lmtpserver.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/mailetcontainer.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/imapserver.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/managesieveserver.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/domainlist.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/mailrepositorystore.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/recipientrewritetable.xml B mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/keystore AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/smtpserver.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/resources/pop3server.xml AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/AwsS3RabbitMQForwardSmtpTest.java AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/AwsS3RabbitMQSmtpStarttlsCommandTest.java AL mpt/impl/smtp/cassandra-rabbitmq-object-storage/pom.xml AL mpt/impl/smtp/jpa-pulsar/src/test/resources/dnsservice.xml AL mpt/impl/smtp/jpa-pulsar/src/test/resources/mailetcontainer.xml AL mpt/impl/smtp/jpa-pulsar/src/test/resources/domainlist.xml AL mpt/impl/smtp/jpa-pulsar/src/test/resources/mailrepositorystore.xml AL mpt/impl/smtp/jpa-pulsar/src/test/resources/usersrepository.xml AL mpt/impl/smtp/jpa-pulsar/src/test/resources/recipientrewritetable.xml B mpt/impl/smtp/jpa-pulsar/src/test/resources/keystore AL mpt/impl/smtp/jpa-pulsar/src/test/resources/smtpserver.xml AL mpt/impl/smtp/jpa-pulsar/src/test/java/org/apache/james/mpt/smtp/JpaPulsarForwardSmtpTest.java AL mpt/impl/smtp/jpa-pulsar/src/test/java/org/apache/james/mpt/smtp/JpaPulsarSmtpStarttlsCommandTest.java AL mpt/impl/smtp/jpa-pulsar/pom.xml AL mpt/impl/smtp/cassandra/src/test/resources/dnsservice.xml AL mpt/impl/smtp/cassandra/src/test/resources/lmtpserver.xml AL mpt/impl/smtp/cassandra/src/test/resources/mailetcontainer.xml AL mpt/impl/smtp/cassandra/src/test/resources/imapserver.xml AL mpt/impl/smtp/cassandra/src/test/resources/managesieveserver.xml AL mpt/impl/smtp/cassandra/src/test/resources/domainlist.xml AL mpt/impl/smtp/cassandra/src/test/resources/mailrepositorystore.xml AL mpt/impl/smtp/cassandra/src/test/resources/recipientrewritetable.xml B mpt/impl/smtp/cassandra/src/test/resources/keystore AL mpt/impl/smtp/cassandra/src/test/resources/smtpserver.xml AL mpt/impl/smtp/cassandra/src/test/resources/pop3server.xml AL mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpStarttlsCommandTest.java AL mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraForwardSmtpTest.java AL mpt/impl/smtp/cassandra/pom.xml AL mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/host/FileHostSystem.java AL mpt/impl/managesieve/file/src/test/java/org/apache/james/mpt/managesieve/file/FileManageSieveMPTTest.java AL mpt/impl/managesieve/file/pom.xml AL mpt/impl/managesieve/pom.xml AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/deletescript.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/authenticate.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/noop.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/renamescript.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/authenticateBase64.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/unauthenticate.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/havespace.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/setactive.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/checkscript.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/capability.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/listscripts.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/starttls.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/logout.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/getscript.test AL mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/putscript.test AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/ManageSieveMPTContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/SetActiveContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/PutScriptContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/HaveSpaceContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/DeleteScriptContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/StartTlsContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/AuthenticateContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/UnauthenticatedContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/NoopContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/CheckScriptContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/LogoutContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/GetScriptContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/RenameScriptContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/ListScriptsContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/CapabilityContract.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/HostSystemProvider.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveHostSystem.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java AL mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveSession.java AL mpt/impl/managesieve/core/pom.xml AL mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraManageSieveMPTTest.java AL mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java AL mpt/impl/managesieve/cassandra/pom.xml AL mpt/impl/imap-mailbox/opensearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/OpenSearchUidSearchOnIndexTest.java AL mpt/impl/imap-mailbox/opensearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/OpenSearchRecentTest.java AL mpt/impl/imap-mailbox/opensearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/PublicTemporaryFolder.java AL mpt/impl/imap-mailbox/opensearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/OpenSearchHostSystem.java AL mpt/impl/imap-mailbox/opensearch/pom.xml N mpt/impl/imap-mailbox/LICENSE.txt AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQSecurityTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQAuthenticatePlainTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQEventsTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQSelectedInboxTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQCondstoreTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQCopyTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQMailboxAnnotationTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQRenameTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQFetchHeadersTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQSelectedStateTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQUidSearchTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQFetchBodySectionTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQListingWithSharingTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQUserFlagsSupportTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQSelectTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystemExtension.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQConcurrentSessionsTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQPartialFetchTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQQuotaTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQListingTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQMoveTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQNonAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQFetchTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQSearchTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQFetchBodyStructureTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQMailboxWithLongNameErrorTest.java AL mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/RabbitMQObjectIdeTest.java AL mpt/impl/imap-mailbox/rabbitmq/pom.xml N mpt/impl/imap-mailbox/NOTICE.txt AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneMailboxWithLongNameErrorTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneMailboxAnnotationTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneSelectedStateTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneCondstoreTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneListingTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneSelectedInboxTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneNonAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneUidSearchOnIndexTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneCopyTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneExpungeTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LucenePartialFetchTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneRenameTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneSecurityTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneMoveTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneEventsTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneAuthenticatePlainTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneQuotaTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneFetchTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneConcurrentSessionsTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneRecentTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneFetchHeadersTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneObjectIdTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneFetchBodySectionTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneUserFlagsSupportTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneFetchBodyStructureTest.java AL mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/LuceneSelectTest.java AL mpt/impl/imap-mailbox/lucenesearch/pom.xml AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/CyrusACLIntegration.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/MailboxMessageAppenderOnCyrusHost.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusUserAdder.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/Docker.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/GrantRightsOnCyrusHost.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/CyrusACLCommands.java AL mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/CyrusMailboxTestModule.java AL mpt/impl/imap-mailbox/cyrus/src/reporting-site/site.xml AL mpt/impl/imap-mailbox/cyrus/pom.xml AL mpt/impl/imap-mailbox/external-james/src/test/resources/org/apache/james/imap/scripts/SelectThenFetchWithExistingMessages.test AL mpt/impl/imap-mailbox/external-james/src/test/resources/org/apache/james/imap/scripts/ValidateDeployment.test AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerJamesRule.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/JamesDeploymentValidationTest.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ExternalJamesModule.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/ProvisioningAPI.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/SmtpHostSystem.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfiguration.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesSmtpHostSystem.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesConfigurationEnvironnementVariables.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/StaticJamesConfiguration.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DeploymentValidation.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/ProvisioningException.java AL mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java AL mpt/impl/imap-mailbox/external-james/src/reporting-site/site.xml AL mpt/impl/imap-mailbox/external-james/pom.xml AL mpt/impl/imap-mailbox/pom.xml N mpt/impl/imap-mailbox/core/LICENSE.txt N mpt/impl/imap-mailbox/core/NOTICE.txt AL mpt/impl/imap-mailbox/core/src/main/resources/log4j.properties AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-sender.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/multipart-alt.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-group-addresses.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-mixed.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/mime-plain-text.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/multipart-alt-translation.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-alt-reply.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/multipart-mixed.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-resent.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-trace.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-hello-world.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-alt-reply3.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-reply.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-alt-another-reply.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/multipart-mixed-complex.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/multipart-binary.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-example.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-mixed-alt.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/wild-alt-reply4.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/samples/rfc822-multiple-addresses.mail AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SelectUnseen.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/HeaderPartialFetch.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Noop.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentFetchResponse.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/MetadataWithLimitation.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/UserFlagsSupport.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/NoCommand.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SelectedStateSetup.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRTE.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRA.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Quota.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Store.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Metadata.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListPlus.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Replace.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/RenameInbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/UidSearchAtomsIndexer.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SearchSaveDate.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ValidAuthenticated.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchNILSaveDate.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/InboxDeleteMessages.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Login.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentRenameSelected.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Uid.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/TextPartialFetch.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchEnvelope.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentDeleteSelected.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AppendExpunge.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/MimePartialFetch.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListSubscribed.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListSpecialChar.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SearchCombinations.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchPeek.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLR.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ComplexMail.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Rights.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/DeleteInbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/PeekMultipartMixedComplex.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListNamespace.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchMultipartAlternative.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SelectAppend.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Concurrent.todo.txt AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Create.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchBodyNoSection.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/RenameSharedMailbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/InboxAddMessages.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchRFC822Header.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/XList.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/PeekMultipartAlternative.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithSharedMailbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Expunge.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListPercentWildcard.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchRFC822.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRT.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Append.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/LoginThreeStrikes.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AppendToSelected.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Capability.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentExistsResponse.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SelectEmpty.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CreateErrorWithLongName.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Delete.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SelectedStateCleanup.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRW.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ValidSelected.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ExpungeBasics.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchRFC822Mixed.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Subscribe.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ACLCommandsOnOtherUser.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Namespace.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessL.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentCrossExpunge.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/PeekMultipartMixed.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Id.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchMultipartBodyStructure.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Move.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/BadTag.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchSaveDate.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchSingleMessage.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Logout.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchStructureComplex.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/UidSearchCombinations.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRK.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Authenticate.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Rename.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchStructureEmbedded.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SelectInbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/JustTag.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/NoTag.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightK.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightX.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightA.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyWithoutS.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightL.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyWithoutT.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyIS.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightE.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightW.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightL.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyIT.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightT.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyI.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightIS.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightA.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightK.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightIT.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightIW.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightR.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightS.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightRT.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightRW.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationWithoutRightI.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyWithoutW.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightX.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightI.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightRS.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightRE.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyWithoutI.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationCopyIW.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/aclIntegration/ACLIntegrationRightR.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListMailboxes.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListOnly.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CondstoreDisable.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentAppendUIDToMSNMapping.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/BogusCommand.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentExpungeResponse.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/UidSearchAtoms.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Check.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchPartial.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Recent.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/MetadataWithBinaryData.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchRFC822Text.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SearchOptionSave.test !????? mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithPercentWildcardInMailboxName.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchHeaderFieldsNot.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Copy.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SearchOptionAggregations.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ValidNonAuthenticated.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchMultipartMixedComplex.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ACLCommandsOnOwner.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentRenameSelectedSub.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ExamineEmpty.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AppendExamineInbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ConcurrentExpungeUIDToMSNMapping.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/RenameSelected.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/MoveNoMSG.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchAllEmptyMailbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/StringArgs.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/RenameHierarchy.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchInternalDate.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRS.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchHeaderFields.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/IllegalTag.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchMultipleMessages.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchText.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Search.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AppendSelectInbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRI.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Status.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharedMailbox.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/Welcome.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SharingAccessLRX.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/SearchAtoms.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchMultipartMixed.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/BodyPartialFetch.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/FetchSimpleBodyStructure.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ObjectId.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/CondstoreEnable.test AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/mailboxmanager/testdata/DefaultMailboxManagerConf.xml AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/mailboxmanager/testdata/VirtualRepositoryMix.xml AL mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/mailboxmanager/testdata/MixedMailstores.xml !????? mpt/impl/imap-mailbox/core/src/main/resources/logback.xml AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/GrantRightsOnHost.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/UserFlagsSupport.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Condstore.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Events.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLCommands.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/MailboxWithLongNameError.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ListingWithRelaxedMailboxName.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Search.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/PartialFetch.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ConcurrentSessions.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedState.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/FetchHeaders.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatedState.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Security.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/SelectedInbox.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ObjectId.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLIntegration.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ListingWithSharingTest.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLScriptedTestProtocol.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/FetchBodySection.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Expunge.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Rename.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Listing.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/UidSearch.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/UidSearchOnIndex.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/base/BasicImapCommands.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/MailboxAnnotation.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Copy.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Fetch.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/NonAuthenticatedState.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/FetchBodyStructure.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/IMAPSharingAccessTest.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Select.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Move.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/Recent.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/QuotaTest.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/ImapTestConstants.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/MailboxMessageAppender.java AL mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java AL mpt/impl/imap-mailbox/core/src/reporting-site/site.xml AL mpt/impl/imap-mailbox/core/pom.xml N mpt/impl/imap-mailbox/inmemory/LICENSE.txt N mpt/impl/imap-mailbox/inmemory/NOTICE.txt AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryQuotaTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemorySecurityTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryRecentTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryCondstoreTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxAnnotationTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryExpungeTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryAuthenticatePlainTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryNonAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryPartialFetchTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryCopyTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryObjectIdTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryFetchHeadersTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryListingWithSharingTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryUserFlagsSupportTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryConcurrentSessionsTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryRenameTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryListingWithRelaxedMailboxNameTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemorySelectedStateTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemorySearchTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryUidSearchTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxWithLongNameErrorTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemorySelectedInboxTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryFetchBodySectionTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMoveTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryIMAPSharingAccessTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryFetchBodyStructureTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryEventsTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryUidSearchOnIndexTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemorySelectTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryListingTest.java AL mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryFetchTest.java AL mpt/impl/imap-mailbox/inmemory/src/reporting-site/site.xml AL mpt/impl/imap-mailbox/inmemory/pom.xml N mpt/impl/imap-mailbox/jpa/LICENSE.txt N mpt/impl/imap-mailbox/jpa/NOTICE.txt AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaUidSearchTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaEventsTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaSecurityTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaFetchBodySectionTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaFetchBodyStructureTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaMailboxWithLongNameErrorTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaPartialFetchTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaCondstoreTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaAuthenticatePlainTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaSelectTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaMoveTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaNonAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaUserFlagsSupportTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaQuotaTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaCopyTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaExpungeTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaSelectedInboxTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaRenameTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaListingTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaConcurrentSessionsTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaFetchHeadersTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaUidSearchOnIndexTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystemExtension.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaFetchTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaSearchTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaMailboxAnnotationTest.java AL mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/JpaSelectedStateTest.java AL mpt/impl/imap-mailbox/jpa/src/reporting-site/site.xml AL mpt/impl/imap-mailbox/jpa/pom.xml AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresSelectTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresMailboxAnnotationTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresSelectedStateTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresConcurrentSessionsTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresSecurityTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresExpungeTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresFetchTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresFetchHeadersTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresCondstoreTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresMoveTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresRenameTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresMailboxWithLongNameErrorTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresSearchTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresListingTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresEventsTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresCopyTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresNonAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresUserFlagsSupportTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresQuotaTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresUidSearchOnIndexTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresPartialFetchTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystemExtension.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresFetchBodySectionTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresFetchBodyStructureTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresUidSearchTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresAuthenticatePlainTest.java AL mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/PostgresSelectedInboxTest.java AL mpt/impl/imap-mailbox/postgres/pom.xml !????? mpt/impl/imap-mailbox/cassandra/src/test/resources/cassandra-driver.conf AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraCondstoreTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraSecurityTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxAnnotationTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraRenameTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraUidSearchTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraUidSearchOnIndexTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraFetchBodyStructureTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMoveTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraQuotaTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraListingWithSharingTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraObjectIdTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraConcurrentSessionsTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxWithLongNameErrorTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraExpungeTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraNonAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraAuthenticatePlainTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraPartialFetchTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraUserFlagsSupportTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraFetchHeadersTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystemExtension.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraEventsTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraAuthenticatedStateTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraSearchTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraFetchBodySectionTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraSelectedStateTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraFetchTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraCopyTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraListingTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraSelectedInboxTest.java AL mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraSelectTest.java AL mpt/impl/imap-mailbox/cassandra/src/reporting-site/site.xml AL mpt/impl/imap-mailbox/cassandra/pom.xml B mpt/app/src/site/resources/images/asf-logo-reduced.gif B mpt/app/src/site/resources/images/james-mpt-logo.gif AL mpt/app/src/site/xdoc/index.xml AL mpt/app/src/site/site.xml AL mpt/app/src/main/java/org/apache/james/mpt/app/RunScript.java AL mpt/app/src/main/java/org/apache/james/mpt/app/Main.java AL mpt/app/src/reporting-site/site.xml AL mpt/app/pom.xml AL mpt/src/reporting-site/site.xml AL mpt/pom.xml B mpt/core/src/site/resources/images/asf-logo-reduced.gif B mpt/core/src/site/resources/images/james-mpt-logo.gif AL mpt/core/src/site/xdoc/index.xml AL mpt/core/src/site/site.xml AL mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSession.java AL mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSessionFactory.java AL mpt/core/src/main/java/org/apache/james/mpt/script/SimpleScriptedTestProtocol.java AL mpt/core/src/main/java/org/apache/james/mpt/script/ImapScriptedTestProtocol.java AL mpt/core/src/main/java/org/apache/james/mpt/script/GenericSimpleScriptedTestProtocol.java AL mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSessionBuilder.java AL mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSession.java AL mpt/core/src/main/java/org/apache/james/mpt/protocol/FileProtocolSessionBuilder.java AL mpt/core/src/main/java/org/apache/james/mpt/api/SessionFactory.java AL mpt/core/src/main/java/org/apache/james/mpt/api/Continuation.java AL mpt/core/src/main/java/org/apache/james/mpt/api/Monitor.java AL mpt/core/src/main/java/org/apache/james/mpt/api/DomainAdder.java AL mpt/core/src/main/java/org/apache/james/mpt/api/ImapFeatures.java AL mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java AL mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java AL mpt/core/src/main/java/org/apache/james/mpt/api/ProtocolInteractor.java AL mpt/core/src/main/java/org/apache/james/mpt/api/HostSystem.java AL mpt/core/src/main/java/org/apache/james/mpt/api/Session.java AL mpt/core/src/main/java/org/apache/james/mpt/exception/InvalidServerResponseException.java AL mpt/core/src/main/java/org/apache/james/mpt/monitor/NullMonitor.java AL mpt/core/src/main/java/org/apache/james/mpt/monitor/SystemLoggingMonitor.java AL mpt/core/src/main/java/org/apache/james/mpt/user/ScriptedUserAdder.java AL mpt/core/src/main/java/org/apache/james/mpt/helper/ByteBufferOutputStream.java AL mpt/core/src/main/java/org/apache/james/mpt/helper/ScriptBuilder.java AL mpt/core/src/main/java/org/apache/james/mpt/helper/CreateScript.java AL mpt/core/src/main/java/org/apache/james/mpt/helper/ByteBufferInputStream.java AL mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java AL mpt/core/src/main/java/org/apache/james/mpt/Runner.java AL mpt/core/src/test/java/org/apache/james/mpt/DiscardProtocolTest.java AL mpt/core/src/test/java/org/apache/james/mpt/TestExternalHostSystem.java AL mpt/core/src/test/java/org/apache/james/mpt/api/ImapFeaturesTest.java AL mpt/core/src/test/java/org/apache/james/mpt/TestFileProtocolSessionBuilder.java AL mpt/core/src/test/java/org/apache/james/mpt/TestScriptedUserAdder.java AL mpt/core/src/test/java/org/apache/james/mpt/DiscardProtocol.java AL mpt/core/src/reporting-site/site.xml AL mpt/core/pom.xml B debian@imap.linagora.com !????? upgrade-instructions.md !????? code-coverage-report/pom.xml !????? CHANGELOG.md !????? third-party/rspamd/docker-compose.yml AL third-party/rspamd/src/main/java/org/apache/james/rspamd/module/RspamdModule.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/module/RspamdTaskExtensionModule.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/RspamdListener.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/GetMailboxMessagesService.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskDTO.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskDTO.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTO.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/RunningOptions.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTO.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/model/AnalysisResult.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/model/AnalysisResultDeserializer.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/route/FeedMessageRoute.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/exception/UnauthorizedException.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/exception/RspamdUnexpectedException.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/client/RspamdHttpClient.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/client/RspamdClientConfiguration.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/RspamdScanner.java AL third-party/rspamd/src/main/java/org/apache/james/rspamd/healthcheck/RspamdHealthCheck.java B third-party/rspamd/src/test/resources/json/feedSpamEmptyRspamdTimeout.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedHamClassifiedAsHam.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedHamNonEmptyRspamdTimeout.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedSpamNonEmptyRspamdTimeout.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedHamNonEmptyPeriod.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedSpamEmptyPeriod.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedSpamNonEmptyPeriod.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedSpamClassifiedAsHam.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedHamEmptyRspamdTimeout.additionalInformation.json B third-party/rspamd/src/test/resources/json/feedHamEmptyPeriod.additionalInformation.json !????? third-party/rspamd/src/test/resources/rspamd-config/actions.conf !????? third-party/rspamd/src/test/resources/rspamd-config/worker-controller.inc !????? third-party/rspamd/src/test/resources/rspamd-config/antivirus.conf !????? third-party/rspamd/src/test/resources/rspamd-config/redis.conf !????? third-party/rspamd/src/test/resources/rspamd-config/statistic.conf !????? third-party/rspamd/src/test/resources/mail/ham/ham1.eml !????? third-party/rspamd/src/test/resources/mail/attachment/inlineVirusTextAttachment.eml !????? third-party/rspamd/src/test/resources/mail/attachment/inlineNonVirusTextAttachment.eml !????? third-party/rspamd/src/test/resources/mail/spam/phishing.eml !????? third-party/rspamd/src/test/resources/mail/spam/spam8.eml AL third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTOTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTOTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdScannerTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/DockerRspamdExtensionTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/model/AnalysisResultDeserializationTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/route/FeedMessageRouteTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/client/RspamdHttpClientTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdExtension.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/healthcheck/RspamdHealthcheckTest.java AL third-party/rspamd/src/test/java/org/apache/james/rspamd/RspamdListenerTest.java AL third-party/rspamd/pom.xml !????? third-party/rspamd/README.md AL third-party/rspamd/sample-configuration/webadmin.properties AL third-party/rspamd/sample-configuration/listeners.xml !????? third-party/rspamd/sample-configuration/extensions.properties !????? third-party/rspamd/sample-configuration/worker-controller.inc !????? third-party/rspamd/sample-configuration/antivirus.conf AL third-party/rspamd/sample-configuration/mailetcontainer_distributed.xml AL third-party/rspamd/sample-configuration/mailetcontainer_memory.xml !????? third-party/rspamd/sample-configuration/redis.conf !????? third-party/rspamd/sample-configuration/statistic.conf AL third-party/rspamd/sample-configuration/healthcheck.properties !????? third-party/rspamd/sample-configuration/rspamd.properties !????? third-party/rspamd/docker-compose-distributed.yml !????? third-party/elasticsearch/docker-compose.yml AL third-party/elasticsearch/src/main/java/org/apache/james/metrics/es/v7/ESReporterConfiguration.java AL third-party/elasticsearch/src/main/java/org/apache/james/metrics/es/v7/ESMetricReporterModule.java AL third-party/elasticsearch/src/main/java/org/apache/james/metrics/es/v7/ESMetricReporter.java AL third-party/elasticsearch/src/test/java/org/apache/james/metric/es/v7/ESReporterContract.java AL third-party/elasticsearch/src/test/java/org/apache/james/metric/es/v7/ES2ReporterTest.java AL third-party/elasticsearch/src/test/java/org/apache/james/metric/es/v7/ES7ReporterTest.java AL third-party/elasticsearch/src/test/java/org/apache/james/metric/es/v7/ESReportedConfigurationTest.java AL third-party/elasticsearch/src/test/java/org/apache/james/metric/es/v7/ES6ReporterTest.java AL third-party/elasticsearch/src/test/java/org/apache/james/metric/es/v7/DockerElasticSearchExtension.java AL third-party/elasticsearch/pom.xml !????? third-party/elasticsearch/conf/extensions.properties !????? third-party/elasticsearch/conf/elasticsearch.properties !????? third-party/elasticsearch/README.md !????? third-party/clamav/docker-compose.yml AL third-party/clamav/src/main/java/org/apache/james/clamav/ClamAVScan.java !????? third-party/clamav/src/test/resources/attachment/inlineVirusTextAttachment.eml !????? third-party/clamav/src/test/resources/attachment/inlineNonVirusTextAttachment.eml AL third-party/clamav/src/test/java/org/apache/james/clamav/DockerClamAV.java AL third-party/clamav/src/test/java/org/apache/james/clamav/ClamAVScanTest.java AL third-party/clamav/pom.xml !????? third-party/clamav/README.md AL third-party/clamav/sample-configuration/mailetcontainer.xml !????? third-party/crowdsec/Dockerfile !????? third-party/crowdsec/docker-compose.yml AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/module/CrowdsecModule.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/CrowdsecSMTPConnectHandler.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/CrowdsecService.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/model/CrowdsecDecision.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/model/CrowdsecDecisionDeserializer.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/CrowdsecEhloHook.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/CrowdsecPOP3CheckHandler.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/exception/CrowdsecException.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/client/CrowdsecClientConfiguration.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/client/CrowdsecHttpClient.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/CrowdsecImapConnectionCheck.java AL third-party/crowdsec/src/main/java/org/apache/james/crowdsec/CrowdsecUtils.java AL third-party/crowdsec/src/test/resources/logback-test.xml AL third-party/crowdsec/src/test/resources/listeners.xml AL third-party/crowdsec/src/test/resources/mailetcontainer.xml !????? third-party/crowdsec/src/test/resources/crowdsec/collections/james.yaml !????? third-party/crowdsec/src/test/resources/crowdsec/parsers/james-dictionary-attack.yaml !????? third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml !????? third-party/crowdsec/src/test/resources/crowdsec/parsers/james-auth.yaml !????? third-party/crowdsec/src/test/resources/crowdsec/acquis.yaml !????? third-party/crowdsec/src/test/resources/crowdsec/scenarios/james-bf-auth.yaml !????? third-party/crowdsec/src/test/resources/crowdsec/scenarios/james-dictionary-attack.yaml !????? third-party/crowdsec/src/test/resources/haproxy.cfg AL third-party/crowdsec/src/test/resources/imapserver.xml AL third-party/crowdsec/src/test/resources/usersrepository.xml !????? third-party/crowdsec/src/test/resources/log/james.log AL third-party/crowdsec/src/test/resources/smtpserver.xml AL third-party/crowdsec/src/test/resources/pop3server.xml AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecEhloHookTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecDecisionDeserializerTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/DockerCrowdsecExtensionTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecImapConnectionCheckTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecHttpClientTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecServiceTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecExtension.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecIntegrationTest.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/HAProxyExtension.java AL third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecSMTPConnectHandlerTest.java AL third-party/crowdsec/pom.xml !????? third-party/crowdsec/README.md !????? third-party/crowdsec/sample-configuration/collections/james.yaml !????? third-party/crowdsec/sample-configuration/parsers/james-dictionary-attack.yaml !????? third-party/crowdsec/sample-configuration/parsers/syslog-logs.yaml !????? third-party/crowdsec/sample-configuration/parsers/james-auth.yaml !????? third-party/crowdsec/sample-configuration/extensions.properties !????? third-party/crowdsec/sample-configuration/acquis.yaml !????? third-party/crowdsec/sample-configuration/scenarios/james-bf-auth.yaml !????? third-party/crowdsec/sample-configuration/scenarios/james-dictionary-attack.yaml !????? third-party/crowdsec/sample-configuration/crowdsec.properties AL third-party/crowdsec/sample-configuration/imapserver.xml AL third-party/crowdsec/sample-configuration/logback.xml AL third-party/crowdsec/sample-configuration/smtpserver.xml AL third-party/crowdsec/sample-configuration/pop3server.xml !????? third-party/spamassassin/docker-compose.yml AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinHandler.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinInvoker.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinListener.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinLearner.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinModule.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinResult.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassinConfiguration.java AL third-party/spamassassin/src/main/java/org/apache/james/spamassassin/SpamAssassin.java AL third-party/spamassassin/src/test/resources/listeners.xml AL third-party/spamassassin/src/test/resources/mailetcontainer.xml !????? third-party/spamassassin/src/test/resources/eml/spam.eml !????? third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham1 !????? third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham3 !????? third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham2 !????? third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam2 !????? third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam3 !????? third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam1 AL third-party/spamassassin/src/test/resources/smtpserver.xml AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/module/SpamAssassinTestModule.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/module/SpamAssassinModuleExtension.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinExtension.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/mock/MockSpamdExtension.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/mock/MockSpamd.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinHandlerTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinIntegrationTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/MemorySpamAssassinTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinContract.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinResultTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinListenerTest.java AL third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinConfigurationTest.java AL third-party/spamassassin/pom.xml AL third-party/spamassassin/sample-configuration/listeners.xml !????? third-party/spamassassin/sample-configuration/extensions.properties AL third-party/spamassassin/sample-configuration/mailetcontainer.xml !????? third-party/spamassassin/sample-configuration/spamassassin.properties AL third-party/spamassassin/sample-configuration/smtpserver.xml AL third-party/pom.xml A message-fast-view-cleanup-extension.jar AL javax-mail-extension/src/main/java/org/apache/james/javax/AddressHelper.java AL javax-mail-extension/src/main/java/org/apache/james/javax/MimeMultipartReport.java AL javax-mail-extension/src/main/java/org/apache/james/javax/MultipartUtil.java AL javax-mail-extension/pom.xml AL checkstyle.xml !????? event-sourcing/event-sourcing-core/event-sourcing-core.iml AL event-sourcing/event-sourcing-core/src/main/scala/org/apache/james/eventsourcing/EventBus.scala AL event-sourcing/event-sourcing-core/src/main/scala/org/apache/james/eventsourcing/EventSourcingSystem.scala AL event-sourcing/event-sourcing-core/src/main/scala/org/apache/james/eventsourcing/Subscriber.scala AL event-sourcing/event-sourcing-core/src/main/scala/org/apache/james/eventsourcing/CommandDispatcher.scala AL event-sourcing/event-sourcing-core/src/main/java/org/apache/james/eventsourcing/CommandHandler.java AL event-sourcing/event-sourcing-core/src/test/scala/org/apache/james/eventsourcing/EventSourcingSystemTest.scala AL event-sourcing/event-sourcing-core/src/test/scala/org/apache/james/eventsourcing/DataCollectorSubscriber.scala AL event-sourcing/event-sourcing-core/pom.xml AL event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreModule.scala AL event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStore.scala AL event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/EventStoreDao.scala AL event-sourcing/event-store-cassandra/src/main/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTable.scala AL event-sourcing/event-store-cassandra/src/test/scala/org/apache/james/eventsourcing/eventstore/cassandra/JsonEventSerializerTest.scala AL event-sourcing/event-store-cassandra/src/test/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtensionForTestEvents.scala AL event-sourcing/event-store-cassandra/src/test/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreTest.scala AL event-sourcing/event-store-cassandra/src/test/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventSourcingSystemTest.scala AL event-sourcing/event-store-cassandra/src/test/scala/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.scala AL event-sourcing/event-store-cassandra/pom.xml AL event-sourcing/event-store-jpa/src/main/java/org/apache/james/eventsourcing/eventstore/jpa/JPAEventStore.java AL event-sourcing/event-store-jpa/src/main/java/org/apache/james/eventsourcing/eventstore/jpa/model/JPAEvent.java AL event-sourcing/event-store-jpa/src/test/resources/persistence.xml AL event-sourcing/event-store-jpa/src/test/java/org/apache/james/eventsourcing/eventstore/jpa/model/JPAEventTest.java AL event-sourcing/event-store-jpa/src/test/java/org/apache/james/eventsourcing/eventstore/jpa/JPAEventStoreTest.java AL event-sourcing/event-store-jpa/src/test/java/org/apache/james/eventsourcing/eventstore/jpa/JPAEventSourcingSystemTest.java AL event-sourcing/event-store-jpa/src/test/java/org/apache/james/eventsourcing/eventstore/jpa/JPAEventStoreExtension.java AL event-sourcing/event-store-jpa/pom.xml AL event-sourcing/event-sourcing-pojo/src/main/scala/org/apache/james/eventsourcing/EventId.scala AL event-sourcing/event-sourcing-pojo/src/main/scala/org/apache/james/eventsourcing/Event.scala AL event-sourcing/event-sourcing-pojo/src/main/scala/org/apache/james/eventsourcing/AggregateId.scala AL event-sourcing/event-sourcing-pojo/src/main/scala/org/apache/james/eventsourcing/Command.scala AL event-sourcing/event-sourcing-pojo/src/test/scala/org/apache/james/eventsourcing/TestAggregateId.scala AL event-sourcing/event-sourcing-pojo/src/test/scala/org/apache/james/eventsourcing/TestEvent.scala AL event-sourcing/event-sourcing-pojo/src/test/scala/org/apache/james/eventsourcing/EventIdTest.scala AL event-sourcing/event-sourcing-pojo/pom.xml AL event-sourcing/event-store-postgres/src/main/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventStoreModule.java AL event-sourcing/event-store-postgres/src/main/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventStoreDAO.java AL event-sourcing/event-store-postgres/src/main/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventStore.java AL event-sourcing/event-store-postgres/src/test/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventStoreExtensionForTestEvents.java AL event-sourcing/event-store-postgres/src/test/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventStoreExtension.java AL event-sourcing/event-store-postgres/src/test/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventStoreTest.java AL event-sourcing/event-store-postgres/src/test/java/org/apache/james/eventsourcing/eventstore/postgres/PostgresEventSourcingSystemTest.java AL event-sourcing/event-store-postgres/pom.xml AL event-sourcing/pom.xml AL event-sourcing/event-store-memory/src/main/scala/org/apache/james/eventsourcing/eventstore/memory/InMemoryEventStore.scala AL event-sourcing/event-store-memory/src/test/scala/org/apache/james/eventsourcing/eventstore/memory/InMemoryEventStoreExtension.scala AL event-sourcing/event-store-memory/src/test/scala/org/apache/james/eventsourcing/eventstore/memory/InMemoryEventSourcingSystemTest.scala AL event-sourcing/event-store-memory/src/test/scala/org/apache/james/eventsourcing/eventstore/memory/InMemoryEventStoreTest.scala AL event-sourcing/event-store-memory/pom.xml AL event-sourcing/event-store-api/src/main/scala/org/apache/james/eventsourcing/eventstore/EventStoreFailedException.scala AL event-sourcing/event-store-api/src/main/scala/org/apache/james/eventsourcing/eventstore/JsonEventSerializer.scala AL event-sourcing/event-store-api/src/main/scala/org/apache/james/eventsourcing/eventstore/History.scala AL event-sourcing/event-store-api/src/main/scala/org/apache/james/eventsourcing/eventstore/EventStore.scala AL event-sourcing/event-store-api/src/main/scala/org/apache/james/eventsourcing/eventstore/dto/EventDTOModule.scala AL event-sourcing/event-store-api/src/main/scala/org/apache/james/eventsourcing/eventstore/dto/EventDTO.scala AL event-sourcing/event-store-api/src/main/java/org/apache/james/eventsourcing/eventstore/EventNestedTypes.java AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/HistoryTest.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/EventStoreContract.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/dto/TestEventDTOModules.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/dto/OtherTestEventDTO.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/dto/OtherEvent.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/dto/SnapshotEvent.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/dto/SnapshotEventDTO.scala AL event-sourcing/event-store-api/src/test/scala/org/apache/james/eventsourcing/eventstore/dto/TestEventDTO.scala AL event-sourcing/event-store-api/pom.xml AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ReadAliasName.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/OpenSearchIndexer.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/DocumentId.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/DeleteByQueryPerformer.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/AliasName.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ClientProvider.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/search/ScrolledSearch.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/IndexCreationFactory.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/OpenSearchHealthCheck.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/RoutingKey.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/OpenSearchConfiguration.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/WriteAliasName.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ReactorOpenSearchClient.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/IndexName.java AL backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/UpdatedRepresentation.java !????? backends-common/opensearch/src/test/resources/auth-es/nginx-conf/reverse_elasticsearch.conf !????? backends-common/opensearch/src/test/resources/auth-es/nginx-conf/passwd !????? backends-common/opensearch/src/test/resources/auth-es/NginxDockerfile !????? backends-common/opensearch/src/test/resources/auth-es/README.md !????? backends-common/opensearch/src/test/resources/auth-es/default.key !????? backends-common/opensearch/src/test/resources/auth-es/default.crt B backends-common/opensearch/src/test/resources/auth-es/server.jks AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/OpenSearchClusterExtension.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/ClientProviderTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/IndexCreationFactoryTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/ClientProviderImplConnectionAuthESOverrideTrustStoreTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/OpenSearchIndexerTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/ClientProviderImplConnectionContract.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/DockerAuthOpenSearchSingleton.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/ClientProviderImplConnectionAuthESIgnoreSSLCheckTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/DockerOpenSearchExtension.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/OpenSearchConfigurationTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/RoutingKeyTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/search/ScrolledSearchTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/OpenSearchHealthCheckConnectionTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/DockerOpenSearch.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/AliasNameTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/DockerOpenSearchSingleton.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/OpenSearchHealthCheckTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/ClientProviderImplConnectionNoAuthESTest.java AL backends-common/opensearch/src/test/java/org/apache/james/backends/opensearch/DocumentIdTest.java AL backends-common/opensearch/pom.xml AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/SimpleConnectionPool.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQConfiguration.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReceiverProvider.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQServerVersion.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/QueueArguments.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQConnectionFactory.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/Constants.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheck.java AL backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQManagementAPI.java B backends-common/rabbitmq/src/test/resources/test-keystore-password-password B backends-common/rabbitmq/src/test/resources/test-truststore-password-password !????? backends-common/rabbitmq/src/test/resources/empty-store AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQClusterTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQServerVersionTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQWaitStrategy.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQConfigurationTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/DockerRabbitMQSingleton.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQConnectionFactoryTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/DockerRabbitMQ.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ChannelPoolContract.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/InMemoryConsumer.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQFixture.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/DockerClusterRabbitMQExtension.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ConstantsTest.java AL backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java AL backends-common/rabbitmq/pom.xml AL backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisHealthCheck.scala AL backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisClientFactory.scala AL backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala !????? backends-common/redis/src/test/resources/sentinel_tls.conf !????? backends-common/redis/src/test/resources/sentinel.conf B backends-common/redis/src/test/resources/keystore.p12 !????? backends-common/redis/src/test/resources/redis_cluster.conf !????? backends-common/redis/src/test/resources/private.key !????? backends-common/redis/src/test/resources/rootCA.crt !????? backends-common/redis/src/test/resources/certificate.crt AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisTLSMasterReplicaHealthCheckTest.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisSentinelExtension.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisTLSExtension.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisHealthCheckTest.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisMasterReplicaExtension.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisSentinelHealthCheckTest.scala AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisConfigurationTest.scala AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisClusterHealthCheckTest.scala AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisExtensionTest.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisTLSStandaloneHealthCheckTest.scala AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisStandaloneHealthCheckTest.scala AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisClusterExtension.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/DockerRedis.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisExtension.java AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisMasterReplicaHealthCheckTest.scala AL backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisTLSSentinelHealthCheckTest.java !????? backends-common/redis/pom.xml !????? backends-common/README.adoc AL backends-common/pom.xml AL backends-common/pulsar/src/main/scala/org/apache/james/backends/pulsar/PulsarConfiguration.scala AL backends-common/pulsar/src/main/scala/org/apache/james/backends/pulsar/PulsarClients.scala AL backends-common/pulsar/src/main/scala/org/apache/james/backends/pulsar/PulsarReader.scala AL backends-common/pulsar/src/test/java/org/apache/james/backends/pulsar/PulsarConfigurationTest.java AL backends-common/pulsar/src/test/java/org/apache/james/backends/pulsar/TestPulsarModule.java AL backends-common/pulsar/src/test/java/org/apache/james/backends/pulsar/DockerPulsarExtension.java AL backends-common/pulsar/src/test/java/org/apache/james/backends/pulsar/PulsarReaderTest.scala AL backends-common/pulsar/pom.xml AL backends-common/jpa/src/main/java/org/apache/james/backends/jpa/EntityManagerUtils.java AL backends-common/jpa/src/main/java/org/apache/james/backends/jpa/TransactionRunner.java AL backends-common/jpa/src/main/java/org/apache/james/backends/jpa/JPAConfiguration.java AL backends-common/jpa/src/test/java/org/apache/james/backends/jpa/JpaTestCluster.java AL backends-common/jpa/src/test/java/org/apache/james/backends/jpa/JPAConfigurationTest.java AL backends-common/jpa/pom.xml AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/PostgresIndex.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/PostgresConfiguration.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/PostgresModule.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/PostgresTable.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/quota/PostgresQuotaCurrentValueDAO.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/quota/PostgresQuotaModule.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/quota/PostgresQuotaLimitDAO.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/RowLevelSecurity.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresExecutor.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresConnectionClosure.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresUtils.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/JamesPostgresConnectionFactory.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresHealthCheck.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PoolBackedPostgresConnectionFactory.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/PostgresTableManager.java AL backends-common/postgres/src/main/java/org/apache/james/backends/postgres/PostgresCommons.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PoolBackedPostgresConnectionFactoryTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/JamesPostgresConnectionFactoryTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresFixture.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresConfigurationTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresTableManagerTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExecutorThreadSafetyTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/quota/PostgresQuotaCurrentValueDAOTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/quota/PostgresQuotaLimitDaoTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExtension.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExtensionTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/utils/PostgresHealthCheckTest.java AL backends-common/postgres/src/test/java/org/apache/james/backends/postgres/DockerPostgresSingleton.java AL backends-common/postgres/pom.xml AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraType.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitTable.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraTable.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueTable.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitDao.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraMutualizedQuotaModule.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraModule.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionModule.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/table/CassandraSchemaVersionTable.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/SchemaTransition.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAO.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/SchemaVersion.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/Migration.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationDTO.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/CassandraSchemaTransitions.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/CassandraMigrationService.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskDTO.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationException.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/LockLessConcurrencyLimitingRequestThrottler.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheck.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraConstants.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/CassandraAsyncExecutor.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/ZonedDateTimeRepresentation.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/utils/LightweightTransactionException.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/KeyspaceFactory.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraZonedDateTimeModule.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesCreator.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTypesProvider.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/KeyspaceConfiguration.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/ClusterConfiguration.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/CassandraConfiguration.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/InjectionNames.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/configuration/JamesExecutionProfiles.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/ClusterFactory.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraTableManager.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/CassandraSessionConfiguration.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactory.java AL backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/ResilientClusterProvider.java !????? backends-common/cassandra/src/test/resources/cassandra-driver.conf !????? backends-common/cassandra/src/test/resources/configuration-reader-test/cassandra.properties AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/components/CassandraTableTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/components/CassandraTypeTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSession.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/SchemaTransitionTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionDAOTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/SchemaVersionTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManagerTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandra.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/StatementRecorder.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraWaitStrategy.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraExtension.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/CassandraMigrationServiceTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaLimitDaoTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/TestingSessionTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraSingleton.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/Scenario.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/PaggingTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/CassandraHealthCheckTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/utils/ZonedDateTimeRepresentationTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/ResilientClusterProviderTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraConfigurationReadingTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/SessionWithInitializedTablesFactoryTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTableManagerTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypeProviderTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTableManagerConcurrentTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraConfigurationTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/CassandraTypesCreatorTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/init/ClusterFactoryTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraCluster.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/ScenarioTest.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java AL backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterTest.java AL backends-common/cassandra/pom.xml !????? README.adoc AL src/site/resources/downloads/codetemplates.xml AL src/site/resources/css/site.css B src/site/resources/favicon.ico B src/site/resources/images/asf-logo-reduced.gif B src/site/resources/images/james-logo.png B src/site/resources/images/james-schema-subprojects.png B src/site/resources/images/linagora.png B src/site/resources/images/james-logo-square.png B src/site/resources/protocols/images/void.gif B src/site/resources/protocols/images/uml/org.apache.james.imap-withtest-package.png B src/site/resources/protocols/images/uml/org.apache.james.imap.api.png B src/site/resources/protocols/images/uml/org.apache.james.protocols-package.png B src/site/resources/protocols/images/uml/org.apache.james.imap-package.png AL src/site/resources/server/css/site.css B src/site/resources/server/images/intellij-idea/intellij-import-layout-java.png B src/site/resources/server/images/intellij-idea/intellij-checkstyle-scan.png B src/site/resources/server/images/intellij-idea/intellij-james-zip.png B src/site/resources/server/images/intellij-idea/intellij-import-layout-scala.png B src/site/resources/server/images/intellij-idea/intellij-mvn.png B src/site/resources/server/images/intellij-idea/intellij-checkstyle-setting.png B src/site/resources/server/images/intellij-idea/intellij-james-project.png B src/site/resources/server/images/intellij-idea/intellij-new-project.png B src/site/resources/server/images/jmx-monitoring/jmx-org.apache.james.smtpserver.JamesDataCmdHandler.png B src/site/resources/server/images/jmx-monitoring/jmx-current-connections.png B src/site/resources/server/images/jmx-monitoring/jmx-gc.png B src/site/resources/server/images/jmx-monitoring/jmx-memory.png B src/site/resources/server/images/jmx-monitoring/jmx-process-root.png B src/site/resources/server/images/eclipse/eclipse-run-james.gif B src/site/resources/server/images/eclipse/eclipse-m2eclipse-projects.gif B src/site/resources/server/images/eclipse/eclipse-import-maven-view-1.gif B src/site/resources/server/images/eclipse/eclipse-m2eclipse-project-dependencies.gif B src/site/resources/server/images/eclipse/eclipse-import-maven-view-2.gif B src/site/resources/server/images/dns-mx/james-config-smart-host.png B src/site/resources/server/images/dns-mx/james-config-secondary.png B src/site/resources/server/images/dns-mx/james-config-load-balance.png B src/site/resources/server/images/conf/config-example.png B src/site/resources/server/images/performances/gatling_1.png B src/site/resources/server/images/performances/metrics.png B src/site/resources/server/images/performances/gatling_2.png B src/site/resources/server/images/void.gif B src/site/resources/server/images/netbeans/james-build-dir.png B src/site/resources/server/images/netbeans/netbeans-james-project.png B src/site/resources/server/images/netbeans/netbeans-svn-checkout2.png B src/site/resources/server/images/netbeans/netbeans-svn-checkout1.png B src/site/resources/server/images/netbeans/netbeans-svn-checkout-browse.png B src/site/resources/server/images/uml/org.apache.james-package_large.png B src/site/resources/server/images/uml/org.apache.james-package-large.png B src/site/resources/server/images/uml/org.apache.james-package-details.png B src/site/resources/server/images/uml/org.apache.james.server-package.png B src/site/resources/server/images/uml/org.apache.james.container-package.png B src/site/resources/server/images/uml/org.apache.james-package-detail_small.png B src/site/resources/server/images/uml/org.apache.james-package-detail_large.png B src/site/resources/server/images/uml/org.apache.james-package-small.png B src/site/resources/server/images/uml/org.apache.james-package.png B src/site/resources/server/images/uml/org.apache.james-package_small.png B src/site/resources/server/images/uml/org.apache.james.management-package.png B src/site/resources/server/images/jmx-management/jmx-domainlist.png B src/site/resources/server/images/jmx-management/jmx-user-part.png B src/site/resources/server/images/jmx-management/jmx-user.png B src/site/resources/server/images/database/james-database-schema-derby_1000.png B src/site/resources/server/images/database/james-database-schema-derby.png AL src/site/resources/server/js/dev.js AL src/site/resources/server/js/index.js !????? src/site/resources/server/rfclist/smtp/rfc1985.txt !????? src/site/resources/server/rfclist/smtp/rfc2554.txt !????? src/site/resources/server/rfclist/smtp/rfc1652.txt !????? src/site/resources/server/rfclist/smtp/rfc1830.txt !????? src/site/resources/server/rfclist/smtp/rfc2142.txt !????? src/site/resources/server/rfclist/smtp/rfc2034.txt !????? src/site/resources/server/rfclist/smtp/rfc1891.txt !????? src/site/resources/server/rfclist/smtp/rfc0974.txt !????? src/site/resources/server/rfclist/smtp/rfc2821.txt !????? src/site/resources/server/rfclist/smtp/rfc1870.txt !????? src/site/resources/server/rfclist/smtp/rfc2197.txt !????? src/site/resources/server/rfclist/smtp/rfc0821.txt !????? src/site/resources/server/rfclist/smtp/rfc1869.txt !????? src/site/resources/server/rfclist/smtp/rfc1893.txt !????? src/site/resources/server/rfclist/smtp/rfc6710.txt !????? src/site/resources/server/rfclist/lmtp/rfc2033.txt !????? src/site/resources/server/rfclist/imap4/rfc2087.txt !????? src/site/resources/server/rfclist/imap4/rfc2221.txt !????? src/site/resources/server/rfclist/imap4/rfc2193.txt !????? src/site/resources/server/rfclist/imap4/rfc2192.txt !????? src/site/resources/server/rfclist/imap4/rfc2088.txt !????? src/site/resources/server/rfclist/imap4/rfc2060.txt !????? src/site/resources/server/rfclist/imap4/rfc2086.txt !????? src/site/resources/server/rfclist/imap4/rfc2342.txt !????? src/site/resources/server/rfclist/imap4/rfc2595.txt !????? src/site/resources/server/rfclist/imap4/rfc2195.txt !????? src/site/resources/server/rfclist/imap4/rfc2180.txt !????? src/site/resources/server/rfclist/imap4/rfc5256.txt !????? src/site/resources/server/rfclist/imap4/rfc2177.txt !????? src/site/resources/server/rfclist/imap4/rfc2683.txt !????? src/site/resources/server/rfclist/imap4/rfc2359.txt !????? src/site/resources/server/rfclist/imap4/rfc1731.txt !????? src/site/resources/server/rfclist/pop3/rfc1725.txt !????? src/site/resources/server/rfclist/pop3/rfc1939.txt !????? src/site/resources/server/rfclist/pop3/rfc1734.txt !????? src/site/resources/server/rfclist/ldap/rfc2830.txt !????? src/site/resources/server/rfclist/ldap/rfc2255.txt !????? src/site/resources/server/rfclist/ldap/rfc2252.txt !????? src/site/resources/server/rfclist/ldap/rfc3377.txt !????? src/site/resources/server/rfclist/ldap/rfc2256.txt !????? src/site/resources/server/rfclist/ldap/rfc2253.txt !????? src/site/resources/server/rfclist/ldap/rfc2829.txt !????? src/site/resources/server/rfclist/ldap/rfc2254.txt !????? src/site/resources/server/rfclist/ldap/rfc2251.txt !????? src/site/resources/server/rfclist/basic/rfc0822.txt !????? src/site/resources/server/rfclist/basic/rfc2046.txt !????? src/site/resources/server/rfclist/basic/rfc2822.txt !????? src/site/resources/server/rfclist/basic/rfc1123.txt !????? src/site/resources/server/rfclist/basic/rfc2045.txt AL src/site/resources/mailet/css/site.css AL src/site/resources/js/james/index.js AL src/site/resources/js/james/functions.js B src/site/resources/mailbox/images/james-server-logo.gif B src/site/resources/mailbox/images/void.gif B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-maildir-managers.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-api-mailboxsession.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-api-messagemanager.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-package.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-api-mailboxmanager.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-store-mailboxmanager.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-memory-managers.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-store-model.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-api-subscriptionmanager.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-store-subscriptionmanager.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-jpa-managers.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-store-messagemanager.png B src/site/resources/mailbox/images/uml/org-apache-james-mailbox-api-msc.png !????? src/site/markdown/server/manage-guice-distributed-james.md !????? src/site/markdown/server/manage-cli.md !????? src/site/markdown/server/install/guice-cassandra-rabbitmq-s3.md !????? src/site/markdown/server/install/guice-cassandra.md !????? src/site/markdown/server/install/guice-jpa.md !????? src/site/markdown/server/install/guice-jpa-smtp.md !????? src/site/markdown/server/manage-webadmin.md !????? src/site/markdown/mailet/release-notes.md !????? src/site/markdown/mailet/quickstart.md AL src/site/custom/project-info-report.properties AL src/site/xdoc/mpt/index.xml AL src/site/xdoc/mail.xml AL src/site/xdoc/download.xml AL src/site/xdoc/contribute.xml AL src/site/xdoc/thanks.xml AL src/site/xdoc/documentation.xml AL src/site/xdoc/support.xml AL src/site/xdoc/protocols/index.xml AL src/site/xdoc/protocols/pop3.xml AL src/site/xdoc/protocols/smtp.xml AL src/site/xdoc/protocols/changes.xml AL src/site/xdoc/protocols/source-code.xml AL src/site/xdoc/protocols/imap4.xml AL src/site/xdoc/server/upgrade.xml AL src/site/xdoc/server/feature-performance.xml AL src/site/xdoc/server/feature-queue-priority.xml AL src/site/xdoc/server/objectives.xml AL src/site/xdoc/server/index.xml AL src/site/xdoc/server/monitor-logging.xml AL src/site/xdoc/server/dev-extend-smtp-hook.xml AL src/site/xdoc/server/feature-protocols.xml AL src/site/xdoc/server/dev-extend-matcher.xml AL src/site/xdoc/server/feature-mailetcontainer.xml AL src/site/xdoc/server/features.xml AL src/site/xdoc/server/feature-persistence.xml AL src/site/xdoc/server/packaging.xml AL src/site/xdoc/server/config-blobstore.xml AL src/site/xdoc/server/config-listeners.xml AL src/site/xdoc/server/config-vault.xml AL src/site/xdoc/server/dev-provided.xml AL src/site/xdoc/server/config-ssl-tls.xml AL src/site/xdoc/server/advantages.xml AL src/site/xdoc/server/config-recipientrewritetable.xml AL src/site/xdoc/server/metrics.xml AL src/site/xdoc/server/config-spring-jpa-postgres.xml AL src/site/xdoc/server/dev-extend-mailet.xml AL src/site/xdoc/server/config-blob-export.xml AL src/site/xdoc/server/quick-start.xml AL src/site/xdoc/server/config-redis.xml AL src/site/xdoc/server/config-smtp-lmtp.xml AL src/site/xdoc/server/config-mailetcontainer.xml AL src/site/xdoc/server/config-pop3.xml AL src/site/xdoc/server/config-domainlist.xml AL src/site/xdoc/server/feature-smtp-hooks.xml AL src/site/xdoc/server/dev-provided-smtp-hooks.xml AL src/site/xdoc/server/manage.xml AL src/site/xdoc/server/config-quota.xml AL src/site/xdoc/server/config-mailbox.xml AL src/site/xdoc/server/dev-build.xml AL src/site/xdoc/server/config-activemq.xml AL src/site/xdoc/server/config-cassandra.xml AL src/site/xdoc/server/dev-database-schema.xml AL src/site/xdoc/server/config-system.xml AL src/site/xdoc/server/config-jmap.xml AL src/site/xdoc/server/archive/architecture_v1_2.xml AL src/site/xdoc/server/archive/document_archive.xml AL src/site/xdoc/server/archive/usingTLS_v1_2.xml AL src/site/xdoc/server/archive/architecture_v2_0.xml AL src/site/xdoc/server/archive/usingLDAP_v1_2.xml AL src/site/xdoc/server/archive/configuration_v2_0.xml AL src/site/xdoc/server/archive/install.xml AL src/site/xdoc/server/archive/announcement_2_1.xml AL src/site/xdoc/server/archive/usingJDBC_v2.0.xml AL src/site/xdoc/server/config-healthcheck.xml AL src/site/xdoc/server/feature-security.xml AL src/site/xdoc/server/config-users.xml AL src/site/xdoc/server/config-antispam.xml AL src/site/xdoc/server/quick-start-cassandra.xml AL src/site/xdoc/server/rfcs.xml AL src/site/xdoc/server/dev-extend.xml AL src/site/xdoc/server/manage-jmx.xml AL src/site/xdoc/server/config-rabbitmq.xml AL src/site/xdoc/server/config-fetchmail.xml AL src/site/xdoc/server/upgrade-2.3.xml AL src/site/xdoc/server/config-mailrepositorystore.xml AL src/site/xdoc/server/install.xml AL src/site/xdoc/server/monitor-jmx.xml AL src/site/xdoc/server/config-dnsservice.xml AL src/site/xdoc/server/dev-activemq.xml AL src/site/xdoc/server/config-opensearch.xml AL src/site/xdoc/server/dev.xml AL src/site/xdoc/server/monitor-folders.xml AL src/site/xdoc/server/config-guice.xml AL src/site/xdoc/server/config-imap4.xml AL src/site/xdoc/server/release-notes.xml AL src/site/xdoc/server/config-sieve.xml AL src/site/xdoc/server/monitor.xml AL src/site/xdoc/server/config-webadmin.xml AL src/site/xdoc/server/config.xml AL src/site/xdoc/mailet/index.xml AL src/site/xdoc/mailet/standard/index.xml AL src/site/xdoc/mailet/standard/conf.xml AL src/site/xdoc/mailet/conf.xml AL src/site/xdoc/mailet/stylesheets/site.xsl AL src/site/xdoc/mailet/stylesheets/project.xml AL src/site/xdoc/mailet/ai/index.xml AL src/site/xdoc/mailet/api/index.xml AL src/site/xdoc/mailet/base/index.xml AL src/site/xdoc/mailet/mailetdocs-maven-plugin/index.xml AL src/site/xdoc/mailet/crypto/index.xml AL src/site/xdoc/mailet/crypto/conf.xml AL src/site/xdoc/mailbox/index.xml AL src/site/xdoc/mailbox/mailbox-tool.xml AL src/site/xdoc/mailbox/mailbox-jpa.xml AL src/site/xdoc/mailbox/source-code.xml AL src/site/xdoc/mailbox/mailbox-store.xml AL src/site/xdoc/mailbox/mailbox-spring.xml AL src/site/xdoc/mailbox/mailbox-cassandra.xml AL src/site/xdoc/mailbox/mailbox-memory.xml AL src/site/xdoc/mailbox/mailbox-api.xml AL src/site/xdoc/guidelines.xml AL src/site/site.xml AL src/site/apt/mpt/release-notes.apt AL src/site/apt/mailet/release-notes-old.apt AL src/site/apt/mailet/usage.apt AL src/site/apt/mailet/examples/standard.apt AL src/homepage/Gemfile !????? src/homepage/about.md AL src/homepage/feed.xml AL src/homepage/_layouts/post.html AL src/homepage/_layouts/default.html AL src/homepage/_layouts/howTo.html !????? src/homepage/Gemfile.lock AL src/homepage/howTo/custom-smtp-hooks.html AL src/homepage/howTo/deleted-messages-vault.html AL src/homepage/howTo/mail-processing.html AL src/homepage/howTo/spf.html AL src/homepage/howTo/index.html AL src/homepage/howTo/custom-listeners.html AL src/homepage/howTo/custom-james-assembly.html AL src/homepage/howTo/dkim.html AL src/homepage/howTo/custom-webadmin-routes.html AL src/homepage/howTo/custom-healthchecks.html AL src/homepage/howTo/imap-server.html AL src/homepage/howTo/custom-smtp-commands.html B src/homepage/images/tb3.png B src/homepage/images/james-general-architecture.png B src/homepage/images/openpaas.png B src/homepage/images/tb1.png B src/homepage/images/tb4.png !????? src/homepage/images/james-alt.svg B src/homepage/images/james-logo.png B src/homepage/images/linagora.png B src/homepage/images/hactoberfest.png B src/homepage/images/guice-jpa-architecture-overview.png !????? src/homepage/images/james.svg B src/homepage/images/james-smtp-relay.png B src/homepage/images/tb3-5.png B src/homepage/images/tb2.png B src/homepage/images/james-imap-server.png AL src/homepage/elements.html AL src/homepage/index.html AL src/homepage/posts.html AL src/homepage/_includes/header.html AL src/homepage/_includes/footer.html !????? src/homepage/_posts/2007-09-16-jspf-0.9.5.markdown !????? src/homepage/_posts/2019-03-26-james-3.3.0.markdown !????? src/homepage/_posts/2022-01-26-james-3.6.2.markdown !????? src/homepage/_posts/2011-12-07-protocols-1.6.0-RC1.markdown !????? src/homepage/_posts/2009-07-17-jMPT-0.1.markdown !????? src/homepage/_posts/2023-06-20-fail2ban.markdown !????? src/homepage/_posts/2007-04-05-JAMES-2.3.1-RC1.markdown !????? src/homepage/_posts/2022-08-26-james-3.7.1.markdown !????? src/homepage/_posts/2006-09-03-JSPF-0.9-b3.markdown !????? src/homepage/_posts/2022-10-28-jspf-1.0.2.markdown !????? src/homepage/_posts/2011-02-06-protocols-1.5.markdown !????? src/homepage/_posts/2009-05-16-Mailet-crypto-0.1.markdown !????? src/homepage/_posts/2012-01-07-mime4j-0.7.2.markdown !????? src/homepage/_posts/2024-03-05-mime4j-0.8.11.markdown !????? src/homepage/_posts/2007-04-15-JAMES-2.3.1.markdown !????? src/homepage/_posts/2010-06-02-mailet-base-1.1.markdown !????? src/homepage/_posts/2016-01-08-module-merge.markdown !????? src/homepage/_posts/2016-02-08-moving-to-git.markdown !????? src/homepage/_posts/2022-03-01-james-3.7.0.markdown !????? src/homepage/_posts/2016-10-19-james-3.0.markdown !????? src/homepage/_posts/2017-06-23-jsieve-0.7.markdown !????? src/homepage/_posts/2024-06-07-jspf-1.0.4.markdown !????? src/homepage/_posts/2018-05-07-mime4j-0.8.2.markdown !????? src/homepage/_posts/2012-04-08-James-3.0-beta4.markdown !????? src/homepage/_posts/2007-01-03-Mailet-api.markdown !????? src/homepage/_posts/2025-03-03-jspf-1.0.5.markdown !????? src/homepage/_posts/2007-05-15-mailet-api-lives.markdown !????? src/homepage/_posts/2009-06-16-jsieve-03.markdown !????? src/homepage/_posts/2016-11-19-james-3.0.markdown !????? src/homepage/_posts/2019-08-30-latest-image-changes.markdown !????? src/homepage/_posts/2015-10-08-james-2.3.1.markdown !????? src/homepage/_posts/2011-01-06-imap-mailbox-0.2.markdown !????? src/homepage/_posts/2011-11-07-jspf-1.0.0.markdown !????? src/homepage/_posts/2021-12-02-james-3.6.1.markdown !????? src/homepage/_posts/2021-09-21-james-joinsapachecon.markdown !????? src/homepage/_posts/2017-10-02-BlogPostInstallingJames.markdown !????? src/homepage/_posts/2022-10-07-jdkim-0.3.markdown !????? src/homepage/_posts/2011-10-07-mime4j-0.7.1.markdown !????? src/homepage/_posts/2010-05-01-mailet-1.0.markdown !????? src/homepage/_posts/2019-03-19-mime4j-0.8.3.markdown !????? src/homepage/_posts/2016-05-09-jmap.markdown !????? src/homepage/_posts/2009-01-16-MAILET-2.4.markdown !????? src/homepage/_posts/2006-10-03-JAMES-2.3.markdown !????? src/homepage/_posts/2012-01-08-protocols-1.6.1.markdown !????? src/homepage/_posts/2019-09-05-james-3.4.0.markdown !????? src/homepage/_posts/2007-02-04-JSPF-0.9-beta4.markdown !????? src/homepage/_posts/2009-10-17-jdkim.markdown !????? src/homepage/_posts/2007-05-16-mime4j-0.3.markdown !????? src/homepage/_posts/2020-07-16-james-3.5.0.markdown !????? src/homepage/_posts/2011-03-06-jspf-0.9.9.markdown !????? src/homepage/_posts/2009-03-16-Mime4j-0.6.markdown !????? src/homepage/_posts/2010-05-02-jsieve-0.4.markdown !????? src/homepage/_posts/2018-06-06-linagora-june-nl.markdown !????? src/homepage/_posts/2024-01-08-mime4j-0.8.10.markdown !????? src/homepage/_posts/2007-02-03-feathercast-fetures.markdown !????? src/homepage/_posts/2018-11-14-james-3.2.0.markdown !????? src/homepage/_posts/2010-12-06-protocols-1.2.markdown !????? src/homepage/_posts/2025-01-29-james-3.7.6.markdown !????? src/homepage/_posts/2010-11-06-james-3.0-M2.markdown !????? src/homepage/_posts/2023-05-17-james-3.8.0.markdown !????? src/homepage/_posts/2017-10-03-Hacktoberfest.markdown !????? src/homepage/_posts/2016-07-09-jmap.markdown !????? src/homepage/_posts/2008-10-16-mime4j-0.5.markdown !????? src/homepage/_posts/2022-10-06-james-3.7.2.markdown !????? src/homepage/_posts/2007-04-04-james-commiters-guidelines.markdown !????? src/homepage/_posts/2022-12-30-james-3.7.3.markdown !????? src/homepage/_posts/2009-02-16-MAILET-docs-plugin-0.1.markdown !????? src/homepage/_posts/2015-09-08-james-2.3.1.markdown !????? src/homepage/_posts/2020-10-29-testing-james-with-jmeter.markdown !????? src/homepage/_posts/2009-06-17-jspf-0.9.7.markdown !????? src/homepage/_posts/2010-09-04-imap-0.2-M1.markdown !????? src/homepage/_posts/2023-03-20-james-3.7.4.markdown !????? src/homepage/_posts/2009-08-17-james-2.3.2.markdown !????? src/homepage/_posts/2018-01-26-admin-features.markdown !????? src/homepage/_posts/2011-04-06-mime4J-0.7.markdown !????? src/homepage/_posts/2017-07-20-james-3.0.markdown !????? src/homepage/_posts/2017-05-16-mime4j-0.8.1.markdown !????? src/homepage/_posts/2008-08-17-JSIEVE-0.2.markdown !????? src/homepage/_posts/2010-11-05-james-3.0-M1.markdown !????? src/homepage/_posts/2021-04-21-mime4j-0.8.4.markdown !????? src/homepage/_posts/2022-12-30-mime4j-0.8.9.markdown !????? src/homepage/_posts/2011-08-06-james-beta3.markdown !????? src/homepage/_posts/2018-02-12-gsoc-2018.markdown !????? src/homepage/_posts/2021-09-26-mime4j-0.8.6.markdown !????? src/homepage/_posts/2016-07-19-jmap.markdown !????? src/homepage/_posts/2008-03-16-gsoc-2008.markdown !????? src/homepage/_posts/2019-11-19-apache-con-eu.markdown !????? src/homepage/_posts/2011-05-06-jdKim0.2.markdown !????? src/homepage/_posts/2009-09-17-hupa.markdown !????? src/homepage/_posts/2010-06-03-jspf-0.9.8.markdown !????? src/homepage/_posts/2022-10-28-mime4j-0.8.8.markdown !????? src/homepage/_posts/2010-09-03-protocols-1.2-M2.markdown !????? src/homepage/_posts/2021-03-16-james-3.6.0.markdown !????? src/homepage/_posts/2016-09-19-james-3.0.markdown !????? src/homepage/_posts/2022-04-01-mime4j-0.8.7.markdown !????? src/homepage/_posts/2022-10-28-jsieve-0.8.markdown !????? src/homepage/_posts/2009-04-16-Mailet-base-0.1.markdown !????? src/homepage/_posts/2018-07-31-james-3.1.0.markdown !????? src/homepage/_posts/2006-08-02-james-website-updates.markdown !????? src/homepage/_posts/2008-08-16-mime4j-0.4.markdown !????? src/homepage/_posts/2012-06-08-hupa-0.2.markdown !????? src/homepage/_posts/2024-01-09-james-3.7.5.markdown !????? src/homepage/_posts/2016-02-09-jmap.markdown !????? src/homepage/_posts/2024-12-23-mime4j-0.8.12.markdown !????? src/homepage/_posts/2024-01-09-james-3.8.1.markdown !????? src/homepage/_posts/2012-01-07-protocols-1.6.0.markdown !????? src/homepage/_posts/2021-07-02-mime4j-0.8.5.markdown !????? src/homepage/_posts/2006-08-03-2.3.0-RC3.markdown !????? src/homepage/_posts/2011-10-06-protocols-1.6-beta2.markdown !????? src/homepage/_posts/2017-10-20-james-3.0.1.markdown !????? src/homepage/_posts/2025-03-04-jdKim0.4.markdown !????? src/homepage/_posts/2017-05-16-james-3.0.0-rc1.markdown !????? src/homepage/_posts/2008-04-16-jspf-0.9.6.markdown !????? src/homepage/_posts/2025-01-29-james-3.8.2.markdown !????? src/homepage/_posts/2012-12-08-mailet-2.5.0.markdown !????? src/homepage/_posts/2006-07-02-2.3.0on-the-way.markdown !????? src/homepage/_config.yml !????? src/homepage/assets/css/font-awesome.min.css !????? src/homepage/assets/css/main.css !????? src/homepage/assets/css/lity.min.css !????? src/homepage/assets/css/ie8.css !????? src/homepage/assets/css/ie9.css B src/homepage/assets/css/images/background.jpg B src/homepage/assets/css/images/overlay.png !????? src/homepage/assets/css/test.html !????? src/homepage/assets/css/lightbox.css B src/homepage/assets/images/prev.png B src/homepage/assets/images/close.png B src/homepage/assets/images/next.png B src/homepage/assets/images/gsoc.png B src/homepage/assets/images/loading.gif B src/homepage/assets/fonts/FontAwesome.otf B src/homepage/assets/fonts/fontawesome-webfont.eot B src/homepage/assets/fonts/fontawesome-webfont.woff2 B src/homepage/assets/fonts/fontawesome-webfont.woff B src/homepage/assets/fonts/fontawesome-webfont.ttf !????? src/homepage/assets/fonts/fontawesome-webfont.svg !????? src/homepage/assets/js/main.js !????? src/homepage/assets/js/github-fetch.js !????? src/homepage/assets/js/jquery.min.js !????? src/homepage/assets/js/lightbox.js !????? src/homepage/assets/js/ie/PIE.htc !????? src/homepage/assets/js/ie/respond.min.js !????? src/homepage/assets/js/ie/html5shiv.js !????? src/homepage/assets/js/jquery.scrolly.min.js !????? src/homepage/assets/js/skel.min.js !????? src/homepage/assets/js/lity.min.js !????? src/homepage/assets/js/util.js !????? src/homepage/assets/js/jquery.scrollex.min.js !????? src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_syntax-highlighting.scssc !????? src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_base.scssc !????? src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_layout.scssc !????? src/homepage/.sass-cache/0d97c95486dbfb22208e2f940de32f180caddfba/minima.scssc !????? src/homepage/_site/about.md AL src/homepage/_site/feed.xml AL src/homepage/_site/howTo/custom-smtp-hooks.html AL src/homepage/_site/howTo/deleted-messages-vault.html AL src/homepage/_site/howTo/mail-processing.html AL src/homepage/_site/howTo/spf.html AL src/homepage/_site/howTo/index.html AL src/homepage/_site/howTo/custom-listeners.html AL src/homepage/_site/howTo/custom-james-assembly.html AL src/homepage/_site/howTo/dkim.html AL src/homepage/_site/howTo/custom-webadmin-routes.html AL src/homepage/_site/howTo/custom-healthchecks.html AL src/homepage/_site/howTo/imap-server.html AL src/homepage/_site/howTo/custom-smtp-commands.html AL src/homepage/_site/james/apachecon/2019/11/19/apache-con-eu.html AL src/homepage/_site/james/update/2019/09/05/james-3.4.0.html AL src/homepage/_site/james/update/2019/03/19/mime4j-0.8.3.html AL src/homepage/_site/james/update/2019/03/26/james-3.3.0.html AL src/homepage/_site/james/update/2019/08/30/latest-image-changes.html AL src/homepage/_site/james/update/2012/06/08/hupa-0.2.html AL src/homepage/_site/james/update/2012/04/08/James-3.0-beta4.html AL src/homepage/_site/james/update/2012/01/07/protocols-1.6.0.html AL src/homepage/_site/james/update/2012/01/07/mime4j-0.7.2.html AL src/homepage/_site/james/update/2012/01/08/protocols-1.6.1.html AL src/homepage/_site/james/update/2012/12/08/mailet-2.5.0.html AL src/homepage/_site/james/update/2024/06/07/jspf-1.0.4.html AL src/homepage/_site/james/update/2024/03/05/mime4j-0.8.11.html AL src/homepage/_site/james/update/2024/01/09/james-3.7.5.html AL src/homepage/_site/james/update/2024/01/09/james-3.8.1.html AL src/homepage/_site/james/update/2024/01/08/mime4j-0.8.10.html AL src/homepage/_site/james/update/2024/12/23/mime4j-0.8.12.html AL src/homepage/_site/james/update/2022/04/01/mime4j-0.8.7.html AL src/homepage/_site/james/update/2022/03/21/james-3.7.0.html AL src/homepage/_site/james/update/2022/10/06/james-3.7.2.html AL src/homepage/_site/james/update/2022/10/28/jsieve-0.8.html AL src/homepage/_site/james/update/2022/10/28/mime4j-0.8.8.html AL src/homepage/_site/james/update/2022/10/07/jdkim-0.3.html AL src/homepage/_site/james/update/2022/01/26/james-3.6.2.html AL src/homepage/_site/james/update/2022/08/26/james-3.7.1.html AL src/homepage/_site/james/update/2022/12/30/jspf-1.0.2.html AL src/homepage/_site/james/update/2022/12/30/mime4j-0.8.9.html AL src/homepage/_site/james/update/2022/12/30/james-3.7.3.html AL src/homepage/_site/james/update/2007/05/15/mailet-api-lives.html AL src/homepage/_site/james/update/2007/05/16/mime4j-0.3.html AL src/homepage/_site/james/update/2007/09/16/jspf-0.9.5.html AL src/homepage/_site/james/update/2007/02/04/JSPF-0.9-beta4.html AL src/homepage/_site/james/update/2007/02/03/feathercast-fetures.html AL src/homepage/_site/james/update/2007/04/05/JAMES-2.3.1-RC1.html AL src/homepage/_site/james/update/2007/04/15/JAMES-2.3.1.html AL src/homepage/_site/james/update/2007/04/04/james-commiters-guidelines.html AL src/homepage/_site/james/update/2007/01/03/Mailet-api.html AL src/homepage/_site/james/update/2006/09/03/JSPF-0.9-b3.html AL src/homepage/_site/james/update/2006/10/03/JAMES-2.3.html AL src/homepage/_site/james/update/2006/07/02/2.3.0on-the-way.html AL src/homepage/_site/james/update/2006/08/02/2.3.0-RC3.html AL src/homepage/_site/james/update/2006/08/02/james-website-updates.html AL src/homepage/_site/james/update/2021/09/21/james-joinsapachecon.html AL src/homepage/_site/james/update/2021/09/26/mime4j-0.8.6.html AL src/homepage/_site/james/update/2021/04/21/mime4j-0.8.4.html AL src/homepage/_site/james/update/2021/03/16/james-3.6.0.html AL src/homepage/_site/james/update/2021/07/02/mime4j-0.8.5.html AL src/homepage/_site/james/update/2021/12/02/james-3.6.1.html AL src/homepage/_site/james/update/2025/01/29/james-3.8.2.html AL src/homepage/_site/james/update/2025/01/29/james-3.7.6.html AL src/homepage/_site/james/update/2017/06/23/jsieve-0.7.html AL src/homepage/_site/james/update/2017/06/16/mime4j-0.8.1.html AL src/homepage/_site/james/update/2017/05/16/james-3.0.0-rc1.html AL src/homepage/_site/james/update/2017/10/20/james-3.0.1.html AL src/homepage/_site/james/update/2017/10/03/BlogPostInstallingJames.html AL src/homepage/_site/james/update/2017/10/03/Hacktoberfest.html AL src/homepage/_site/james/update/2017/07/20/james-3.0.html AL src/homepage/_site/james/update/2011/05/06/jdKim0.2.html AL src/homepage/_site/james/update/2011/02/06/protocols-1.5.html AL src/homepage/_site/james/update/2011/04/06/mime4J-0.7.html AL src/homepage/_site/james/update/2011/03/06/jspf-0.9.9.html AL src/homepage/_site/james/update/2011/10/06/protocols-1.6-beta2.html AL src/homepage/_site/james/update/2011/10/07/mime4j-0.7.1.html AL src/homepage/_site/james/update/2011/10/07/jspf-1.0.0.html AL src/homepage/_site/james/update/2011/10/07/protocols-1.6.0-RC1.html AL src/homepage/_site/james/update/2011/01/06/imap-mailbox-0.2.html AL src/homepage/_site/james/update/2011/08/06/james-beta3.html AL src/homepage/_site/james/update/2018/06/06/linagora-june-nl.html AL src/homepage/_site/james/update/2018/11/14/james-3.2.0.html AL src/homepage/_site/james/update/2018/05/07/mime4j-0.8.2.html AL src/homepage/_site/james/update/2018/01/25/admin-features.html AL src/homepage/_site/james/update/2018/07/31/james-3.1.0.html AL src/homepage/_site/james/update/2015/09/08/james-2.3.1.html AL src/homepage/_site/james/update/2015/10/08/james-2.3.1.html AL src/homepage/_site/james/update/2008/04/16/jspf-0.9.6.html AL src/homepage/_site/james/update/2008/03/16/gsoc-2008.html AL src/homepage/_site/james/update/2008/10/16/mime4j-0.5.html AL src/homepage/_site/james/update/2008/08/16/mime4j-0.4.html AL src/homepage/_site/james/update/2008/08/17/JSIEVE-0.2.html AL src/homepage/_site/james/update/2023/05/17/fail2ban.html AL src/homepage/_site/james/update/2023/05/17/james-3.8.0.html AL src/homepage/_site/james/update/2023/03/20/james-3.7.4.html AL src/homepage/_site/james/update/2010/06/02/mailet-base-1.1.html AL src/homepage/_site/james/update/2010/06/03/jspf-0.9.8.html AL src/homepage/_site/james/update/2010/11/05/protocols-1.2.html AL src/homepage/_site/james/update/2010/11/05/james-3.0-M1.html AL src/homepage/_site/james/update/2010/05/02/jsieve-0.4.html AL src/homepage/_site/james/update/2010/05/01/mailet-1.0.html AL src/homepage/_site/james/update/2010/09/04/imap-0.2-M1.html AL src/homepage/_site/james/update/2010/09/03/protocols-1.2-M2.html AL src/homepage/_site/james/update/2010/12/06/james-3.0-M2.html AL src/homepage/_site/james/update/2020/07/16/james-3.5.0.html AL src/homepage/_site/james/update/2016/11/19/james-3.0.html AL src/homepage/_site/james/update/2016/05/09/jmap.html AL src/homepage/_site/james/update/2016/09/19/james-3.0.html AL src/homepage/_site/james/update/2016/02/09/moving-to-git.html AL src/homepage/_site/james/update/2016/02/09/jmap.html AL src/homepage/_site/james/update/2016/10/19/james-3.0.html AL src/homepage/_site/james/update/2016/01/08/module-merge.html AL src/homepage/_site/james/update/2016/07/09/jmap.html AL src/homepage/_site/james/update/2016/07/19/jmap.html AL src/homepage/_site/james/update/2009/06/16/jsieve-03.html AL src/homepage/_site/james/update/2009/06/17/jspf-0.9.7.html AL src/homepage/_site/james/update/2009/05/16/Mailet-crypto-0.1.html AL src/homepage/_site/james/update/2009/09/17/hupa.html AL src/homepage/_site/james/update/2009/02/16/MAILET-docs-plugin-0.1.html AL src/homepage/_site/james/update/2009/04/16/Mailet-base-0.1.html AL src/homepage/_site/james/update/2009/03/16/Mime4j-0.6.html AL src/homepage/_site/james/update/2009/10/17/jdkim.html AL src/homepage/_site/james/update/2009/01/16/MAILET-2.4.html AL src/homepage/_site/james/update/2009/07/17/jMPT-0.1.html AL src/homepage/_site/james/update/2009/08/17/james-2.3.2.html B src/homepage/_site/images/tb3.png B src/homepage/_site/images/james-general-architecture.png B src/homepage/_site/images/openpaas.png B src/homepage/_site/images/tb1.png B src/homepage/_site/images/tb4.png !????? src/homepage/_site/images/james-alt.svg B src/homepage/_site/images/james-logo.png B src/homepage/_site/images/linagora.png B src/homepage/_site/images/hactoberfest.png B src/homepage/_site/images/guice-jpa-architecture-overview.png !????? src/homepage/_site/images/james.svg B src/homepage/_site/images/james-smtp-relay.png B src/homepage/_site/images/tb3-5.png B src/homepage/_site/images/tb2.png B src/homepage/_site/images/james-imap-server.png AL src/homepage/_site/elements.html AL src/homepage/_site/index.html AL src/homepage/_site/posts.html AL src/homepage/_site/community/2020/10/29/testing-james-with-jmeter.html !????? src/homepage/_site/assets/main.css !????? src/homepage/_site/assets/main.css.map !????? src/homepage/_site/assets/css/font-awesome.min.css !????? src/homepage/_site/assets/css/main.css !????? src/homepage/_site/assets/css/lity.min.css !????? src/homepage/_site/assets/css/ie8.css !????? src/homepage/_site/assets/css/ie9.css B src/homepage/_site/assets/css/images/background.jpg B src/homepage/_site/assets/css/images/overlay.png !????? src/homepage/_site/assets/css/test.html !????? src/homepage/_site/assets/css/lightbox.css B src/homepage/_site/assets/images/prev.png B src/homepage/_site/assets/images/close.png B src/homepage/_site/assets/images/next.png B src/homepage/_site/assets/images/gsoc.png B src/homepage/_site/assets/images/loading.gif !????? src/homepage/_site/assets/minima-social-icons.svg B src/homepage/_site/assets/fonts/FontAwesome.otf B src/homepage/_site/assets/fonts/fontawesome-webfont.eot B src/homepage/_site/assets/fonts/fontawesome-webfont.woff2 B src/homepage/_site/assets/fonts/fontawesome-webfont.woff B src/homepage/_site/assets/fonts/fontawesome-webfont.ttf !????? src/homepage/_site/assets/fonts/fontawesome-webfont.svg !????? src/homepage/_site/assets/js/main.js !????? src/homepage/_site/assets/js/github-fetch.js !????? src/homepage/_site/assets/js/jquery.min.js !????? src/homepage/_site/assets/js/lightbox.js !????? src/homepage/_site/assets/js/ie/PIE.htc !????? src/homepage/_site/assets/js/ie/respond.min.js !????? src/homepage/_site/assets/js/ie/html5shiv.js !????? src/homepage/_site/assets/js/jquery.scrolly.min.js !????? src/homepage/_site/assets/js/skel.min.js !????? src/homepage/_site/assets/js/lity.min.js !????? src/homepage/_site/assets/js/util.js !????? src/homepage/_site/assets/js/jquery.scrollex.min.js AL src/homepage/_site/announcements/2018/01/31/gsoc-2018.html !????? src/homepage-docker/Dockerfile !????? src/homepage-docker/compile.sh !????? src/site-docker/Dockerfile !????? src/site-docker/compile.sh !????? src/adr/0026-removing-configured-additional-mailboxListeners.md !????? src/adr/0032-distributed-mail-queue-cleanup.md !????? src/adr/0007-distributed-task-cancellation.md !????? src/adr/0043-avoid-elasticsearch-on-critical-reads.md !????? src/adr/0068-mutualize-cassandra-storge-for-quota.md !????? src/adr/0066-modular-user-data-deletion.md !????? src/adr/0039-distributed-blob-garbage-collector.md !????? src/adr/0030-separate-attachment-content-and-metadata.md !????? src/adr/0055-rspamd-spam-filtering.md !????? src/adr/0044-against-the-use-of-cassandra-lightweight-transactions.md !????? src/adr/0050-jmap-web-push.md !????? src/adr/0002-make-taskmanager-distributed.md !????? src/adr/0012-jmap-partial-reads.md !????? src/adr/0038-distributed-eventbus.md !????? src/adr/0031-distributed-mail-queue.md !????? src/adr/0004-distributed-tasks-listing.md !????? src/adr/0027-eventBus-error-handling-upon-dispatch.md !????? src/adr/0021-cassandra-acl-inconsistency.md !????? src/adr/0023-cassandra-mailbox-counters-inconsistencies.md !????? src/adr/0063-temporary-file-leaks.md !????? src/adr/0069-crowdsec-IP-filtering.md !????? src/adr/0037-eventbus.md !????? src/adr/0049-deduplicated-blobs-gs-with-bloom-filters.md !????? src/adr/0024-polyglot-strategy.md !????? src/adr/0060-adopt-bounded-elastic.md !????? src/adr/0058-upgrade-to-netty-4.md !????? src/adr/0042-applicative-read-repairs.md !????? src/adr/0048-cleanup-jmap-uploads.md !????? src/adr/0072-postgresql-flags-update-concurrency-control.md !????? src/adr/0015-objectstorage-blobid-list.md !????? src/adr/0017-file-mail-queue-deprecation.md !????? src/adr/0020-cassandra-mailbox-object-consistency.md !????? src/adr/0047-jmap-push-over-websockets.md !????? src/adr/0009-disable-elasticsearch-dynamic-mapping.md !????? src/adr/0006-task-serialization.md !????? src/adr/0057-reactive-imap.md !????? src/adr/0051-oidc.md !????? src/adr/0019-reactor-netty-adoption.md !????? src/adr/0054-elasticsearch-search-overrides.md !????? src/adr/0040-quality-levels-definitions.md !????? src/adr/0056-opensearch-migration.md !????? src/adr/0042-james-cli-based-on-webadmin.md !????? src/adr/0003-distributed-workqueue.md !????? src/adr/0009-java-11-migration.md !????? src/adr/0065-changing-username.md !????? src/adr/0025-cassandra-blob-store-cache.md !????? src/adr/0029-Cassandra-mailbox-deletion-cleanup.md !????? src/adr/0064-account-delegation.md !????? src/adr/0046-generalize-event-bus.md !????? src/adr/0001-record-architecture-decisions.md !????? src/adr/0034-mailbox-api-visibility-and-usage.md !????? src/adr/0018-jmap-new-specs.md !????? src/adr/0035-distributed-listeners-configuration.md !????? src/adr/0062-oidc-token-introspection.md !????? src/adr/0041-replace-jcloud-with-s3.md !????? src/adr/0036-against-use-of-conditional-statements-in-guice-modules.md !????? src/adr/0011-remove-elasticsearch-document-source.md !????? src/adr/0059-upgrade-to-cassadra-driver-4.md !????? src/adr/0071-postgresql-mailbox-tables-structure.md !????? src/adr/0016-distributed-workqueue.md !????? src/adr/0052-pulsar-mailqueue.md !????? src/adr/0014-blobstore-storage-policies.md !????? src/adr/0008-distributed-task-await.md B src/adr/img/adr-69-scenario-diagram.png B src/adr/img/adr-71-mailbox-tables-diagram.png B src/adr/img/adr-68-architecture-diagram.png !????? src/adr/0053-email-rate-limiting.md !????? src/adr/0013-precompute-jmap-preview.md !????? src/adr/0067-quota-for-jmap-uploads.md !????? src/adr/0028-Recompute-mailbox-quotas.md !????? src/adr/0070-postgresql-adoption.md !????? src/adr/0022-cassandra-message-inconsistency.md !????? src/adr/0005-distributed-task-termination-ackowledgement.md !????? src/adr/0033-use-scala-in-event-sourcing-modules.md !????? src/adr/0061-delegation.md !????? src/adr/0071-objectstorage-sse-c.md !????? src/adr/0045-support-jmap-push-with-mailbox-changes-implementation.md !????? src/adr/0010-enable-elasticsearch-routing.md AL src/reporting-site/site.xml B james-logo.png GEN pom.xml AL core/src/main/java/org/apache/james/util/Port.java AL core/src/main/java/org/apache/james/util/Host.java AL core/src/main/java/org/apache/james/core/MaybeSender.java AL core/src/main/java/org/apache/james/core/ConnectionDescription.java AL core/src/main/java/org/apache/james/core/Domain.java AL core/src/main/java/org/apache/james/core/MailAddress.java AL core/src/main/java/org/apache/james/core/Username.java AL core/src/main/java/org/apache/james/core/builder/MimeMessageBuilder.java AL core/src/main/java/org/apache/james/core/builder/MimeMessageWrapper.java AL core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java AL core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java AL core/src/main/java/org/apache/james/core/quota/QuotaComponent.java AL core/src/main/java/org/apache/james/core/quota/QuotaType.java AL core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java AL core/src/main/java/org/apache/james/core/quota/QuotaScope.java AL core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java AL core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java AL core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java AL core/src/main/java/org/apache/james/core/quota/QuotaCurrentValue.java AL core/src/main/java/org/apache/james/core/quota/QuotaLimit.java AL core/src/main/java/org/apache/james/core/Disconnector.java AL core/src/main/java/org/apache/james/core/ConnectionDescriptionSupplier.java AL core/src/main/java/org/apache/james/core/healthcheck/HealthCheck.java AL core/src/main/java/org/apache/james/core/healthcheck/Result.java AL core/src/main/java/org/apache/james/core/healthcheck/ComponentName.java AL core/src/main/java/org/apache/james/core/healthcheck/ResultStatus.java AL core/src/test/java/org/apache/james/util/PortTest.java AL core/src/test/java/org/apache/james/util/HostTest.java AL core/src/test/java/org/apache/james/domainlist/api/DomainTest.java AL core/src/test/java/org/apache/james/core/CoreFixture.java AL core/src/test/java/org/apache/james/core/MaybeSenderTest.java AL core/src/test/java/org/apache/james/core/builder/MimeMessageBuilderTest.java AL core/src/test/java/org/apache/james/core/builder/MimeMessageWrapperTest.java AL core/src/test/java/org/apache/james/core/UsernameTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaCountLimitTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaSizeLimitTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaCountUsageTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaSizeUsageTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaLimitTest.java AL core/src/test/java/org/apache/james/core/quota/QuotaCurrentValueTest.java AL core/src/test/java/org/apache/james/core/MailAddressTest.java AL core/src/test/java/org/apache/james/core/healthcheck/ResultTest.java AL core/src/test/java/org/apache/james/core/healthcheck/ResultStatusTest.java AL core/src/test/java/org/apache/james/core/healthcheck/ComponentNameTest.java AL core/pom.xml AL mdn/src/main/scala/org/apache/james/mdn/MDNReportParser.scala AL mdn/src/main/java/org/apache/james/mdn/sending/mode/DispositionSendingMode.java AL mdn/src/main/java/org/apache/james/mdn/type/DispositionType.java AL mdn/src/main/java/org/apache/james/mdn/action/mode/DispositionActionMode.java AL mdn/src/main/java/org/apache/james/mdn/MDNReport.java AL mdn/src/main/java/org/apache/james/mdn/MDN.java AL mdn/src/main/java/org/apache/james/mdn/fields/Error.java AL mdn/src/main/java/org/apache/james/mdn/fields/AddressType.java AL mdn/src/main/java/org/apache/james/mdn/fields/OriginalMessageId.java AL mdn/src/main/java/org/apache/james/mdn/fields/Text.java AL mdn/src/main/java/org/apache/james/mdn/fields/Field.java AL mdn/src/main/java/org/apache/james/mdn/fields/Disposition.java AL mdn/src/main/java/org/apache/james/mdn/fields/OriginalRecipient.java AL mdn/src/main/java/org/apache/james/mdn/fields/Gateway.java AL mdn/src/main/java/org/apache/james/mdn/fields/ReportingUserAgent.java AL mdn/src/main/java/org/apache/james/mdn/fields/ExtensionField.java AL mdn/src/main/java/org/apache/james/mdn/fields/FinalRecipient.java AL mdn/src/main/java/org/apache/james/mdn/modifier/DispositionModifier.java AL mdn/src/test/scala/org/apache/james/mdn/MDNReportParserTest.scala AL mdn/src/test/java/org/apache/james/mdn/sending/mode/DispositionSendingModeTest.java AL mdn/src/test/java/org/apache/james/mdn/type/DispositionTypeTest.java AL mdn/src/test/java/org/apache/james/mdn/action/mode/DispositionActionModeTest.java AL mdn/src/test/java/org/apache/james/mdn/MDNTest.java AL mdn/src/test/java/org/apache/james/mdn/MDNReportFormattingTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/OriginalRecipientTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/GatewayTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/DispositionTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/OriginalMessageIdTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/AddressTypeTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/ExtensionFieldTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/FinalRecipientTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/ErrorTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/ReportingUserAgentTest.java AL mdn/src/test/java/org/apache/james/mdn/fields/TextTest.java AL mdn/src/test/java/org/apache/james/mdn/modifier/DispositionModifierTest.java AL mdn/src/test/java/org/apache/james/mdn/MDNReportTest.java AL mdn/pom.xml AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/MailEnvelope.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPStartTlsResponse.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/dsn/DSNStatus.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPConfiguration.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddressException.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSession.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/MailAddress.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPConfigurationImpl.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPResponse.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AcceptRecipientIfRelayingIsAllowed.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/NoopCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RsetCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/QuitCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/HeloCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/PostmasterAbuseRcptHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAuthRequiredToRelayRcptHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineMessageHookHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/WelcomeMessageHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractHookableCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/HelpCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/UnknownCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/DataLineFilter.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedHeaderGenerator.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/log/HookResultLogger.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/SMTPMDCContextFactory.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ExpnCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/EhloExtension.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/StartTlsCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/MailSizeEsmtpExtension.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/MailCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/VrfyCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/SeparatingDataLineFilter.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ReverseEqualsEhloHeloHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractGreylistHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/MaxRcptHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/SpamTrapHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/SupressDuplicateRcptHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/MaxUnknownCmdHandler.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/MailEnvelopeImpl.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HookResult.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HeloHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/QuitHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/SimpleHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MailParametersHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HookResultHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/RcptHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/MessageHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/Hook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/HookReturnCode.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/UnknownHook.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPServerMBean.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocolHandlerChain.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPProtocol.java AL protocols/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPRetCode.java !????? protocols/smtp/src/test/resources/a50.eml AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPSServerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyStartTlsSMTPServerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPServerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettyProxySMTPServerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/netty/NettySMTPSServerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/ValidSenderDomainHandlerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/MaxUnknownCmdHandlerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/MaxRcptHandlerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandlerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/DNSRBLHandlerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/SpamTrapHandlerTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/TestMessageHook.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/hook/HookResultTest.java AL protocols/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPStartTlsResponseTest.java AL protocols/smtp/src/reporting-site/site.xml AL protocols/smtp/pom.xml AL protocols/managesieve/src/main/java/org/apache/james/managesieve/jsieve/Parser.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/util/ParserUtils.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ManageSieveProcessor.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/ArgumentParser.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/NotEnoughDataException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationProcessor.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/SieveParser.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/SessionTerminatedException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/UnknownSaslMechanism.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/ManageSieveException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/StartTLS.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/ListScripts.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Noop.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CoreCommands.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Unauthenticate.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Authenticate.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/CheckScript.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Logout.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/HaveSpace.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/RenameScript.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/PutScript.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/GetScript.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/LineCommands.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/SetActive.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/DeleteScript.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/CapabilityAdvertiser.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationRequiredException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/ArgumentException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/SyntaxException.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java AL protocols/managesieve/src/main/java/org/apache/james/managesieve/core/PlainAuthenticationProcessor.java AL protocols/managesieve/src/test/java/org/apache/james/managesieve/util/ParserUtilsTest.java AL protocols/managesieve/pom.xml AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPMultiResponse.java AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/LMTPConfiguration.java AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/core/DataLineMessageHookHandler.java AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/core/WelcomeMessageHandler.java AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/core/LhloCmdHandler.java AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/core/ReceivedDataLineFilter.java AL protocols/lmtp/src/main/java/org/apache/james/protocols/lmtp/hook/DeliverToRecipientHook.java AL protocols/lmtp/src/main/reporting-site/site.xml AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/LMTPProtocolHandlerChain.java AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/AbstractLMTPSServerTest.java AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPServerTest.java AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/netty/NettyLMTPSServerTest.java AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/LMTPConfigurationImpl.java AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/AbstractLMTPServerTest.java AL protocols/lmtp/src/test/java/org/apache/james/protocols/lmtp/LMTPClient.java AL protocols/lmtp/pom.xml AL protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyProtocolTransport.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractSSLAwareChannelPipelineFactory.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/Encryption.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/HandlerConstants.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/ConnectionPerIpLimitUpstreamHandler.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/TimeoutHandler.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/LineHandlerAware.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractAsyncServer.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/CommandInjectionDetectedException.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/NettyServer.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/LineHandlerUpstreamHandler.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/BasicChannelInboundHandler.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/LineDelimiterBasedChannelHandlerFactory.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/AllButStartTlsLineChannelHandlerFactory.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/AllButStartTlsLineBasedChannelHandler.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/ConnectionLimitUpstreamHandler.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/AbstractChannelPipelineFactory.java AL protocols/netty/src/main/java/org/apache/james/protocols/netty/ChannelHandlerFactory.java AL protocols/netty/src/test/java/org/apache/james/protocols/netty/NettyServerTest.java AL protocols/netty/src/reporting-site/site.xml AL protocols/netty/pom.xml AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Configuration.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Session.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3StartTlsResponse.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Protocol.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3StreamResponse.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractPOP3CommandHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/NoopCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/RsetCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/RetrCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/QuitCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/TopCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/ExtraDotInputStream.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/StatCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/POP3MessageCommandArguments.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/WelcomeMessageHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/ListCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UnknownCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractPassCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/CRLFTerminatedInputStream.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/CapaCapability.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/POP3MessageCommandDelegate.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/DeleCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractApopCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/StlsCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UidlCmdHandler.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/MDCConstants.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3SessionImpl.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/mailbox/ImapMailbox.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/mailbox/Mailbox.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/mailbox/MessageMetaData.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/mailbox/ImapMessageMetaData.java AL protocols/pop3/src/main/java/org/apache/james/protocols/pop3/POP3Response.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractPOP3ServerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3ServerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyPOP3SServerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/netty/NettyStartTlsPOP3ServerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractStartTlsPOP3ServerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/ListCmdHandlerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/CRLFTerminatedInputStreamTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/UidlCmdHandlerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/TopCmdHandlerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/POP3MessageCommandDelegateTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/AbstractInputStreamTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/POP3MessageCommandArgumentsTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/DeleCmdHandlerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/RetrCmdHandlerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/core/ExtraDotInputStreamTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/POP3ProtocolHandlerChain.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractPOP3SServerTest.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/utils/TestPassCmdHandler.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/utils/MockMailbox.java AL protocols/pop3/src/test/java/org/apache/james/protocols/pop3/POP3StartTlsResponseTest.java AL protocols/pop3/pom.xml AL protocols/src/site/site.xml AL protocols/src/reporting-site/site.xml AL protocols/api/src/main/java/org/apache/james/protocols/api/ClientAuth.java AL protocols/api/src/main/java/org/apache/james/protocols/api/Protocol.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolConfiguration.java AL protocols/api/src/main/java/org/apache/james/protocols/api/Response.java AL protocols/api/src/main/java/org/apache/james/protocols/api/StreamResponse.java AL protocols/api/src/main/java/org/apache/james/protocols/api/BaseRequest.java AL protocols/api/src/main/java/org/apache/james/protocols/api/Request.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolServer.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolConfigurationImpl.java AL protocols/api/src/main/java/org/apache/james/protocols/api/AbstractResponse.java AL protocols/api/src/main/java/org/apache/james/protocols/api/CommandDetectionSession.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolTransport.java AL protocols/api/src/main/java/org/apache/james/protocols/api/AbstractProtocolTransport.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChain.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerResultHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/ConnectHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/ExtensibleHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/UnknownCommandHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/CommandHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/CommandHandlerResultLogger.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/LineHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandlerChainImpl.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/DisconnectHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/AbstractProtocolHandlerChain.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandler.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/WiringException.java AL protocols/api/src/main/java/org/apache/james/protocols/api/handler/CommandDispatcher.java AL protocols/api/src/main/java/org/apache/james/protocols/api/StartTlsResponse.java AL protocols/api/src/main/java/org/apache/james/protocols/api/OidcSASLConfiguration.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolImpl.java AL protocols/api/src/main/java/org/apache/james/protocols/api/ProxyInformation.java AL protocols/api/src/main/java/org/apache/james/protocols/api/OIDCSASLParser.java B protocols/api/src/test/resources/boguskeystore AL protocols/api/src/test/java/org/apache/james/protocols/api/AbstractProtocolTransportTest.java AL protocols/api/src/test/java/org/apache/james/protocols/api/ProtocolSessionTest.java AL protocols/api/src/test/java/org/apache/james/protocols/api/OIDCSASLHelper.java AL protocols/api/src/test/java/org/apache/james/protocols/api/utils/BogusSSLSocketFactory.java AL protocols/api/src/test/java/org/apache/james/protocols/api/utils/ProtocolServerUtils.java AL protocols/api/src/test/java/org/apache/james/protocols/api/utils/BogusSslContextFactory.java AL protocols/api/src/test/java/org/apache/james/protocols/api/utils/BogusKeyStore.java AL protocols/api/src/test/java/org/apache/james/protocols/api/utils/BogusTrustManagerFactory.java AL protocols/api/src/test/java/org/apache/james/protocols/api/OIDCSASLParserTest.java AL protocols/api/src/test/java/org/apache/james/protocols/api/ProxyInformationTest.java AL protocols/api/src/reporting-site/site.xml AL protocols/api/pom.xml AL protocols/pom.xml AL protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultLocalizer.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/EncoderUtils.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ImapEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseComposer.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ImapEncoderFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/MetadataResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseWriter.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/StatusResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/base/EndImapEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ListingEncodingUtils.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/FakeImapSession.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/encode/IdResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CopyProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/ContentBodyElement.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/EnvelopeImpl.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/EmptyContent.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/EnvelopeBuilder.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/MimeDescriptorStructure.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/AddressImpl.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/MimeBodyElement.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElement.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/HeadersBodyElement.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/MessageResultUtils.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceSupplier.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/ReplaceProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityImplementingProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SetMetadataProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSubscriptionProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/GetMetadataProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/StartTLSProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/CompressProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/IdProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/base/AbstractProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/base/UnknownRequestProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/base/ImapResponseMessageProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/base/UidMsnConverter.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/PermitEnableCapabilityProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/XListProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java AL protocols/imap/src/main/java/org/apache/james/imap/main/ResponseEncoder.java AL protocols/imap/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java AL protocols/imap/src/main/java/org/apache/james/imap/main/DeniedAccessOnSharedMailboxException.java AL protocols/imap/src/main/java/org/apache/james/imap/main/DefaultImapDecoderFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestStreamLineReader.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/DecoderUtils.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/main/OutputStreamImapResponseWriter.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/main/ImapRequestStreamHandler.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/ImapDecoderFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/ImapCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/DecodingException.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/FetchPartPathDecoder.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/ImapDecoder.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/ImapCommandParserFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ReplaceCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LsubCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AuthenticateCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/IdleCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MoveCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaRootCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExamineCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnselectCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CapabilityCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MyRightsCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteACLCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SelectCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/RenameCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SearchCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractUidCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CloseCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListRightsCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnsubscribeCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StartTLSCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetQuotaCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetMetadataCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LoginCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/IDCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SubscribeCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LogoutCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CompressCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CheckCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/decode/parser/EnableCommandParser.java AL protocols/imap/src/main/java/org/apache/james/imap/ImapSuite.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ConnectionCheck.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ImapSessionState.java AL protocols/imap/src/main/java/org/apache/james/imap/api/Tag.java AL protocols/imap/src/main/java/org/apache/james/imap/api/DefaultConnectionCheckFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ImapConstants.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ConnectionCheckFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/api/display/ModifiedUtf7.java AL protocols/imap/src/main/java/org/apache/james/imap/api/display/Localizer.java AL protocols/imap/src/main/java/org/apache/james/imap/api/display/Locales.java AL protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ImapMessage.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/SearchResUtil.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/MailboxTyper.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/DefaultMailboxTyper.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapLineHandler.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/SelectedMailbox.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapSession.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/ImapProcessor.java AL protocols/imap/src/main/java/org/apache/james/imap/api/process/MailboxType.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ImapConfiguration.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/PartialRange.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/SectionType.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/request/SearchKey.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/request/SearchResultOption.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/request/DayMonthYear.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/request/ImapRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/request/SearchOperation.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/UidRange.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/MessageFlags.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/BodyFetchElement.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/Capability.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/response/ImapResponseMessage.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponseFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/api/ImapCommand.java AL protocols/imap/src/main/java/org/apache/james/imap/utils/EolInputStream.java AL protocols/imap/src/main/java/org/apache/james/imap/utils/FastByteArrayOutputStream.java AL protocols/imap/src/main/java/org/apache/james/imap/message/BytesBackedLiteral.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SetQuotaRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/IRAuthenticateRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/ReplaceRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRightsRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SelectRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SubscribeRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/MyRightsRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/AppendRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/CloseRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SetMetadataRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/IDRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/LogoutRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/IdleRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/CopyRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/LsubRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteACLRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/UnsubscribeRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/XListRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/CheckRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/GetMetadataRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMailboxSelectionRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/CapabilityRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/LoginRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/StoreRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SearchRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRootRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/EnableRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/StatusRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/SystemMessage.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/CompressRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/AuthenticateRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/RenameRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/CreateRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/request/ExamineRequest.java AL protocols/imap/src/main/java/org/apache/james/imap/message/Literal.java AL protocols/imap/src/main/java/org/apache/james/imap/message/MailboxName.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/QuotaRootResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/SearchResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/RecentResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/MetadataResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/FlagsResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ListResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/AbstractStatusResponseFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/MailboxStatusResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/FetchResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/XListResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/AuthenticateResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/QuotaResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/IdResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ContinuationResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/EnableResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/NamespaceResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/VanishedResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ACLResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/AbstractListingResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ExpungeResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ListRightsResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/ExistsResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/CapabilityResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/UnpooledStatusResponseFactory.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/MyRightsResponse.java AL protocols/imap/src/main/java/org/apache/james/imap/message/response/LSubResponse.java AL protocols/imap/src/main/java/org/apache/james/mailbox/MessageSequenceNumber.java AL protocols/imap/src/main/java/org/apache/james/mailbox/NullableMessageSequenceNumber.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactoryTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/EncoderUtilsTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/EncoderUtilsDateTimeLocaleTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/MetadataResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/ImapResponseComposerImplTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/base/ByteImapResponseWriter.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/ListingEncodingUtilsTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/PartialFetchBodyElementTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/MailboxMessageResultUtilsTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/SetMetadataProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/base/UidMsnConverterTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/CapabilityProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java AL protocols/imap/src/test/java/org/apache/james/imap/main/DefaultImapDecoderFactoryTest.java AL protocols/imap/src/test/java/org/apache/james/imap/main/ImapRequestHandlerAdandonConnectionTest.java AL protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/FetchPartPathDecoderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/main/IdRangeParseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/DecoderUtilsLocaleDateTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/StringMatcherCharacterValidatorTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/ImapRequestLineReaderTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/DecoderUtilsTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserCharsetTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetMetadataCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/MoveParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/StatusCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserQuotedCharsetTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SelectParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetQuotaCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SelectCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/AppendCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeyTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaRootParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/NioUtils.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java AL protocols/imap/src/test/java/org/apache/james/imap/decode/parser/StoreCommandParserTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/ImapSessionTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/ImapConfigurationTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/IdRangeTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/ImapCommandTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/message/request/SearchKeyTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/message/UidRangeTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/message/CapabilityTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/message/BodyFetchElementTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/message/response/AbstractStatusResponseFactoryTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/message/response/StatusResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/api/TagTest.java AL protocols/imap/src/test/java/org/apache/james/imap/ImapFixture.java AL protocols/imap/src/test/java/org/apache/james/imap/message/request/AbstractMailboxSelectionRequestTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/UnpooledStatusResponseFactoryTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/ListRightsResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/FlagsResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/NamespaceResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/ACLResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/QuotaResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/MyRightsResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/QuotaRootResponseTest.java AL protocols/imap/src/test/java/org/apache/james/imap/message/response/SearchResponseTest.java AL protocols/imap/src/test/java/org/apache/james/mailbox/MessageSequenceNumberTest.java AL protocols/imap/src/test/java/org/apache/james/mailbox/NullableMessageSequenceNumberTest.java AL protocols/imap/pom.xml !????? server/README.crypto AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/HeadersDto.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceDTO.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReferenceSerializer.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailQueueName.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/EnqueuedItem.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueManagement.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/EnqueueId.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailWithEnqueueId.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueDeadLetterQueueHealthCheck.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConsumerHealthCheck.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailLoader.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/MailReference.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/RabbitMQMailQueueConfiguration.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/FakeMailQueueView.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/DeleteCondition.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/api/MailQueueView.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDAO.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueViewStartUpCheck.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/ConfigurationAggregate.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/CassandraMailQueueViewConfiguration.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/RegisterConfigurationCommandHandler.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/ConfigurationChanged.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/EventsourcingConfigurationManagement.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/RegisterConfigurationCommand.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/CassandraMailQueueViewConfigurationModule.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/ConfigurationChangedDTO.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/model/BucketedSlices.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/model/EnqueuedItemWithSlicingContext.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/BrowseStartDAO.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/MailQueueViewBlobReferenceSource.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueBrowser.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/DeletedMailsDAO.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueViewModule.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDaoUtil.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/BrowseStartHealthCheck.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueMailStore.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueMailDelete.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueView.java AL server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/view/cassandra/ContentStartDAO.java B server/queue/queue-rabbitmq/src/test/resources/json/mail1-legacy.json B server/queue/queue-rabbitmq/src/test/resources/json/mail1.json B server/queue/queue-rabbitmq/src/test/resources/json/mailqueueview/configuration/configuration_changed.json B server/queue/queue-rabbitmq/src/test/resources/json/mail_min.json AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/MailDTOTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/MailLoaderTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueDeadLetterQueueHealthCheckTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/EnqueuedItemTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/MailQueueNameTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/api/DeleteConditionTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/RabbitMQMailQueueConfigurationTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/ContentStartDAOTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDaoTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/BrowseStartHealthCheckTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/RegisterConfigurationCommandTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/ConfigurationChangedDTOTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/EventsourcingConfigurationManagementTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/DTOTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/configuration/CassandraMailQueueViewConfigurationTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/model/BucketedSlicesTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/model/EnqueuedItemWithSlicingContextTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/model/EnqueueIdTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/EnqueuedMailsDaoUtilTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/CassandraMailQueueViewTestFactory.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/BrowseStartDAOTest.java AL server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/view/cassandra/DeletedMailsDAOTest.java AL server/queue/queue-rabbitmq/pom.xml !????? server/queue/queue-pulsar/README.adoc AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/Filter.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/Header.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/PulsarMailQueue.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/FilterStage.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/PulsarMailQueueFactory.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/PulsarMailQueueConfiguration.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/MailMetadata.scala AL server/queue/queue-pulsar/src/main/scala/org/apache/james/queue/pulsar/EnqueueId.scala AL server/queue/queue-pulsar/src/test/scala/org/apache/james/queue/pulsar/JavaClient.scala AL server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueTest.java AL server/queue/queue-pulsar/src/test/java/org/apache/james/queue/pulsar/PulsarMailQueueFactoryTest.java AL server/queue/queue-pulsar/pom.xml AL server/queue/queue-activemq/src/main/resources/META-INF/spring/activemq-queue-context.xml AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/EmbeddedActiveMQ.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobStrategy.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQConfiguration.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/FileSystemBlobTransferPolicy.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQSupport.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/MimeMessageBlobMessageSource.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQHealthCheck.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/metric/ActiveMQMetricCollector.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/metric/ActiveMQMetricCollectorImpl.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/metric/ActiveMQMetricCollectorNoop.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/metric/ActiveMQMetricConfiguration.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/metric/ActiveMQMetrics.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueItem.java AL server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java AL server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java AL server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java AL server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactoryTest.java AL server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQHealthCheckTest.java AL server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/metric/ActiveMQMetricConfigurationTest.java AL server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/metric/ActiveMQMetricCollectorTest.java AL server/queue/queue-activemq/src/reporting-site/site.xml AL server/queue/queue-activemq/pom.xml AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/RawMailQueueItem.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueManagementMBean.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/ManageableMailQueue.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueName.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/RawMailQueueItemDecoratorFactory.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueItemDecoratorFactory.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueue.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java AL server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailPrioritySupport.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedMailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/Mails.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedPriorityMailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/DelayedManageableMailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/PriorityMailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryTest.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricExtension.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueNameTest.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/PriorityManageableMailQueueContract.java AL server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueMetricContract.java AL server/queue/queue-api/src/reporting-site/site.xml AL server/queue/queue-api/pom.xml AL server/queue/queue-jms/src/main/java/org/apache/james/queue/library/MailQueueManagement.java AL server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java AL server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueItem.java AL server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/MimeMessageObjectMessageSource.java AL server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java AL server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSSupport.java AL server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java AL server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java AL server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/BrokerExtension.java AL server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueFactoryTest.java AL server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java AL server/queue/queue-jms/src/reporting-site/site.xml AL server/queue/queue-jms/pom.xml AL server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java AL server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryCacheableMailQueueTest.java AL server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryCacheableMailQueueFactoryTest.java !????? server/queue/queue-memory/pom.xml A server/apps/memory-app/extensions-jars/apache-mailet-crypto-3.8.1-SNAPSHOT-jar-with-dependencies.jar AL server/apps/memory-app/docker-configuration/webadmin.properties !????? server/apps/memory-app/docker-configuration/logback-cli.xml !????? server/apps/memory-app/src/main/extensions-jars/README.md AL server/apps/memory-app/src/main/java/org/apache/james/MemoryJamesServerMain.java AL server/apps/memory-app/src/main/java/org/apache/james/MemoryJamesConfiguration.java B server/apps/memory-app/src/main/glowroot/admin.json B server/apps/memory-app/src/main/glowroot/plugins/smtp.json B server/apps/memory-app/src/main/glowroot/plugins/task.json B server/apps/memory-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/memory-app/src/main/glowroot/plugins/pop3.json B server/apps/memory-app/src/main/glowroot/plugins/spooler.json B server/apps/memory-app/src/main/glowroot/plugins/jmap.json B server/apps/memory-app/src/main/glowroot/plugins/imap.json !????? server/apps/memory-app/src/main/scripts/james-cli AL server/apps/memory-app/src/test/resources/smtpserver2.xml AL server/apps/memory-app/src/test/resources/listeners.xml !????? server/apps/memory-app/src/test/resources/jwt_publickey AL server/apps/memory-app/src/test/resources/dnsservice.xml AL server/apps/memory-app/src/test/resources/lmtpserver.xml AL server/apps/memory-app/src/test/resources/mailetcontainer.xml !????? server/apps/memory-app/src/test/resources/eml/otherDomainDkimLocalFrom.eml !????? server/apps/memory-app/src/test/resources/eml/otherDomainDkim.eml !????? server/apps/memory-app/src/test/resources/eml/badDkim.eml !????? server/apps/memory-app/src/test/resources/eml/goodDkim.eml AL server/apps/memory-app/src/test/resources/imapserver.xml AL server/apps/memory-app/src/test/resources/managesieveserver.xml AL server/apps/memory-app/src/test/resources/domainlist.xml AL server/apps/memory-app/src/test/resources/mailrepositorystore.xml AL server/apps/memory-app/src/test/resources/usersrepository.xml B server/apps/memory-app/src/test/resources/keystore2 B server/apps/memory-app/src/test/resources/keystore B server/apps/memory-app/src/test/resources/badAliasKeystore AL server/apps/memory-app/src/test/resources/imapserver2.xml AL server/apps/memory-app/src/test/resources/smtpserver.xml AL server/apps/memory-app/src/test/resources/pop3server.xml AL server/apps/memory-app/src/test/java/org/apache/james/MemoryJamesServerTest.java AL server/apps/memory-app/src/test/java/org/apache/james/ErrorMailet.java AL server/apps/memory-app/src/test/java/org/apache/james/WebAdminRoutesExtensionTest.java AL server/apps/memory-app/src/test/java/org/apache/james/MyRoute.java AL server/apps/memory-app/src/test/java/org/apache/james/HealthCheckExtensionTest.java AL server/apps/memory-app/src/test/java/org/apache/james/MyStartable.java AL server/apps/memory-app/src/test/java/org/apache/james/GuiceJamesServerTest.java AL server/apps/memory-app/src/test/java/org/apache/james/StartSequenceTest.java AL server/apps/memory-app/src/test/java/org/apache/james/UserStartableExtensionTest.java AL server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java AL server/apps/memory-app/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java AL server/apps/memory-app/src/test/java/org/apache/james/DisabledSpoolerTest.java AL server/apps/memory-app/src/test/java/org/apache/james/MemoryLdapLocalPartLoginIntegrationTest.java AL server/apps/memory-app/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java AL server/apps/memory-app/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java AL server/apps/memory-app/src/test/java/org/apache/james/DisabledGroupExecutionTest.java AL server/apps/memory-app/src/test/java/org/apache/james/DomainAutodetectionTest.java AL server/apps/memory-app/src/test/java/org/apache/james/DKIMHookIntegrationTest.java AL server/apps/memory-app/src/test/java/org/apache/james/MemoryJmapTestRule.java AL server/apps/memory-app/src/test/java/org/apache/james/IMAPIntegrationTest.java AL server/apps/memory-app/src/test/java/org/apache/james/MyHealthCheck.java AL server/apps/memory-app/src/test/java/org/apache/james/CertificateReloadTest.java AL server/apps/memory-app/src/test/java/org/apache/james/RCPTCaseSensitivityTest.java AL server/apps/memory-app/src/test/java/org/apache/james/LmtpIntegrationTest.java AL server/apps/memory-app/src/assemble/app.xml MIT server/apps/memory-app/src/assemble/license-for-binary.txt !????? server/apps/memory-app/src/assemble/README.adoc !????? server/apps/memory-app/src/assemble/extensions-jars.txt AL server/apps/memory-app/pom.xml !????? server/apps/memory-app/README.md AL server/apps/memory-app/sample-configuration/webadmin.properties AL server/apps/memory-app/sample-configuration/listeners.xml !????? server/apps/memory-app/sample-configuration/extensions.properties AL server/apps/memory-app/sample-configuration/dnsservice.xml !????? server/apps/memory-app/sample-configuration/deletedMessageVault.properties AL server/apps/memory-app/sample-configuration/mailetcontainer.xml AL server/apps/memory-app/sample-configuration/imapserver.xml AL server/apps/memory-app/sample-configuration/managesieveserver.xml AL server/apps/memory-app/sample-configuration/domainlist.xml AL server/apps/memory-app/sample-configuration/mailrepositorystore.xml !????? server/apps/memory-app/sample-configuration/jvm.properties AL server/apps/memory-app/sample-configuration/usersrepository.xml AL server/apps/memory-app/sample-configuration/recipientrewritetable.xml B server/apps/memory-app/sample-configuration/keystore AL server/apps/memory-app/sample-configuration/logback.xml !????? server/apps/memory-app/sample-configuration/jmap.properties AL server/apps/memory-app/sample-configuration/jmx.properties AL server/apps/memory-app/sample-configuration/smtpserver.xml AL server/apps/memory-app/sample-configuration/pop3server.xml !????? server/apps/memory-app/sample-configuration/droplists.properties AL server/apps/memory-app/sample-configuration/healthcheck.properties AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminHTTPClientUtil.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/WebAdminCli.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainDeleteCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCreateCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainListCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/AddDomainAliasCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/DomainExistCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/ListDomainAliasCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/domain/RemoveDomainAliasCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaCountCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaCountCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaCountCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/DeleteGlobalQuotaSizeCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaSizeCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/QuotaCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/SetGlobalQuotaSizeCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/GetGlobalQuotaCountCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/quota/GlobalQuotaSizeCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/user/UserExistCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/user/UserCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/user/UserCreateCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/user/UserDeleteCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/user/UserListCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/mailbox/MailboxDeleteCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/mailbox/MailboxListCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/mailbox/MailboxCreateCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/mailbox/MailboxCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/mailbox/MailboxDeleteAllCommand.java AL server/apps/webadmin-cli/src/main/java/org/apache/james/cli/mailbox/MailboxExistCommand.java AL server/apps/webadmin-cli/src/test/resources/webadmin.properties AL server/apps/webadmin-cli/src/test/resources/listeners.xml !????? server/apps/webadmin-cli/src/test/resources/jwt_publickey AL server/apps/webadmin-cli/src/test/resources/dnsservice.xml AL server/apps/webadmin-cli/src/test/resources/lmtpserver.xml AL server/apps/webadmin-cli/src/test/resources/mailetcontainer.xml AL server/apps/webadmin-cli/src/test/resources/imapserver.xml AL server/apps/webadmin-cli/src/test/resources/managesieveserver.xml !????? server/apps/webadmin-cli/src/test/resources/valid_token_admin_false.jwt AL server/apps/webadmin-cli/src/test/resources/domainlist.xml AL server/apps/webadmin-cli/src/test/resources/mailrepositorystore.xml AL server/apps/webadmin-cli/src/test/resources/usersrepository.xml !????? server/apps/webadmin-cli/src/test/resources/valid_token_admin_true.jwt B server/apps/webadmin-cli/src/test/resources/keystore AL server/apps/webadmin-cli/src/test/resources/smtpserver.xml AL server/apps/webadmin-cli/src/test/resources/pop3server.xml AL server/apps/webadmin-cli/src/test/java/org/apache/james/cli/JwtOptionTest.java AL server/apps/webadmin-cli/src/test/java/org/apache/james/cli/MailboxManageTest.java AL server/apps/webadmin-cli/src/test/java/org/apache/james/cli/HelpVersionCommandTest.java AL server/apps/webadmin-cli/src/test/java/org/apache/james/cli/DomainManageTest.java AL server/apps/webadmin-cli/src/test/java/org/apache/james/cli/UserManageTest.java AL server/apps/webadmin-cli/src/test/java/org/apache/james/cli/QuotaManageTest.java AL server/apps/webadmin-cli/pom.xml !????? server/apps/webadmin-cli/README.md !????? server/apps/webadmin-cli/james-cli !????? server/apps/scaling-pulsar-smtp/docker-compose.yml !????? server/apps/scaling-pulsar-smtp/README.adoc AL server/apps/scaling-pulsar-smtp/src/main/resources/META-INF/persistence.xml AL server/apps/scaling-pulsar-smtp/src/main/java/org/apache/james/Main.java AL server/apps/scaling-pulsar-smtp/src/main/java/org/apache/james/SMTPRelayConfiguration.java AL server/apps/scaling-pulsar-smtp/src/main/java/org/apache/james/MailStoreRepositoryModule.java !????? server/apps/scaling-pulsar-smtp/src/main/scripts/james-cli AL server/apps/scaling-pulsar-smtp/src/test/resources/listeners.xml AL server/apps/scaling-pulsar-smtp/src/test/resources/dnsservice.xml AL server/apps/scaling-pulsar-smtp/src/test/resources/mailetcontainer.xml AL server/apps/scaling-pulsar-smtp/src/test/resources/domainlist.xml AL server/apps/scaling-pulsar-smtp/src/test/resources/backmailrepositorystore.xml B server/apps/scaling-pulsar-smtp/src/test/resources/keystore AL server/apps/scaling-pulsar-smtp/src/test/resources/smtpserver.xml AL server/apps/scaling-pulsar-smtp/src/test/resources/fakemailrepositorystore.xml AL server/apps/scaling-pulsar-smtp/src/test/java/org/apache/james/PulsarExtension.java AL server/apps/scaling-pulsar-smtp/src/test/java/org/apache/james/SMTPJamesServerTest.java AL server/apps/scaling-pulsar-smtp/src/test/java/org/apache/james/AwsS3BlobStoreExtension.java AL server/apps/scaling-pulsar-smtp/src/test/java/org/apache/james/PostgresExtension.java AL server/apps/scaling-pulsar-smtp/src/test/java/org/apache/james/TestingSmtpRelayJamesServerBuilder.java AL server/apps/scaling-pulsar-smtp/pom.xml AL server/apps/scaling-pulsar-smtp/sample-configuration/webadmin.properties !????? server/apps/scaling-pulsar-smtp/sample-configuration/extensions.properties AL server/apps/scaling-pulsar-smtp/sample-configuration/dnsservice.xml AL server/apps/scaling-pulsar-smtp/sample-configuration/mailetcontainer.xml !????? server/apps/scaling-pulsar-smtp/sample-configuration/pulsar.properties !????? server/apps/scaling-pulsar-smtp/sample-configuration/scriptFile.scala AL server/apps/scaling-pulsar-smtp/sample-configuration/domainlist.xml AL server/apps/scaling-pulsar-smtp/sample-configuration/mailrepositorystore.xml !????? server/apps/scaling-pulsar-smtp/sample-configuration/jvm.properties AL server/apps/scaling-pulsar-smtp/sample-configuration/usersrepository.xml AL server/apps/scaling-pulsar-smtp/sample-configuration/recipientrewritetable.xml B server/apps/scaling-pulsar-smtp/sample-configuration/keystore !????? server/apps/scaling-pulsar-smtp/sample-configuration/logback.xml AL server/apps/scaling-pulsar-smtp/sample-configuration/james-database.properties AL server/apps/scaling-pulsar-smtp/sample-configuration/jmx.properties AL server/apps/scaling-pulsar-smtp/sample-configuration/smtpserver.xml !????? server/apps/scaling-pulsar-smtp/sample-configuration/blob.properties AL server/apps/scaling-pulsar-smtp/sample-configuration/healthcheck.properties !????? server/apps/spring-app/README.crypto AL server/apps/spring-app/src/main/resources/META-INF/persistence-template.xml AL server/apps/spring-app/src/main/resources/META-INF/persistence.xml AL server/apps/spring-app/src/main/resources/META-INF/jpa-mappings-template.xml AL server/apps/spring-app/src/main/resources/dnsservice.xml AL server/apps/spring-app/src/main/resources/lmtpserver.xml AL server/apps/spring-app/src/main/resources/mailetcontainer.xml AL server/apps/spring-app/src/main/resources/sieverepository.xml AL server/apps/spring-app/src/main/resources/quota.xml AL server/apps/spring-app/src/main/resources/sqlResources.xml AL server/apps/spring-app/src/main/resources/imapserver.xml AL server/apps/spring-app/src/main/resources/managesieveserver.xml AL server/apps/spring-app/src/main/resources/indexer.xml AL server/apps/spring-app/src/main/resources/domainlist.xml AL server/apps/spring-app/src/main/resources/mailrepositorystore.xml AL server/apps/spring-app/src/main/resources/mailbox.xml !????? server/apps/spring-app/src/main/resources/log4j2.xml AL server/apps/spring-app/src/main/resources/fetchmail.xml AL server/apps/spring-app/src/main/resources/usersrepository.xml AL server/apps/spring-app/src/main/resources/recipientrewritetable.xml !????? server/apps/spring-app/src/main/resources/jmxremote.access AL server/apps/spring-app/src/main/resources/setenv.sh AL server/apps/spring-app/src/main/resources/james-database.properties AL server/apps/spring-app/src/main/resources/jmx.properties AL server/apps/spring-app/src/main/resources/smtpserver.xml AL server/apps/spring-app/src/main/resources/pop3server.xml !????? server/apps/spring-app/src/main/resources/jmxremote.password N server/apps/spring-app/src/main/resources/lib/README.txt N server/apps/spring-app/src/main/app/sieve/README.txt AL server/apps/spring-app/src/main/app/bin/setenv.bat AL server/apps/spring-app/src/main/app/bin/setenv.sh AL server/apps/spring-app/src/main/appended-resources/supplemental-models.xml AL server/apps/spring-app/src/main/java/org/apache/james/app/spring/JamesAppSpringMain.java AL server/apps/spring-app/src/main/webapp/WEB-INF/web.xml !????? server/apps/spring-app/src/main/licensing/app/notice-for-binary.txt MIT server/apps/spring-app/src/main/licensing/app/license-for-binary.txt AL server/apps/spring-app/src/main/licensing/app/licensing.xml N server/apps/spring-app/src/main/licensing/war/NOTICE AL server/apps/spring-app/src/main/licensing/war/licensing.xml N server/apps/spring-app/src/main/licensing/war/LICENSE AL server/apps/spring-app/src/test/resources/quota.xml AL server/apps/spring-app/src/test/resources/imapserver.xml AL server/apps/spring-app/src/test/resources/managesieveserver.xml AL server/apps/spring-app/src/test/resources/smtpserver.xml AL server/apps/spring-app/src/test/resources/pop3server.xml AL server/apps/spring-app/src/test/java/org/apache/james/app/spring/JamesAppSpringMainTest.java AL server/apps/spring-app/src/test/java/org/apache/james/app/spring/JamesSpringContextTest.java AL server/apps/spring-app/src/assemble/app.xml AL server/apps/spring-app/src/reporting-site/site.xml N server/apps/spring-app/src/debian/control/copyright !????? server/apps/spring-app/src/debian/control/control AL server/apps/spring-app/pom.xml N server/apps/spring-app/NOTICE N server/apps/spring-app/LICENSE AL server/apps/distributed-pop3-app/docker-configuration/webadmin.properties !????? server/apps/distributed-pop3-app/docker-configuration/jvm.properties !????? server/apps/distributed-pop3-app/docker-configuration/logback-cli.xml !????? server/apps/distributed-pop3-app/docker-compose.yml !????? server/apps/distributed-pop3-app/README.adoc !????? server/apps/distributed-pop3-app/src/main/extensions-jars/README.md AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/modules/Pop3FixInconsistenciesTaskSerializationModule.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/modules/DistributedPop3Module.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/modules/Pop3FixInconsistenciesWebAdminModule.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/mailbox/RandomUidProvider.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/mailbox/NoACLMapper.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/mailbox/RandomModSeqProvider.java AL server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java B server/apps/distributed-pop3-app/src/main/glowroot/admin.json B server/apps/distributed-pop3-app/src/main/glowroot/plugins/blobstore.json B server/apps/distributed-pop3-app/src/main/glowroot/plugins/smtp.json B server/apps/distributed-pop3-app/src/main/glowroot/plugins/task.json B server/apps/distributed-pop3-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/distributed-pop3-app/src/main/glowroot/plugins/pop3.json B server/apps/distributed-pop3-app/src/main/glowroot/plugins/spooler.json !????? server/apps/distributed-pop3-app/src/main/scripts/james-cli !????? server/apps/distributed-pop3-app/src/test/resources/attachment.eml AL server/apps/distributed-pop3-app/src/test/resources/listeners.xml AL server/apps/distributed-pop3-app/src/test/resources/dnsservice.xml AL server/apps/distributed-pop3-app/src/test/resources/lmtpserver.xml AL server/apps/distributed-pop3-app/src/test/resources/mailetcontainer.xml !????? server/apps/distributed-pop3-app/src/test/resources/big.eml AL server/apps/distributed-pop3-app/src/test/resources/domainlist.xml AL server/apps/distributed-pop3-app/src/test/resources/mailrepositorystore.xml B server/apps/distributed-pop3-app/src/test/resources/keystore !????? server/apps/distributed-pop3-app/src/test/resources/batchsizes.properties AL server/apps/distributed-pop3-app/src/test/resources/smtpserver.xml AL server/apps/distributed-pop3-app/src/test/resources/pop3server.xml !????? server/apps/distributed-pop3-app/src/test/resources/rabbitmq.properties AL server/apps/distributed-pop3-app/src/test/java/org/apache/james/Pop3ServerContract.java AL server/apps/distributed-pop3-app/src/test/java/org/apache/james/DistributedPOP3ServerTest.java AL server/apps/distributed-pop3-app/pom.xml AL server/apps/distributed-pop3-app/sample-configuration/webadmin.properties AL server/apps/distributed-pop3-app/sample-configuration/listeners.xml !????? server/apps/distributed-pop3-app/sample-configuration/extensions.properties AL server/apps/distributed-pop3-app/sample-configuration/dnsservice.xml !????? server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties AL server/apps/distributed-pop3-app/sample-configuration/lmtpserver.xml AL server/apps/distributed-pop3-app/sample-configuration/mailetcontainer.xml AL server/apps/distributed-pop3-app/sample-configuration/opensearch.properties AL server/apps/distributed-pop3-app/sample-configuration/domainlist.xml AL server/apps/distributed-pop3-app/sample-configuration/mailrepositorystore.xml !????? server/apps/distributed-pop3-app/sample-configuration/jvm.properties AL server/apps/distributed-pop3-app/sample-configuration/usersrepository.xml AL server/apps/distributed-pop3-app/sample-configuration/recipientrewritetable.xml !????? server/apps/distributed-pop3-app/sample-configuration/logback.xml AL server/apps/distributed-pop3-app/sample-configuration/tika.properties !????? server/apps/distributed-pop3-app/sample-configuration/cassandra-driver.conf !????? server/apps/distributed-pop3-app/sample-configuration/batchsizes.properties AL server/apps/distributed-pop3-app/sample-configuration/jmx.properties AL server/apps/distributed-pop3-app/sample-configuration/smtpserver.xml AL server/apps/distributed-pop3-app/sample-configuration/pop3server.xml !????? server/apps/distributed-pop3-app/sample-configuration/blob.properties !????? server/apps/distributed-pop3-app/sample-configuration/cassandra.properties AL server/apps/distributed-pop3-app/sample-configuration/healthcheck.properties !????? server/apps/distributed-pop3-app/sample-configuration/rabbitmq.properties AL server/apps/jpa-smtp-app/docker-configuration/webadmin.properties !????? server/apps/jpa-smtp-app/docker-configuration/logback-cli.xml !????? server/apps/jpa-smtp-app/docker-compose.yml !????? server/apps/jpa-smtp-app/README.adoc !????? server/apps/jpa-smtp-app/src/main/extensions-jars/README.md AL server/apps/jpa-smtp-app/src/main/resources/META-INF/persistence.xml AL server/apps/jpa-smtp-app/src/main/resources/defaultMailetContainer.xml AL server/apps/jpa-smtp-app/src/main/java/org/apache/james/JPAJamesConfiguration.java AL server/apps/jpa-smtp-app/src/main/java/org/apache/james/JPAJamesServerMain.java B server/apps/jpa-smtp-app/src/main/glowroot/admin.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/smtp.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/task.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/pop3.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/spooler.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/jmap.json B server/apps/jpa-smtp-app/src/main/glowroot/plugins/imap.json !????? server/apps/jpa-smtp-app/src/main/scripts/james-cli AL server/apps/jpa-smtp-app/src/test/resources/dnsservice.xml AL server/apps/jpa-smtp-app/src/test/resources/mailetcontainer.xml AL server/apps/jpa-smtp-app/src/test/resources/managesieveserver.xml AL server/apps/jpa-smtp-app/src/test/resources/domainlist.xml AL server/apps/jpa-smtp-app/src/test/resources/mailrepositorystore.xml B server/apps/jpa-smtp-app/src/test/resources/keystore AL server/apps/jpa-smtp-app/src/test/resources/smtpserver.xml AL server/apps/jpa-smtp-app/src/test/resources/fakemailrepositorystore.xml AL server/apps/jpa-smtp-app/src/test/java/org/apache/james/JPAJamesServerTest.java AL server/apps/jpa-smtp-app/src/test/java/org/apache/james/mariadb/JPAMariaDBJamesServerTest.java AL server/apps/jpa-smtp-app/src/test/java/org/apache/james/mariadb/TestJPAMariaDBConfigurationModule.java AL server/apps/jpa-smtp-app/src/assemble/app.xml MIT server/apps/jpa-smtp-app/src/assemble/license-for-binary.txt !????? server/apps/jpa-smtp-app/src/assemble/extensions-jars.txt AL server/apps/jpa-smtp-app/pom.xml AL server/apps/jpa-smtp-app/conf/webadmin.properties !????? server/apps/jpa-smtp-app/conf/extensions.properties AL server/apps/jpa-smtp-app/conf/james-database-mariadb.properties AL server/apps/jpa-smtp-app/conf/dnsservice.xml AL server/apps/jpa-smtp-app/conf/mailetcontainer.xml AL server/apps/jpa-smtp-app/conf/domainlist.xml AL server/apps/jpa-smtp-app/conf/mailrepositorystore.xml !????? server/apps/jpa-smtp-app/conf/jvm.properties AL server/apps/jpa-smtp-app/conf/usersrepository.xml AL server/apps/jpa-smtp-app/conf/recipientrewritetable.xml B server/apps/jpa-smtp-app/conf/keystore !????? server/apps/jpa-smtp-app/conf/logback.xml AL server/apps/jpa-smtp-app/conf/james-database.properties AL server/apps/jpa-smtp-app/conf/jmx.properties AL server/apps/jpa-smtp-app/conf/smtpserver.xml AL server/apps/jpa-smtp-app/conf/healthcheck.properties AL server/apps/jpa-smtp-app/sample-configuration/webadmin.properties !????? server/apps/jpa-smtp-app/sample-configuration/extensions.properties AL server/apps/jpa-smtp-app/sample-configuration/james-database-mariadb.properties AL server/apps/jpa-smtp-app/sample-configuration/dnsservice.xml AL server/apps/jpa-smtp-app/sample-configuration/mailetcontainer.xml AL server/apps/jpa-smtp-app/sample-configuration/domainlist.xml AL server/apps/jpa-smtp-app/sample-configuration/mailrepositorystore.xml !????? server/apps/jpa-smtp-app/sample-configuration/jvm.properties AL server/apps/jpa-smtp-app/sample-configuration/usersrepository.xml AL server/apps/jpa-smtp-app/sample-configuration/recipientrewritetable.xml !????? server/apps/jpa-smtp-app/sample-configuration/logback.xml AL server/apps/jpa-smtp-app/sample-configuration/james-database.properties AL server/apps/jpa-smtp-app/sample-configuration/jmx.properties AL server/apps/jpa-smtp-app/sample-configuration/smtpserver.xml AL server/apps/jpa-smtp-app/sample-configuration/healthcheck.properties !????? server/apps/conf/jmxremote.access !????? server/apps/conf/jmxremote.password !????? server/apps/postgres-app/clean_up.sql !????? server/apps/postgres-app/sample-configuration-single/search.properties AL server/apps/postgres-app/docker-configuration/webadmin.properties !????? server/apps/postgres-app/docker-compose.yml !????? server/apps/postgres-app/README.adoc AL server/apps/postgres-app/sample-configuration-distributed/opensearch.properties !????? server/apps/postgres-app/sample-configuration-distributed/blob.properties !????? server/apps/postgres-app/sample-configuration-distributed/rabbitmq.properties !????? server/apps/postgres-app/src/main/extensions-jars/README.md AL server/apps/postgres-app/src/main/resources/defaultMailetContainer.xml AL server/apps/postgres-app/src/main/java/org/apache/james/PostgresJamesServerMain.java AL server/apps/postgres-app/src/main/java/org/apache/james/PostgresJmapModule.java AL server/apps/postgres-app/src/main/java/org/apache/james/PostgresJamesConfiguration.java B server/apps/postgres-app/src/main/glowroot/admin.json B server/apps/postgres-app/src/main/glowroot/plugins/smtp.json B server/apps/postgres-app/src/main/glowroot/plugins/task.json B server/apps/postgres-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/postgres-app/src/main/glowroot/plugins/pop3.json B server/apps/postgres-app/src/main/glowroot/plugins/spooler.json B server/apps/postgres-app/src/main/glowroot/plugins/jmap.json B server/apps/postgres-app/src/main/glowroot/plugins/imap.json !????? server/apps/postgres-app/src/main/scripts/james-cli AL server/apps/postgres-app/src/test/resources/webadmin.properties AL server/apps/postgres-app/src/test/resources/dnsservice.xml AL server/apps/postgres-app/src/test/resources/lmtpserver.xml AL server/apps/postgres-app/src/test/resources/mailetcontainer.xml !????? server/apps/postgres-app/src/test/resources/eml/htmlMail.eml AL server/apps/postgres-app/src/test/resources/imapserver.xml AL server/apps/postgres-app/src/test/resources/managesieveserver.xml AL server/apps/postgres-app/src/test/resources/domainlist.xml AL server/apps/postgres-app/src/test/resources/mailrepositorystore.xml AL server/apps/postgres-app/src/test/resources/usersrepository.xml B server/apps/postgres-app/src/test/resources/keystore AL server/apps/postgres-app/src/test/resources/smtpserver.xml AL server/apps/postgres-app/src/test/resources/pop3server.xml AL server/apps/postgres-app/src/test/resources/fakemailrepositorystore.xml AL server/apps/postgres-app/src/test/java/org/apache/james/PostgresWithTikaTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/PostgresJmapJamesServerTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/DistributedPostgresJamesServerTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/JamesServerConcreteContract.java AL server/apps/postgres-app/src/test/java/org/apache/james/PostgresJamesServerTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/WithScanningSearchImmutableTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/PostgresBlobStoreIntegrationTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/PostgresWithOpenSearchDisabledTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/PostgresWithLDAPJamesServerTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/WithScanningSearchMutableTest.java AL server/apps/postgres-app/src/test/java/org/apache/james/BodyDeduplicationIntegrationTest.java AL server/apps/postgres-app/src/assemble/app.xml MIT server/apps/postgres-app/src/assemble/license-for-binary.txt !????? server/apps/postgres-app/src/assemble/extensions-jars.txt AL server/apps/postgres-app/pom.xml !????? server/apps/postgres-app/provision.sh !????? server/apps/postgres-app/imap-provision-conf/provisioning.properties AL server/apps/postgres-app/sample-configuration/webadmin.properties AL server/apps/postgres-app/sample-configuration/listeners.xml !????? server/apps/postgres-app/sample-configuration/extensions.properties !????? server/apps/postgres-app/sample-configuration/jwt_publickey AL server/apps/postgres-app/sample-configuration/dnsservice.xml !????? server/apps/postgres-app/sample-configuration/deletedMessageVault.properties AL server/apps/postgres-app/sample-configuration/lmtpserver.xml AL server/apps/postgres-app/sample-configuration/mailetcontainer.xml AL server/apps/postgres-app/sample-configuration/imapserver.xml AL server/apps/postgres-app/sample-configuration/managesieveserver.xml AL server/apps/postgres-app/sample-configuration/domainlist.xml AL server/apps/postgres-app/sample-configuration/mailrepositorystore.xml !????? server/apps/postgres-app/sample-configuration/jvm.properties AL server/apps/postgres-app/sample-configuration/usersrepository.xml AL server/apps/postgres-app/sample-configuration/recipientrewritetable.xml !????? server/apps/postgres-app/sample-configuration/postgres.properties !????? server/apps/postgres-app/sample-configuration/logback.xml !????? server/apps/postgres-app/sample-configuration/jmap.properties AL server/apps/postgres-app/sample-configuration/jmx.properties AL server/apps/postgres-app/sample-configuration/smtpserver.xml AL server/apps/postgres-app/sample-configuration/pop3server.xml !????? server/apps/postgres-app/sample-configuration/droplists.properties !????? server/apps/postgres-app/sample-configuration/blob.properties AL server/apps/postgres-app/sample-configuration/healthcheck.properties !????? server/apps/postgres-app/docker-compose-distributed.yml !????? server/apps/postgres-app/performance-test.md !????? server/apps/demo/initialdata.sh !????? server/apps/demo/Dockerfile AL server/apps/demo/imapserver.xml !????? server/apps/demo/startup.sh AL server/apps/demo/smtpserver.xml AL server/apps/demo/pop3server.xml !????? server/apps/cli/README.adoc AL server/apps/cli/src/main/java/org/apache/james/cli/ServerCmd.java AL server/apps/cli/src/main/java/org/apache/james/cli/type/CmdType.java AL server/apps/cli/src/main/java/org/apache/james/cli/exceptions/MissingCommandException.java AL server/apps/cli/src/main/java/org/apache/james/cli/exceptions/InvalidArgumentNumberException.java AL server/apps/cli/src/main/java/org/apache/james/cli/exceptions/UnrecognizedCommandException.java AL server/apps/cli/src/main/java/org/apache/james/cli/exceptions/JamesCliException.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxConnection.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxSieveProbe.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxMailboxProbe.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxDataProbe.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxQuotaProbe.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxProbe.java AL server/apps/cli/src/main/java/org/apache/james/cli/probe/impl/JmxDropListProbe.java AL server/apps/cli/src/test/java/org/apache/james/cli/type/CmdTypeTest.java AL server/apps/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java AL server/apps/cli/src/assemble/app.xml MIT server/apps/cli/src/assemble/license-for-binary.txt AL server/apps/cli/src/reporting-site/site.xml AL server/apps/cli/pom.xml AL server/apps/distributed-app/docker-configuration/webadmin.properties !????? server/apps/distributed-app/docker-configuration/jvm.properties !????? server/apps/distributed-app/docker-configuration/logback-cli.xml !????? server/apps/distributed-app/docker-compose.yml !????? server/apps/distributed-app/helm-chart/james/templates/secrets.yaml !????? server/apps/distributed-app/helm-chart/james/templates/servicemonitor.yaml !????? server/apps/distributed-app/helm-chart/james/templates/james-admin-ingress.yaml !????? server/apps/distributed-app/helm-chart/james/templates/_docker-secrets.tpl !????? server/apps/distributed-app/helm-chart/james/templates/_helpers.tpl !????? server/apps/distributed-app/helm-chart/james/templates/jmap-ingress.yaml !????? server/apps/distributed-app/helm-chart/james/templates/deployment.yaml !????? server/apps/distributed-app/helm-chart/james/templates/service.yaml !????? server/apps/distributed-app/helm-chart/james/templates/_urls.tpl !????? server/apps/distributed-app/helm-chart/james/templates/configmaps.yaml !????? server/apps/distributed-app/helm-chart/james/secrets.sample.yaml !????? server/apps/distributed-app/helm-chart/james/Chart.yaml !????? server/apps/distributed-app/helm-chart/james/values.yaml B server/apps/distributed-app/helm-chart/james/values.schema.json !????? server/apps/distributed-app/helm-chart/james/configs/webadmin.properties AL server/apps/distributed-app/helm-chart/james/configs/listeners.xml AL server/apps/distributed-app/helm-chart/james/configs/dnsservice.xml AL server/apps/distributed-app/helm-chart/james/configs/imapserver.xml AL server/apps/distributed-app/helm-chart/james/configs/opensearch.properties AL server/apps/distributed-app/helm-chart/james/configs/domainlist.xml AL server/apps/distributed-app/helm-chart/james/configs/mailrepositorystore.xml AL server/apps/distributed-app/helm-chart/james/configs/usersrepository.xml AL server/apps/distributed-app/helm-chart/james/configs/recipientrewritetable.xml AL server/apps/distributed-app/helm-chart/james/configs/logback.xml !????? server/apps/distributed-app/helm-chart/james/configs/jmap.properties !????? server/apps/distributed-app/helm-chart/james/configs/batchsizes.properties AL server/apps/distributed-app/helm-chart/james/configs/jmx.properties AL server/apps/distributed-app/helm-chart/james/configs/smtpserver.xml !????? server/apps/distributed-app/helm-chart/james/configs/blob.properties !????? server/apps/distributed-app/helm-chart/james/configs/cassandra.properties !????? server/apps/distributed-app/helm-chart/james/configs/rabbitmq.properties !????? server/apps/distributed-app/helm-chart/README.md !????? server/apps/distributed-app/docker-compose-with-pulsar.yml !????? server/apps/distributed-app/README.adoc !????? server/apps/distributed-app/src/main/extensions-jars/README.md AL server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java AL server/apps/distributed-app/src/main/java/org/apache/james/MailQueueChoice.java AL server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java B server/apps/distributed-app/src/main/glowroot/admin.json B server/apps/distributed-app/src/main/glowroot/plugins/blobstore.json B server/apps/distributed-app/src/main/glowroot/plugins/smtp.json B server/apps/distributed-app/src/main/glowroot/plugins/task.json B server/apps/distributed-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/distributed-app/src/main/glowroot/plugins/pop3.json B server/apps/distributed-app/src/main/glowroot/plugins/spooler.json B server/apps/distributed-app/src/main/glowroot/plugins/jmap.json B server/apps/distributed-app/src/main/glowroot/plugins/imap.json !????? server/apps/distributed-app/src/main/scripts/james-cli AL server/apps/distributed-app/src/test/resources/listeners.xml AL server/apps/distributed-app/src/test/resources/dnsservice.xml AL server/apps/distributed-app/src/test/resources/lmtpserver.xml AL server/apps/distributed-app/src/test/resources/mailetcontainer.xml AL server/apps/distributed-app/src/test/resources/imapserver.xml AL server/apps/distributed-app/src/test/resources/managesieveserver.xml AL server/apps/distributed-app/src/test/resources/domainlist.xml AL server/apps/distributed-app/src/test/resources/mailrepositorystore.xml B server/apps/distributed-app/src/test/resources/keystore !????? server/apps/distributed-app/src/test/resources/batchsizes.properties AL server/apps/distributed-app/src/test/resources/smtpserver.xml AL server/apps/distributed-app/src/test/resources/pop3server.xml !????? server/apps/distributed-app/src/test/resources/rabbitmq.properties AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithCassandraPassThroughBlobStoreMutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java AL server/apps/distributed-app/src/test/java/org/apache/james/DistributedJamesWithTikaTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithCacheImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithEncryptedBlobStoreMutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraMessageOperationsContract.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithCassandraPassThroughBlobStoreImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithScanningSearchImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithCassandraDeduplicationBlobStoreImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/modules/S3SSECBlobStoreExtension.java AL server/apps/distributed-app/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationValidationStartUpCheckTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/NamespaceConfigurationTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithEncryptedBlobStoreImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithCassandraDeduplicationBlobStoreMutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithScanningSearchMutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/RabbitMQDisabledTasksTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraCacheQueryTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraPulsarJamesServerTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithDefaultAwsS3MutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithS3SSECTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithDefaultAwsS3ImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQLegacyQuotaJamesServerTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithoutMailQueueViewImmutableTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java AL server/apps/distributed-app/src/test/java/org/apache/james/WithCacheMutableTest.java AL server/apps/distributed-app/src/assemble/app.xml MIT server/apps/distributed-app/src/assemble/license-for-binary.txt !????? server/apps/distributed-app/src/assemble/extensions-jars.txt AL server/apps/distributed-app/pom.xml AL server/apps/distributed-app/sample-configuration/webadmin.properties AL server/apps/distributed-app/sample-configuration/listeners.xml !????? server/apps/distributed-app/sample-configuration/extensions.properties AL server/apps/distributed-app/sample-configuration/dnsservice.xml !????? server/apps/distributed-app/sample-configuration/deletedMessageVault.properties AL server/apps/distributed-app/sample-configuration/lmtpserver.xml AL server/apps/distributed-app/sample-configuration/mailetcontainer.xml !????? server/apps/distributed-app/sample-configuration/queue-pulsar.properties !????? server/apps/distributed-app/sample-configuration/pulsar.properties AL server/apps/distributed-app/sample-configuration/imapserver.xml AL server/apps/distributed-app/sample-configuration/managesieveserver.xml AL server/apps/distributed-app/sample-configuration/opensearch.properties AL server/apps/distributed-app/sample-configuration/domainlist.xml AL server/apps/distributed-app/sample-configuration/mailrepositorystore.xml !????? server/apps/distributed-app/sample-configuration/jvm.properties AL server/apps/distributed-app/sample-configuration/usersrepository.xml !????? server/apps/distributed-app/sample-configuration/queue.properties AL server/apps/distributed-app/sample-configuration/recipientrewritetable.xml !????? server/apps/distributed-app/sample-configuration/logback.xml AL server/apps/distributed-app/sample-configuration/tika.properties !????? server/apps/distributed-app/sample-configuration/jmap.properties !????? server/apps/distributed-app/sample-configuration/cassandra-driver.conf !????? server/apps/distributed-app/sample-configuration/batchsizes.properties AL server/apps/distributed-app/sample-configuration/jmx.properties AL server/apps/distributed-app/sample-configuration/smtpserver.xml AL server/apps/distributed-app/sample-configuration/pop3server.xml !????? server/apps/distributed-app/sample-configuration/droplists.properties !????? server/apps/distributed-app/sample-configuration/blob.properties !????? server/apps/distributed-app/sample-configuration/cassandra.properties AL server/apps/distributed-app/sample-configuration/healthcheck.properties !????? server/apps/distributed-app/sample-configuration/rabbitmq.properties !????? server/apps/distributed-app/docs/Dockerfile !????? server/apps/distributed-app/docs/ui-overrides/partials/header-content.hbs !????? server/apps/distributed-app/docs/ui-overrides/img/james.svg !????? server/apps/distributed-app/docs/modules/ROOT/nav.adoc !????? server/apps/distributed-app/docs/modules/ROOT/pages/index.adoc !????? server/apps/distributed-app/docs/README.md !????? server/apps/distributed-app/docs/antora-playbook-local.yml !????? server/apps/distributed-app/docs/antora.yml !????? server/apps/cli-integration-tests/src/test/resources/jwt_publickey AL server/apps/cli-integration-tests/src/test/resources/dnsservice.xml AL server/apps/cli-integration-tests/src/test/resources/lmtpserver.xml AL server/apps/cli-integration-tests/src/test/resources/mailetcontainer.xml AL server/apps/cli-integration-tests/src/test/resources/imapserver.xml AL server/apps/cli-integration-tests/src/test/resources/managesieveserver.xml AL server/apps/cli-integration-tests/src/test/resources/mailrepositorystore.xml AL server/apps/cli-integration-tests/src/test/resources/usersrepository.xml AL server/apps/cli-integration-tests/src/test/resources/conf/jmx.properties AL server/apps/cli-integration-tests/src/test/resources/smtpserver.xml AL server/apps/cli-integration-tests/src/test/resources/pop3server.xml AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/DropListCommandsIntegrationTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/MailboxCommandsIntegrationTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/QuotaCommandsIntegrationTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/util/OutputCapture.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/util/OutputCaptureTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/ReindexCommandIntegrationTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/DataCommandsIntegrationTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/SieveQuotaCommandsIntegrationTest.java AL server/apps/cli-integration-tests/src/test/java/org/apache/james/cli/JmxSecurityServerIntegrationTest.java AL server/apps/cli-integration-tests/pom.xml AL server/apps/cassandra-app/docker-configuration/webadmin.properties !????? server/apps/cassandra-app/docker-configuration/jvm.properties !????? server/apps/cassandra-app/docker-configuration/logback-cli.xml !????? server/apps/cassandra-app/docker-compose.yml !????? server/apps/cassandra-app/README.adoc !????? server/apps/cassandra-app/src/main/extensions-jars/README.md AL server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java AL server/apps/cassandra-app/src/main/java/org/apache/james/CassandraBlobStoreModule.java AL server/apps/cassandra-app/src/main/java/org/apache/james/BlobStoreConfiguration.java AL server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java AL server/apps/cassandra-app/src/main/java/org/apache/james/BlobStoreModulesChooser.java B server/apps/cassandra-app/src/main/glowroot/admin.json B server/apps/cassandra-app/src/main/glowroot/plugins/blobstore.json B server/apps/cassandra-app/src/main/glowroot/plugins/smtp.json B server/apps/cassandra-app/src/main/glowroot/plugins/task.json B server/apps/cassandra-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/cassandra-app/src/main/glowroot/plugins/pop3.json B server/apps/cassandra-app/src/main/glowroot/plugins/spooler.json B server/apps/cassandra-app/src/main/glowroot/plugins/jmap.json B server/apps/cassandra-app/src/main/glowroot/plugins/imap.json !????? server/apps/cassandra-app/src/main/scripts/james-cli AL server/apps/cassandra-app/src/test/resources/listeners.xml AL server/apps/cassandra-app/src/test/resources/dnsservice.xml AL server/apps/cassandra-app/src/test/resources/lmtpserver.xml AL server/apps/cassandra-app/src/test/resources/mailetcontainer.xml !????? server/apps/cassandra-app/src/test/resources/eml/htmlMail.eml AL server/apps/cassandra-app/src/test/resources/imapserver.xml AL server/apps/cassandra-app/src/test/resources/managesieveserver.xml AL server/apps/cassandra-app/src/test/resources/domainlist.xml !????? server/apps/cassandra-app/src/test/resources/ldif-files/populate.ldif AL server/apps/cassandra-app/src/test/resources/mailrepositorystore.xml B server/apps/cassandra-app/src/test/resources/keystore !????? server/apps/cassandra-app/src/test/resources/batchsizes.properties AL server/apps/cassandra-app/src/test/resources/smtpserver.xml AL server/apps/cassandra-app/src/test/resources/pop3server.xml AL server/apps/cassandra-app/src/test/resources/fakemailrepositorystore.xml AL server/apps/cassandra-app/src/test/java/org/apache/james/KeyspaceCreationTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/JamesServerConcreteContract.java AL server/apps/cassandra-app/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/WithCassandraBlobStoreImmutableTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLdapJmapJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/MailsShouldBeWellReceivedConcreteContract.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CacheSessionTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraWithOpenSearchDisabled.java AL server/apps/cassandra-app/src/test/java/org/apache/james/AuthenticatedCassandraJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheckTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraDuplicatingJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraExtension.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraWithTikaTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/TestingDistributedJamesServerBuilder.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLegacyQuotaJamesServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraNodeConfTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/JamesWithNonCompatibleElasticSearchServerTest.java AL server/apps/cassandra-app/src/test/java/org/apache/james/CassandraJmapTestRule.java AL server/apps/cassandra-app/src/test/java/org/apache/james/DockerCassandraRule.java AL server/apps/cassandra-app/src/test/java/org/apache/james/JamesServerWithRetryConnectionTest.java AL server/apps/cassandra-app/src/assemble/app.xml MIT server/apps/cassandra-app/src/assemble/license-for-binary.txt !????? server/apps/cassandra-app/src/assemble/extensions-jars.txt AL server/apps/cassandra-app/pom.xml AL server/apps/cassandra-app/sample-configuration/webadmin.properties AL server/apps/cassandra-app/sample-configuration/listeners.xml !????? server/apps/cassandra-app/sample-configuration/extensions.properties AL server/apps/cassandra-app/sample-configuration/dnsservice.xml !????? server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties AL server/apps/cassandra-app/sample-configuration/lmtpserver.xml AL server/apps/cassandra-app/sample-configuration/mailetcontainer.xml AL server/apps/cassandra-app/sample-configuration/imapserver.xml AL server/apps/cassandra-app/sample-configuration/managesieveserver.xml AL server/apps/cassandra-app/sample-configuration/opensearch.properties AL server/apps/cassandra-app/sample-configuration/domainlist.xml AL server/apps/cassandra-app/sample-configuration/mailrepositorystore.xml !????? server/apps/cassandra-app/sample-configuration/jvm.properties AL server/apps/cassandra-app/sample-configuration/usersrepository.xml AL server/apps/cassandra-app/sample-configuration/recipientrewritetable.xml !????? server/apps/cassandra-app/sample-configuration/logback.xml AL server/apps/cassandra-app/sample-configuration/tika.properties !????? server/apps/cassandra-app/sample-configuration/jmap.properties !????? server/apps/cassandra-app/sample-configuration/cassandra-driver.conf !????? server/apps/cassandra-app/sample-configuration/batchsizes.properties AL server/apps/cassandra-app/sample-configuration/jmx.properties AL server/apps/cassandra-app/sample-configuration/smtpserver.xml AL server/apps/cassandra-app/sample-configuration/pop3server.xml !????? server/apps/cassandra-app/sample-configuration/activemq.properties !????? server/apps/cassandra-app/sample-configuration/blob.properties !????? server/apps/cassandra-app/sample-configuration/cassandra.properties AL server/apps/cassandra-app/sample-configuration/healthcheck.properties AL server/apps/jpa-app/docker-configuration/webadmin.properties !????? server/apps/jpa-app/docker-configuration/logback-cli.xml !????? server/apps/jpa-app/docker-compose.yml !????? server/apps/jpa-app/README.adoc !????? server/apps/jpa-app/src/main/extensions-jars/README.md AL server/apps/jpa-app/src/main/resources/META-INF/persistence.xml AL server/apps/jpa-app/src/main/resources/defaultMailetContainer.xml AL server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesConfiguration.java AL server/apps/jpa-app/src/main/java/org/apache/james/JPAJamesServerMain.java B server/apps/jpa-app/src/main/glowroot/admin.json B server/apps/jpa-app/src/main/glowroot/plugins/smtp.json B server/apps/jpa-app/src/main/glowroot/plugins/task.json B server/apps/jpa-app/src/main/glowroot/plugins/mailboxListener.json B server/apps/jpa-app/src/main/glowroot/plugins/pop3.json B server/apps/jpa-app/src/main/glowroot/plugins/spooler.json B server/apps/jpa-app/src/main/glowroot/plugins/jmap.json B server/apps/jpa-app/src/main/glowroot/plugins/imap.json !????? server/apps/jpa-app/src/main/scripts/james-cli AL server/apps/jpa-app/src/test/resources/dnsservice.xml AL server/apps/jpa-app/src/test/resources/lmtpserver.xml AL server/apps/jpa-app/src/test/resources/mailetcontainer.xml AL server/apps/jpa-app/src/test/resources/imapserver.xml AL server/apps/jpa-app/src/test/resources/managesieveserver.xml AL server/apps/jpa-app/src/test/resources/domainlist.xml AL server/apps/jpa-app/src/test/resources/mailrepositorystore.xml B server/apps/jpa-app/src/test/resources/keystore AL server/apps/jpa-app/src/test/resources/smtpserver.xml AL server/apps/jpa-app/src/test/resources/pop3server.xml AL server/apps/jpa-app/src/test/resources/fakemailrepositorystore.xml AL server/apps/jpa-app/src/test/java/org/apache/james/JamesServerConcreteContract.java AL server/apps/jpa-app/src/test/java/org/apache/james/JPAJamesServerWithNoDatabaseAuthenticaticationSqlValidationTest.java AL server/apps/jpa-app/src/test/java/org/apache/james/JPAJamesServerWithAuthenticatedDatabaseSqlValidationTest.java AL server/apps/jpa-app/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java AL server/apps/jpa-app/src/test/java/org/apache/james/JPAJamesServerWithSqlValidationTest.java AL server/apps/jpa-app/src/test/java/org/apache/james/JPAJamesServerTest.java AL server/apps/jpa-app/src/test/java/org/apache/james/JPAWithLDAPJamesServerTest.java AL server/apps/jpa-app/src/assemble/app.xml MIT server/apps/jpa-app/src/assemble/license-for-binary.txt !????? server/apps/jpa-app/src/assemble/extensions-jars.txt AL server/apps/jpa-app/pom.xml B server/apps/jpa-app/keystore AL server/apps/jpa-app/sample-configuration/webadmin.properties AL server/apps/jpa-app/sample-configuration/listeners.xml !????? server/apps/jpa-app/sample-configuration/extensions.properties AL server/apps/jpa-app/sample-configuration/james-database-mariadb.properties !????? server/apps/jpa-app/sample-configuration/jwt_publickey AL server/apps/jpa-app/sample-configuration/dnsservice.xml AL server/apps/jpa-app/sample-configuration/lmtpserver.xml AL server/apps/jpa-app/sample-configuration/mailetcontainer.xml AL server/apps/jpa-app/sample-configuration/imapserver.xml AL server/apps/jpa-app/sample-configuration/managesieveserver.xml AL server/apps/jpa-app/sample-configuration/domainlist.xml AL server/apps/jpa-app/sample-configuration/mailrepositorystore.xml !????? server/apps/jpa-app/sample-configuration/jvm.properties AL server/apps/jpa-app/sample-configuration/usersrepository.xml AL server/apps/jpa-app/sample-configuration/recipientrewritetable.xml !????? server/apps/jpa-app/sample-configuration/logback.xml AL server/apps/jpa-app/sample-configuration/james-database.properties AL server/apps/jpa-app/sample-configuration/jmx.properties AL server/apps/jpa-app/sample-configuration/smtpserver.xml AL server/apps/jpa-app/sample-configuration/pop3server.xml !????? server/apps/jpa-app/sample-configuration/droplists.properties AL server/apps/jpa-app/sample-configuration/healthcheck.properties AL server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreFactory.java AL server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStoreDAO.java AL server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreDAOTest.java AL server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java AL server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStorePassThroughTest.java AL server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreGCAlgorithmTest.java AL server/blob/blob-memory/pom.xml AL server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java AL server/blob/blob-common/pom.xml AL server/blob/blob-file/src/main/java/org/apache/james/blob/file/FileBlobStoreDAO.java AL server/blob/blob-file/src/main/java/org/apache/james/blob/file/FileBlobStoreFactory.java AL server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreTest.java AL server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStorePassThroughTest.java AL server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreGCAlgorithmTest.java AL server/blob/blob-file/src/test/java/org/apache/james/blob/file/FileBlobStoreDAOTest.java AL server/blob/blob-file/pom.xml AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStoreDAO.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobId.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectNotFoundException.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStorageHealthCheck.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/PlainBlobId.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobPartsId.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobReferenceSource.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobType.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStoreIOException.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/ObjectStoreException.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/MetricableBlobStore.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BlobStore.java AL server/blob/blob-api/src/main/java/org/apache/james/blob/api/BucketName.java B server/blob/blob-api/src/test/resources/shattered-2.pdf B server/blob/blob-api/src/test/resources/shattered-1.pdf AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobTypeTest.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreDAOContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/TestBlobId.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/MetricableBlobStoreContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketNameTest.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreDAOContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/PlainBlobIdTest.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreDAOContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/ReadSaveBlobStoreDAOContract.java AL server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreDAOFixture.java AL server/blob/blob-api/pom.xml AL server/blob/blob-export-file/src/main/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanism.java AL server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/LocalFileBlobExportMechanismTest.java AL server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/FileSystemExtensionTest.java AL server/blob/blob-export-file/src/test/java/org/apache/james/blob/export/file/FileSystemExtension.java AL server/blob/blob-export-file/pom.xml AL server/blob/pom.xml AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraDefaultBucketDAO.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobModule.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAO.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBucketDAO.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/BlobTables.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfiguration.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/BlobStoreCache.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CachedBlobStore.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCache.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/cache/CassandraBlobCacheModule.java AL server/blob/blob-cassandra/src/main/java/org/apache/james/blob/cassandra/CassandraBlobStoreFactory.java !????? server/blob/blob-cassandra/src/test/resources/cassandra-driver.conf AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBucketDAOTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreClOneTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraDefaultBucketDAOTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreContract.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreDAOTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraPassTroughBlobStoreTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CachedBlobStoreTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraCacheConfigurationTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/BlobStoreCacheContract.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/cache/CassandraBlobStoreCacheTest.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreFixture.java AL server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java AL server/blob/blob-cassandra/pom.xml AL server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/PassThroughBlobStore.scala AL server/blob/blob-storage-strategy/src/main/scala/org/apache/james/server/blob/deduplication/DeDuplicationBlobStore.scala AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/MinIOGenerationAwareBlobId.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/GenerationAwareBlobId.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobReferenceAggregate.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/GenerationAware.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BloomFilterGCAlgorithm.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/StorageStrategy.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobGCTaskAdditionalInformationDTO.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobGCTaskDTO.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobGCTask.java AL server/blob/blob-storage-strategy/src/main/java/org/apache/james/server/blob/deduplication/BlobStoreFactory.java B server/blob/blob-storage-strategy/src/test/resources/json/blobGC-legacy.task.json B server/blob/blob-storage-strategy/src/test/resources/json/blobGC.additionalInformation.json B server/blob/blob-storage-strategy/src/test/resources/json/blobGC.task.json B server/blob/blob-storage-strategy/src/test/resources/json/blobGC-legacy.additionalInformation.json AL server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BlobGCTaskSerializationTest.java AL server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BloomFilterGCAlgorithmContract.java AL server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/GenerationAwareBlobIdTest.java AL server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/BlobGCTaskAdditionalInformationDTOTest.java AL server/blob/blob-storage-strategy/src/test/java/org/apache/james/server/blob/deduplication/MinIOGenerationAwareBlobIdTest.java AL server/blob/blob-storage-strategy/pom.xml AL server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessagePartsId.java AL server/blob/mail-store/src/main/java/org/apache/james/blob/mail/MimeMessageStore.java AL server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java AL server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessagePartsIdTest.java AL server/blob/mail-store/pom.xml AL server/blob/blob-postgres/src/main/java/org/apache/james/blob/postgres/PostgresBlobStoreDAO.java AL server/blob/blob-postgres/src/main/java/org/apache/james/blob/postgres/PostgresBlobStorageModule.java AL server/blob/blob-postgres/src/test/java/org/apache/james/blob/postgres/PostgresBlobStoreDAOTest.java AL server/blob/blob-postgres/src/test/java/org/apache/james/blob/postgres/PostgresBlobStoreGCAlgorithmTest.java AL server/blob/blob-postgres/pom.xml AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3RequestOption.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/AwsS3AuthConfiguration.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/sse/S3SSECustomerKeyFactory.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/sse/S3SSECustomerKeyGenerator.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/sse/S3SSECConfiguration.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/Region.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreConfiguration.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/BucketNameResolver.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/JamesS3MetricPublisher.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3ClientFactory.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/MinimalCopyBytesResponseTransformer.java AL server/blob/blob-s3/src/main/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAO.java !????? server/blob/blob-s3/src/test/resources/minio/public.crt !????? server/blob/blob-s3/src/test/resources/minio/private.key AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3HealthCheckTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixAndNamespaceTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/BucketNameResolverTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3WithMinIOGenerationAwareBlobIdTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3SSECContract.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3SSECustomerKeyGeneratorTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/S3BlobStoreDAOWithSSECTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/sse/SingleCustomerKeyFactoryTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/DockerAwsS3Container.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioDocker.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PrefixTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/RegionTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/DockerAwsS3Singleton.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioBlobStoreGCAlgorithmTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/AwsS3AuthConfigurationTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3NamespaceTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreDAOTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/DockerAwsS3Extension.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3BlobStoreConfigurationTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/DockerAwsS3.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3DeDuplicationBlobStoreTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3PassThroughBlobStoreTest.java AL server/blob/blob-s3/src/test/java/org/apache/james/blob/objectstorage/aws/S3MinioExtension.java AL server/blob/blob-s3/pom.xml AL server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/CryptoConfig.java AL server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/PBKDF2StreamingAeadFactory.java AL server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/CryptoConfigBuilder.java AL server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/AESBlobStoreDAO.java AL server/blob/blob-aes/src/main/java/org/apache/james/blob/aes/CryptoException.java AL server/blob/blob-aes/src/test/java/org/apache/james/blob/aes/AESBlobStoreDAOTest.java AL server/blob/blob-aes/pom.xml AL server/blob/blob-export-api/src/main/java/org/apache/james/blob/export/api/FileExtension.java AL server/blob/blob-export-api/src/main/java/org/apache/james/blob/export/api/BlobExportMechanism.java AL server/blob/blob-export-api/src/main/java/org/apache/james/blob/export/api/ExportedFileNamesGenerator.java AL server/blob/blob-export-api/src/test/java/org/apache/james/blob/export/api/ExportedFileNamesGeneratorTest.java AL server/blob/blob-export-api/src/test/java/org/apache/james/blob/export/api/FileExtensionTest.java AL server/blob/blob-export-api/pom.xml AL server/task/task-api/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala AL server/task/task-api/src/main/scala/org/apache/james/task/Hostname.scala AL server/task/task-api/src/main/java/org/apache/james/task/TaskNotFoundException.java AL server/task/task-api/src/main/java/org/apache/james/task/Task.java AL server/task/task-api/src/main/java/org/apache/james/task/TaskType.java AL server/task/task-api/src/main/java/org/apache/james/task/TaskManager.java AL server/task/task-api/src/main/java/org/apache/james/task/TaskId.java AL server/task/task-api/src/main/java/org/apache/james/task/AsyncSafeTask.java AL server/task/task-api/src/test/java/org/apache/james/task/ThrowingTask.java AL server/task/task-api/src/test/java/org/apache/james/task/MemoryReferenceTask.java AL server/task/task-api/src/test/java/org/apache/james/task/TaskIdTest.java AL server/task/task-api/src/test/java/org/apache/james/task/TaskTypeTest.java AL server/task/task-api/src/test/java/org/apache/james/task/TaskTest.java AL server/task/task-api/src/test/java/org/apache/james/task/CompletedTask.java AL server/task/task-api/src/test/java/org/apache/james/task/FailsDeserializationTask.java AL server/task/task-api/src/test/java/org/apache/james/task/FailedTask.java AL server/task/task-api/src/test/java/org/apache/james/task/TaskManagerContract.java AL server/task/task-api/src/test/java/org/apache/james/task/MemoryReferenceWithCounterTask.java AL server/task/task-api/pom.xml AL server/task/task-postgres/src/main/scala/org/apache/james/task/eventsourcing/postgres/PostgresTaskExecutionDetailsProjection.scala AL server/task/task-postgres/src/main/scala/org/apache/james/task/eventsourcing/postgres/PostgresTaskExecutionDetailsProjectionModule.scala AL server/task/task-postgres/src/main/scala/org/apache/james/task/eventsourcing/postgres/PostgresTaskExecutionDetailsProjectionDAO.scala AL server/task/task-postgres/src/test/java/org/apache/james/task/eventsourcing/postgres/PostgresTaskExecutionDetailsProjectionDAOTest.java AL server/task/task-postgres/src/test/java/org/apache/james/task/eventsourcing/postgres/PostgresTaskExecutionDetailsProjectionTest.java !????? server/task/task-postgres/pom.xml AL server/task/task-json/src/main/java/org/apache/james/server/task/json/TaskModuleInjectionKeys.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/TaskExtensionModule.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/JsonTaskSerializer.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/JsonTaskAdditionalInformationSerializer.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/TaskDTO.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/AdditionalInformationDTO.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/TaskDTOModule.java AL server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/AdditionalInformationDTOModule.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/TaskDeserializerTest.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/TaskSerializerTest.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/FailedTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/TestTaskDTOModules.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskStore.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceTaskStore.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/FailsDeserializationTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/ThrowingTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskAdditionalInformationDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/CompletedTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/TestTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceTaskDTO.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/TestTask.java AL server/task/task-json/src/test/java/org/apache/james/server/task/json/TaskSerializationTest.java AL server/task/task-json/pom.xml AL server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueSupplier.scala AL server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueConfiguration.scala AL server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/TaskEventDTO.scala AL server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionModule.scala AL server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionDAO.scala AL server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjection.scala AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerHealthCheck.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueReconnectionHandler.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/TerminationReconnectionHandler.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueue.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/TasksSerializationModule.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/TerminationQueueName.java AL server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/CancelRequestQueueName.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueuePersistenceTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerWithQuorumQueueTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/ImmediateWorker.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionTest.java AL server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/cassandra/CassandraTaskExecutionDetailsProjectionDAOTest.java AL server/task/task-distributed/pom.xml AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/TaskExecutionDetailsProjection.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/Events.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/DecisionProjection.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/WorkerStatusListener.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/TaskAggregate.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/TaskAggregateId.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/WorkQueueSupplier.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/CommandHandlers.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/TaskCommand.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/EventSourcingTaskManager.scala AL server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/TerminationSubscriber.scala AL server/task/task-memory/src/main/java/org/apache/james/task/WorkQueue.java AL server/task/task-memory/src/main/java/org/apache/james/task/SerialTaskManagerWorker.java AL server/task/task-memory/src/main/java/org/apache/james/task/MemoryWorkQueue.java AL server/task/task-memory/src/main/java/org/apache/james/task/MemoryTaskManager.java AL server/task/task-memory/src/main/java/org/apache/james/task/TaskWithId.java AL server/task/task-memory/src/main/java/org/apache/james/task/TaskExecutionDetailsUpdater.java AL server/task/task-memory/src/main/java/org/apache/james/task/TaskManagerWorker.java AL server/task/task-memory/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala AL server/task/task-memory/src/test/java/org/apache/james/task/TaskWithIdTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/SerialTaskManagerWorkerTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/MemoryTaskExecutionDetailsProjectionTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskAggregateTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/EventSourcingTaskManagerTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TerminationSubscriberContract.java AL server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskExecutionDetailsProjectionContract.java AL server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/MemoryTerminationSubscriberTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/MemoryTaskManagerTest.java AL server/task/task-memory/src/test/java/org/apache/james/task/CountDownLatchExtension.java AL server/task/task-memory/pom.xml AL server/src/main/appended-resources/supplemental-models.xml AL server/src/reporting-site/site.xml AL server/pom.xml AL server/dns-service/dnsservice-dnsjava/src/main/resources/META-INF/spring/dns-context.xml AL server/dns-service/dnsservice-dnsjava/src/main/java/org/apache/james/dnsservice/dnsjava/DNSJavaService.java AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/test-zone.com.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/three-mx.bar.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/two-mx.sameprio.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/pippo.com.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/brandilyncollins.com.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/dnstest.com.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/one-mx.bar.zone AL server/dns-service/dnsservice-dnsjava/src/test/resources/org/apache/james/dnsservice/dnsjava/two-mx.differentprio.zone AL server/dns-service/dnsservice-dnsjava/src/test/java/org/apache/james/dnsservice/dnsjava/ZoneCacheLookupRecordsAnswer.java AL server/dns-service/dnsservice-dnsjava/src/test/java/org/apache/james/dnsservice/dnsjava/DNSJavaServiceTest.java AL server/dns-service/dnsservice-dnsjava/src/reporting-site/site.xml AL server/dns-service/dnsservice-dnsjava/pom.xml AL server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/MXHostAddressIterator.java AL server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet4Network.java AL server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/Inet6Network.java AL server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/model/InetNetwork.java AL server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/inetnetwork/InetNetworkBuilder.java AL server/dns-service/dnsservice-library/src/main/java/org/apache/james/dnsservice/library/netmatcher/NetMatcher.java AL server/dns-service/dnsservice-library/src/test/java/org/apache/james/dnsservice/library/inetnetwork/model/InetNetworkTest.java AL server/dns-service/dnsservice-library/src/test/java/org/apache/james/dnsservice/library/inetnetwork/InetNetworkBuilderTest.java AL server/dns-service/dnsservice-library/src/test/java/org/apache/james/dnsservice/library/netmatcher/NetMatcherTest.java AL server/dns-service/dnsservice-library/src/test/java/org/apache/james/dnsservice/library/MXHostAddressIteratorTest.java AL server/dns-service/dnsservice-library/src/reporting-site/site.xml AL server/dns-service/dnsservice-library/pom.xml AL server/dns-service/dnsservice-api/src/main/resources/dnsservice.xml AL server/dns-service/dnsservice-api/src/main/java/org/apache/james/dnsservice/api/DNSService.java AL server/dns-service/dnsservice-api/src/main/java/org/apache/james/dnsservice/api/TemporaryResolutionException.java AL server/dns-service/dnsservice-api/src/main/java/org/apache/james/dnsservice/api/DNSServiceMBean.java AL server/dns-service/dnsservice-api/src/reporting-site/site.xml AL server/dns-service/dnsservice-api/pom.xml AL server/dns-service/dnsservice-test/src/main/java/org/apache/james/dnsservice/api/InMemoryDNSService.java AL server/dns-service/dnsservice-test/src/main/java/org/apache/james/dnsservice/api/mock/DNSFixture.java AL server/dns-service/dnsservice-test/src/main/java/org/apache/james/dnsservice/api/mock/MockDNSService.java AL server/dns-service/dnsservice-test/src/main/java/org/apache/james/dnsservice/api/AbstractDNSServiceTest.java AL server/dns-service/dnsservice-test/pom.xml AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/PopulateMetadataStoreListener.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesDTO.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesTask.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesService.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesAdditionalInformationDTO.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/task/MessageInconsistenciesEntry.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/MemoryPop3MetadataStore.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/Pop3MetadataModule.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/CassandraPop3MetadataStore.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/Pop3MetadataStore.java AL server/protocols/protocols-pop3-distributed/src/main/java/org/apache/james/pop3server/mailbox/DistributedMailboxAdapter.java B server/protocols/protocols-pop3-distributed/src/test/resources/keystore !????? server/protocols/protocols-pop3-distributed/src/test/resources/pop3server.xml AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesDTOTest.java AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesAdditionalInformationDTOTest.java AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/task/MetaDataFixInconsistenciesServiceTest.java AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/CassandraPop3MetadataStoreTest.java AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/Pop3MetadataStoreContract.java AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/MemoryPop3MetadataStoreTest.java AL server/protocols/protocols-pop3-distributed/src/test/java/org/apache/james/pop3server/mailbox/DistributedPop3ServerTest.java AL server/protocols/protocols-pop3-distributed/pom.xml AL server/protocols/webadmin/webadmin-dropwizard-metrics/src/main/java/org/apache/james/webadmin/dropwizard/MetricsRoutes.java AL server/protocols/webadmin/webadmin-dropwizard-metrics/src/test/java/org/apache/james/webadmin/dropwizard/MetricsRoutesTest.java AL server/protocols/webadmin/webadmin-dropwizard-metrics/pom.xml AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UploadRepositoryCleanupTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateFilteringProjectionTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/JmapUploadRoutes.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/MessageFastViewProjectionCorrector.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunningOptionsDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateFilteringProjectionRequestToTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UploadCleanupTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunningOptionsParser.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UserIdentityRoutes.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateFilteringProjectionTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/UploadCleanupTaskDTO.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RunningOptions.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/dto/UserIdentity.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/Constants.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTask.java AL server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTask.java B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.additionalInformation.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/cleanUpload.task.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateAll.task.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.additionalInformation.legacy.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateFilters.additionalInformation.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/cleanUpload.additionalInformation.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/populateFilters.task.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.task.legacy.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeUser.task.legacy.json B server/protocols/webadmin/webadmin-jmap/src/test/resources/json/recomputeAll.additionalInformation.legacy.json AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/UploadCleanupTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateFilteringProjectionItemsTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsRequestToTaskTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/UserIdentitiesRoutesTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/UploadCleanupTaskSerializationTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsRequestToTaskTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskSerializationTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewTaskSerializationTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/JmapUploadRoutesTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateFilteringProjectionRequestToTaskTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewProjectionItemsTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeUserFastViewProjectionItemsTaskSerializationTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/RecomputeAllFastViewProjectionItemsTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateEmailQueryViewRequestToTaskTest.java AL server/protocols/webadmin/webadmin-jmap/src/test/java/org/apache/james/webadmin/data/jmap/PopulateFilteringProjectionTaskSerializationTest.java AL server/protocols/webadmin/webadmin-jmap/pom.xml AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/MailRepositoryStoreService.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/HeadersDto.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/SingleMailRepositoryResponse.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/InaccessibleFieldException.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailRepositoryResponse.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/ExtendedMailRepositoryResponse.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailKeyDTO.java AL server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java !????? server/protocols/webadmin/webadmin-mailrepository/src/test/resources/mail.eml AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/MailRepositoryStoreServiceTest.java AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/WebAdminClearMailRepositoryTaskDTOTest.java AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java AL server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java AL server/protocols/webadmin/webadmin-mailrepository/pom.xml AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueItemDTO.java AL server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/ForceDelivery.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/WebAdminDeleteMailsFromMailQueueTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesUnitTest.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueDTOTest.java AL server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/dto/MailQueueItemDTOTest.java AL server/protocols/webadmin/webadmin-mailqueue/pom.xml AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/Quotas.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/MailboxName.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/jackson/QuotaModule.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverAllTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/CreateMissingParentsTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ClearMailboxContentTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExpireMailboxTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/CreateMissingParentsRequestToTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverGroupTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverOneTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverOneTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/SubscribeAllTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverGroupTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/CreateMissingParentsTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverAllTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExportService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExpireMailboxService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ClearMailboxContentTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/MailboxesExportRequestToTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExpireMailboxAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/SubscribeAllTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventRetriever.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/SubscribeAllRequestToTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ClearMailboxContentTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/SubscribeAllTask.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/ExpireMailboxDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/PreviousReIndexingService.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/utils/MailboxHaveChildrenException.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/MessagesRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/ReindexingRunningOptionsParser.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserMailboxesRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/MailboxesRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/EventDeadLettersRoutes.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueDeserializer.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminIndexationContextInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminUserReindexingTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/MailboxResponse.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxReindexingTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailures.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDomainDTO.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueSerializer.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/condition/user/HasNoMailboxesCondition.java AL server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/condition/user/HasNotAllSystemMailboxesCondition.java B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/subscribeAll.additionalInformation.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/mailboxesExport.task.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/subscribeAll.task.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/createMissingParents.task.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/mailboxesExport.additionalInformation.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/clearMailboxContent.additionalInformation.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/clearMailboxContent.task.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/expireMailbox.additionalInformation.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/expireMailbox.age.task.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/createMissingParents.additionalInformation.json B server/protocols/webadmin/webadmin-mailbox/src/test/resources/json/expireMailbox.header.task.json AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaLimitValueTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/CreateMissingParentsRequestToTaskTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExpireMailboxTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExpireMailboxServiceTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/SubscribeAllTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportRequestToTaskTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/SubscribeAllRequestToTaskTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExpireMailboxTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/CreateMissingParentsTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/SubscribeAllTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ClearMailboxContentTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/MailboxesExportTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ExportServiceTestSystem.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/ClearMailboxContentTaskAdditionalInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/CreateMissingParentsTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesExpireTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserRoutesWithMailboxParamTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MessageRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/ScanningQuotaSearchExtension.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesNoTasksTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesNoIndexationTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MalformedUrlRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/OpenSearchQuotaSearchExtension.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/SerializableReIndexingExecutionFailuresTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminIndexationContextInformationDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminUserReIndexingDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/WebAdminSingleMailboxIndexingDTOTest.java AL server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaLimitValueDeserializerTest.java AL server/protocols/webadmin/webadmin-mailbox/pom.xml AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UsernameChangeService.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UsernameChangeTask.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUsersDataOfDomainTask.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUsersDataOfDomainTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UsernameChangeTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UsernameChangeTaskDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUserDataTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUserDataTaskDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUsersDataOfDomainTaskDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUserDataService.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DeleteUserDataTask.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AliasRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DeleteUserDataRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/BlobRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DLPConfigurationRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MailAddressParser.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UsernameChangeRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveScriptRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainMappingsRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/AddressMappingRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DropListRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MappingRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserCreationRequestLogger.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/VacationRoutes.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/UserResponse.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/ForwardDestinationResponse.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/MappingsModule.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/VerifyUserRequest.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/DLPConfigurationDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/DomainAliasResponse.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/AliasSourcesResponse.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/VacationDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/DLPConfigurationItemDTO.java AL server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/dto/AddUserRequest.java !????? server/protocols/webadmin/webadmin-data/src/test/resources/sieve/my_sieve AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/service/DeleteUsersDataOfDomainTaskSerializationTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/service/DeleteUsersDataOfDomainTaskTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/service/UsernameChangeTaskSerializationTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/service/DeleteUserDataTaskSerializationTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/BlobRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/AddressMappingRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/VacationRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsernameChangeRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveScriptRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/MappingRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DLPConfigurationRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/AliasRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DropListRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DeleteUserDataRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/dto/DomainAliasResponseTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/dto/DLPConfigurationItemDTOTest.java AL server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/dto/VacationDTOTest.java AL server/protocols/webadmin/webadmin-data/pom.xml AL server/protocols/webadmin/webadmin-pop3/src/main/java/org/apache/james/pop3/webadmin/Pop3MetaDataFixInconsistenciesTaskRegistration.java AL server/protocols/webadmin/webadmin-pop3/src/test/java/org/apache/james/pop3/webadmin/Pop3MetaDataFixInconsistenciesRoutesTest.java AL server/protocols/webadmin/webadmin-pop3/pom.xml !????? server/protocols/webadmin/webadmin-pop3/README.md AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/UserClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/model/UserPassword.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/model/UserName.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/model/DomainAlias.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/model/MailboxName.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/MailboxClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/WebAdminHTTPClientFactory.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/QuotaClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/DomainClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/feign/DomainFeignClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/feign/UserFeignClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/feign/JamesFeignException.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/feign/MailboxFeignClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/feign/QuotaFeignClient.java AL server/protocols/webadmin/webadmin-http-client/src/main/java/org/apache/james/webadmin/httpclient/FeignHelper.java AL server/protocols/webadmin/webadmin-http-client/src/test/java/org/apache/james/webadmin/httpclient/MailboxClientTest.java AL server/protocols/webadmin/webadmin-http-client/src/test/java/org/apache/james/webadmin/httpclient/DomainClientTest.java AL server/protocols/webadmin/webadmin-http-client/src/test/java/org/apache/james/webadmin/httpclient/UserClientTest.java AL server/protocols/webadmin/webadmin-http-client/src/test/java/org/apache/james/webadmin/httpclient/QuotaClientTest.java AL server/protocols/webadmin/webadmin-http-client/pom.xml AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/services/TasksCleanupService.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/tasks/TasksCleanupTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/tasks/TasksCleanupTaskDTO.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/tasks/TasksCleanupTask.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/TasksCleanupRoutes.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/CassandraMailboxMergingRoutes.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMailboxInconsistenciesRequestToTask.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/RecomputeMailboxCountersRequestToTask.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/RunningOptionsParser.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/CassandraMigrationRoutes.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageRecentInconsistenciesRequestToTask.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageDeletedInconsistenciesRequestToTask.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTask.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/CassandraVersionRequest.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/CassandraVersionResponse.java AL server/protocols/webadmin/webadmin-cassandra/src/main/java/org/apache/james/webadmin/dto/MailboxMergingRequest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/CassandraMigrationRoutesTest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMessageInconsistenciesRequestToTaskTest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/SolveMailboxInconsistenciesRequestToTaskTest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/TasksCleanupRoutesTest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/routes/RecomputeMailboxCountersRequestToTaskTest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/VersionRequestTest.java AL server/protocols/webadmin/webadmin-cassandra/src/test/java/org/apache/james/webadmin/dto/WebAdminMigrationTaskSerializationTest.java AL server/protocols/webadmin/webadmin-cassandra/pom.xml AL server/protocols/webadmin/pom.xml AL server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/service/CassandraMappingsSolveInconsistenciesTask.java AL server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/service/CassandraMappingsService.java AL server/protocols/webadmin/webadmin-cassandra-data/src/main/java/org/apache/james/webadmin/routes/CassandraMappingsRoutes.java AL server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/service/CassandraMappingsSolveInconsistenciesTaskTest.java AL server/protocols/webadmin/webadmin-cassandra-data/src/test/java/org/apache/james/webadmin/routes/CassandraMappingsRoutesTest.java AL server/protocols/webadmin/webadmin-cassandra-data/pom.xml AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/authentication/AuthenticationFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/authentication/JwtFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/authentication/NoAuthenticationFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/PublicRoutes.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/FixedPortSupplier.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminServer.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/UserCondition.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/WebAdminConfiguration.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/tasks/TaskFromRequestRegistry.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/tasks/TaskFromRequest.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/tasks/TaskRegistrationKey.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/tasks/TaskIdDto.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/TlsConfiguration.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/jettyserver/JettyHandler.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/jettyserver/EmbeddedJettyServer.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/jettyserver/JettyServer.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/jettyserver/SocketConnectorFactory.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/jettyserver/EmbeddedJettyFactory.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/RequestLogger.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingRequestFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/MDCFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/MDCCleanupFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/LoggingResponseFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/mdc/RequestId.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonTransformer.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonTransformerModule.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ParametersExtractor.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/ErrorResponder.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractor.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/Responses.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/utils/JsonExtractException.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/PortSupplier.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/CORSRoute.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/HealthCheckRoutes.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/routes/TasksRoutes.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/ExecutionDetailsDto.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/HealthCheckExecutionResultDto.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/HealthCheckDto.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/DTOModuleInjections.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/dto/HeathCheckAggregationExecutionResultDto.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Constants.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/RandomPortSupplier.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/CORSFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/metric/MetricPreFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/metric/MetricPostFilter.java AL server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Routes.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/authentication/JwtFilterTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/tasks/TaskFromRequestRegistryTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/tasks/TaskFromRequestTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/tasks/TaskRegistrationKeyTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/FixedPortSupplierTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/mdc/RequestIdTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtilsTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ParametersExtractorTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/ErrorResponderTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/utils/JsonExtractorTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminServerTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminConfigurationTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/HealthCheckRoutesTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutes.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/ErrorRoutesTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/routes/TasksRoutesTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/RandomPortSupplierTest.java AL server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/TlsConfigurationTest.java AL server/protocols/webadmin/webadmin-core/pom.xml AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/service/RepublishNotProcessedMailsTaskDTO.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/service/BrowseStartUpdateTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/service/RepublishNotProcessedMailsTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/service/BrowseStartUpdateTaskDTO.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/service/BrowseStartUpdateTask.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/service/RepublishNotprocessedMailsTask.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/routes/BrowseStartUpdateTaskRegistration.java AL server/protocols/webadmin/webadmin-rabbitmq/src/main/java/org/apache/james/webadmin/routes/RabbitMQMailQueuesRoutes.java AL server/protocols/webadmin/webadmin-rabbitmq/src/test/java/org/apache/james/webadmin/service/RepublishNotprocessedMailsTaskTest.java AL server/protocols/webadmin/webadmin-rabbitmq/src/test/java/org/apache/james/webadmin/routes/RabbitMQMailQueuesRoutesTest.java AL server/protocols/webadmin/webadmin-rabbitmq/pom.xml AL server/protocols/webadmin/webadmin-protocols/src/main/java/org/apache/james/protocols/webadmin/ProtocolServerRoutes.java AL server/protocols/webadmin/webadmin-protocols/pom.xml AL server/protocols/webadmin/webadmin-mail-over-web/src/main/java/org/apache/james/webadmin/routes/TransferEmailRoutes.java !????? server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message.eml !????? server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message-without-from.eml !????? server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message-without-tos.eml AL server/protocols/webadmin/webadmin-mail-over-web/src/test/java/org/apache/james/routes/TransferEmailRoutesTest.java AL server/protocols/webadmin/webadmin-mail-over-web/pom.xml AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/ExportService.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/RestoreService.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/has_no_attachment.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/string_equals.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/string_equals_ignore_case.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/zoned_date_time_before_or_equals.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/string_contains.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/has_sender.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/zoned_date_time_after_or_equals.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/contains_origin_mailbox.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/has_attachment.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/contains_recipient.json B server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/resources/query/string_contains_ignore_case.json AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebadminApiQuerySerializationContractTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultDeleteTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/WebAdminDeletedMessagesVaultRestoreTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java AL server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/pom.xml !????? server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java !????? server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java !????? server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java !????? server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java !????? server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java !????? server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java !????? server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java !????? server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java !????? server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java !????? server/protocols/jmap-rfc-8621/doc/specs/rfc/src/jmap.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/rfc/src/quotas.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/rfc/src/mail.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/README.md AL server/protocols/jmap-rfc-8621/doc/specs/LICENSE.md !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/message.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/mailbox.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/identity.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/identitySortOrder.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/messagesubmission.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/rights.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/securityconsiderations.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/thread.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/ianaconsiderations.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/searchsnippet.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/vacationresponse.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/delegation.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/mail/intro.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/custom-quotas/quotas.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/securityconsiderations.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/ianaconsiderations.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/quota.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/intro.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/push.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/securityconsiderations.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/session.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/ianaconsiderations.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/binary.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/api.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/intro.mdown !????? server/protocols/jmap-rfc-8621/doc/specs/spec/authentication.mdown !????? server/protocols/jmap-rfc-8621/doc/README.md AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/metrics/HttpClientMetrics.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/ResponseSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/SearchSnippetSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/PushSubscriptionSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/VacationSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/QuotaSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MailboxSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/PushSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/package.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailSetSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MailboxQuerySerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/ThreadSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/IdentitySerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/BackReferenceDeserializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailGetSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/UploadSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailSubmissionSetSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/DelegationSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/MDNSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/highlight/SearchSnippetGetRequest.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/IdentitySet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailAddressGroup.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Keywords.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailSubmissionSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/BlobId.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxQuery.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MinimalEmailBodyPart.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Mailbox.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyPart.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/IdentityGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Thread.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailBodyValue.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Rights.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MDN.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/IdentityChanges.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailHeader.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Email.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MDNSend.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxQueryChanges.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/KeywordsCombiner.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailParse.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailImport.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Keyword.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxNamespace.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MDNParse.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/Quotas.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/WebPushClient.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushRequest.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/pushsubscription/PushListener.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetCreatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountDeletePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/IdentityChangesMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/QuotaChangesMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/IdentitySetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/ThreadChangesMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/CoreEchoMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetUpdatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetDeletePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionUpdatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetCreatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/ThreadGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/IdentitySetCreatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSubmissionSetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionSetDeletePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxQueryChangesMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseSetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionSetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/QuotaQueryMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegateSetDeletePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/IdentityGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MDNParseMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/VacationResponseGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/Method.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetDeletePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetCreatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/package.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetMethod.scala !????? server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionSetCreatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/SearchSnippetGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/IdentitySetDeletePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/QuotaGetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxChangesMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailImportMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/DelegatedAccountSetMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxSetUpdatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailParseMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/IdentitySetUpdatePerformer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailChangesMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MDNSendMethod.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/vacation/VacationResponseSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/vacation/VacationResponseGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/vacation/VacationResponse.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/SessionTranslator.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Session.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Invocation.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/RequestLevelErrorType.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/SetError.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Id.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Query.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/PushSubscriptionSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/UTCDate.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capabilities.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/ProblemDetails.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/PushSubscriptionGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/UnsignedInt.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/RequestObject.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/ResponseObject.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/WebSocketTransport.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Properties.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/JmapRfc8621Configuration.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capability.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/DelegateSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/Delegation.scala !????? server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/DelegatedAccountSet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/DelegateGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/DelegatedAccountGet.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/MailboxesProvisioner.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/UserProvisioning.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/http/BasicAuthenticationStrategy.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/quotas/QuotaReader.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/quotas/QuotaLoaderWithPreloadedDefault.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/quotas/QuotaLoader.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/SessionRoutes.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/DownloadRoutes.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/SessionSupplier.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JmapApi.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/ProcessingContext.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/UploadRoutes.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/EventSourceRoutes.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/AccountIdRegistrationKey.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/EventDTOModule.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/JmapEventSerializer.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/StateChangeListener.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/MailboxChangeListener.scala AL server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/StateChange.scala AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListener.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/send/MailMetadata.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/send/MailShouldBeInOutboxException.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/send/PostDequeueDecoratorFactory.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/send/PostDequeueDecorator.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mime4j/JamesBodyDescriptorBuilder.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mime4j/MaximalBodyDescriptor.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachment.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/ExtractMDNOriginalJMAPMessageId.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/filter/ContentMatcher.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/filter/RuleMatcher.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/filter/MailMatcher.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/filter/ActionApplier.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/filter/HeaderExtractor.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/mailet/SentByJmap.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/http/rfc8621/InjectionKeys.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/utils/AccountIdUtil.java AL server/protocols/jmap-rfc-8621/src/main/java/org/apache/james/jmap/utils/JsoupHtmlTextExtractor.java AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/EmailSubmissionSetSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/ResponseObjectSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/JsErrorSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/MailboxSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/VacationResponseSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/RequestObjectSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/SearchSnippetSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/PushSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/BackReferenceTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/VacationResponseGetSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/MDNSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/MailboxGetSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/SessionSerializationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/Fixture.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/EmailSetSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/PushSubscriptionSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/json/QuotaSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/mail/RightsTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/mail/MailboxTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushSubscriptionSetCreateProcessorTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushServerExtension.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushRequestTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/SafeWebPushClientContract.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/PushListenerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/pushsubscription/WebPushClientContract.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/method/CoreEchoMethodTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/core/UTCDateTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/core/KeywordsTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/core/JmapUrlEndpointResolverTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/core/KeywordsCombinerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/core/MailboxValidationTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/core/KeywordTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/http/UserProvisioningTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/http/MailboxesProvisionerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/http/UserCredentialParserTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/SessionRoutesTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/SessionSupplierTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/change/TypeStateFactoryTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/change/MailboxChangeListenerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/change/AccountIdRegistrationKeyTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/change/StateChangeEventSerializerTest.scala AL server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/change/StateChangeListenerTest.scala !????? server/protocols/jmap-rfc-8621/src/test/resources/spamMail.eml !????? server/protocols/jmap-rfc-8621/src/test/resources/fullMessage.eml !????? server/protocols/jmap-rfc-8621/src/test/resources/example.html !????? server/protocols/jmap-rfc-8621/src/test/resources/emptyBodyMessageWithOneAttachment.eml !????? server/protocols/jmap-rfc-8621/src/test/resources/calendar.eml AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/ComputeMessageFastViewProjectionListenerTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PopulateEmailQueryViewListenerTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/pushsubscription/DefaultWebPushClientTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/pushsubscription/DefaultWebPushClientServerSideForgeryTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/send/MailMetadataTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/send/PostDequeueDecoratorTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachmentTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/mailet/SentByJmapTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringFixture.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java AL server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/utils/JsoupHtmlTextExtractorTest.java AL server/protocols/jmap-rfc-8621/pom.xml AL server/protocols/protocols-smtp/src/main/resources/META-INF/spring/smtpserver-context.xml AL server/protocols/protocols-smtp/src/main/resources/smtpserver.xml AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/priority/SmtpMtPriorityEhloHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/priority/SmtpMtPriorityParameterHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/priority/SmtpMtPriorityParameters.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/priority/SmtpMtPriorityMessageHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/MailPriorityHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/futurerelease/FutureReleaseParameters.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/futurerelease/FutureReleaseMailParameterHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/futurerelease/FutureReleaseEHLOHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/tls/SmtpRequireTlsEhloHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/tls/SmtpRequireTlsParameterHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/tls/SmtpRequireTlsMessageHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesDataCmdHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNMessageHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNEhloHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNMailParameterHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/dsn/DSNRcptParameterHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SenderAuthIdentifyVerificationHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SendMailHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/POP3BeforeSMTPHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesWelcomeMessageHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesRcptCmdHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SmtpMetrics.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerFactory.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SmtpMetricsImpl.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPServerMBean.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelInboundHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/SMTPCommandHandlerStats.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/CommandHandlerResultJMXMonitor.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/SMTPCommandHandlerStatsMBean.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/HookStatsMBean.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/JMXHandlersLoader.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/ConnectHandlerResultJMXMonitor.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/LineHandlerResultJMXMonitor.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/HookResultJMXMonitor.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/jmx/HookStats.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/CoreCmdHandlerLoader.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/ExtendedSMTPSession.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SetMimeHeaderHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/model/ProtocolMailAddressAdapter.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AddDefaultAttributesMessageHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SMTPConstants.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/DataLineJamesMessageHookHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/TLDLookup.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/UsersRepositoryAuthHook.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMailCmdHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/DNSRBLHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ReverseEqualsEhloHeloHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/URIScanner.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptMX.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/JDBCGreylistHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidSenderDomainHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/MaxRcptHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/URIRBLHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/SpamTrapHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/SPFHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ResolvableEhloHeloHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/MaxUnknownCmdHandler.java AL server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMessageHook.java AL server/protocols/protocols-smtp/src/test/resources/smtpserver-requireSSL.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-disabled-feature.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-no-plain.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-mtPriority.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-noauth.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-proxy.xml !????? server/protocols/protocols-smtp/src/test/resources/smtpserver-requireTls.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-tls.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-dsn.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-authAnnounceSometimeNotMatching.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-futurerelease.xml B server/protocols/protocols-smtp/src/test/resources/keystore !????? server/protocols/protocols-smtp/src/test/resources/log4j.xml B server/protocols/protocols-smtp/src/test/resources/test_keystore AL server/protocols/protocols-smtp/src/test/resources/smtpserver-authAnnounceAlways.xml !????? server/protocols/protocols-smtp/src/test/resources/smtpserver-advancedSecurity.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-authAnnounceNever.xml AL server/protocols/protocols-smtp/src/test/resources/smtpserver-authAnnounceSometimeMatching.xml AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/priority/SmtpMtPriorityParametersTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTestSystem.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/futurerelease/FutureReleaseParametersTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPProxyProtocolTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/DSNTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SmtpMtPriorityMessageHookTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPSaslTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/DisableFeatureTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/FutureReleaseTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SPFHandlerTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SmtpRequireTlsMessageHookTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPSTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPTestConfiguration.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/POP3BeforeSMTPHandlerTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptMXTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/URIRBLHandlerTest.java AL server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/AuthAnnounceTest.java AL server/protocols/protocols-smtp/src/reporting-site/site.xml AL server/protocols/protocols-smtp/pom.xml !????? server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java !????? server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/LegacyJavaEncryptionFactory.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/POP3BeforeSMTPHelper.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractProtocolAsyncServer.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/CertificateReloadable.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractServerFactory.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/AbstractLineHandlerResultJMXMonitor.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/ServerMBean.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/CommandHandlerStatsMBean.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/LineHandlerStats.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/HandlerStatsMBean.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/AbstractConnectHandlerResultJMXMonitor.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/ConnectHandlerStats.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/AbstractCommandHandlerResultJMXMonitor.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/jmx/AbstractCommandHandlerStats.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/handler/ProtocolHandlerLoader.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/handler/HandlersPackage.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/SslConfig.java AL server/protocols/protocols-library/src/main/java/org/apache/james/protocols/lib/ProtocolHandlerChainImpl.java !????? server/protocols/protocols-library/src/test/resources/testServerTLSDefaultAuth.xml !????? server/protocols/protocols-library/src/test/resources/testServerDisabled.xml !????? server/protocols/protocols-library/src/test/resources/testServerStartTLS.xml !????? server/protocols/protocols-library/src/test/resources/testServerTLSNeedAuth.xml !????? server/protocols/protocols-library/src/test/resources/testServerDefaults.xml B server/protocols/protocols-library/src/test/resources/keystore !????? server/protocols/protocols-library/src/test/resources/testServerPlain.xml !????? server/protocols/protocols-library/src/test/resources/testServerTLS.xml AL server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/ConfigLoader.java AL server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerLoader.java AL server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/AbstractConfigurableAsyncServerTest.java AL server/protocols/protocols-library/src/reporting-site/site.xml AL server/protocols/protocols-library/pom.xml AL server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPUrls.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/Endpoint.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoutesHandler.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/UnauthorizedException.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/exceptions/NoAuthorizationSuppliedException.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/VersionParser.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/HttpConstants.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/Version.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/AuthenticationStrategy.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/AuthenticationScheme.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/AuthenticationChallenge.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/Authenticator.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/AuthenticateHeader.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/XUserAuthenticationStrategy.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/http/JWTAuthenticationStrategy.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/UriMatcher.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServer.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoute.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPRoutes.java AL server/protocols/jmap/src/main/java/org/apache/james/jmap/InjectionKeys.java AL server/protocols/jmap/src/test/java/org/apache/james/jmap/FixedUriMatcherTest.java AL server/protocols/jmap/src/test/java/org/apache/james/jmap/EndpointTest.java AL server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServerTest.java AL server/protocols/jmap/src/test/java/org/apache/james/jmap/VersionTest.java AL server/protocols/jmap/src/test/java/org/apache/james/jmap/VersionParserTest.java AL server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPConfigurationTest.java AL server/protocols/jmap/pom.xml AL server/protocols/protocols-managesieve/src/main/resources/META-INF/spring/managesieveserver-context.xml AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveMDCContext.java AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/NettyConstants.java AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerFactory.java AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerMBean.java AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java AL server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ChannelManageSieveResponseWriter.java !????? server/protocols/protocols-managesieve/pom.xml AL server/protocols/protocols-lmtp/src/main/resources/META-INF/spring/lmtpserver-context.xml AL server/protocols/protocols-lmtp/src/main/resources/lmtpserver.xml AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServerFactory.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPMetricsImpl.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServerMBean.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/jmx/CommandHandlerResultJMXMonitor.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/jmx/JMXHandlersLoader.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/jmx/ConnectHandlerResultJMXMonitor.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/jmx/LineHandlerResultJMXMonitor.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/CoreCmdHandlerLoader.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/MailetContainerHandler.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/DataLineLMTPHandler.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/MailetContainerCmdHandlerLoader.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/hook/MailboxDeliverToRecipientHandler.java AL server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/NoopJamesMessageHook.java AL server/protocols/protocols-lmtp/src/test/resources/lmtp.xml AL server/protocols/protocols-lmtp/src/test/resources/lmtpnormaldsn.xml AL server/protocols/protocols-lmtp/src/test/resources/lmtpdsn.xml AL server/protocols/protocols-lmtp/src/test/resources/lmtpmailet.xml AL server/protocols/protocols-lmtp/src/test/java/org/apache/james/lmtpserver/LmtpServerTest.java AL server/protocols/protocols-lmtp/src/reporting-site/site.xml AL server/protocols/protocols-lmtp/pom.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/webadmin.properties AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/listeners.xml !????? server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/jwt_publickey AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/dnsservice.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/lmtpserver.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/mailetcontainer.xml !????? server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/eml/emailWithOnlyAttachment.eml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/imapserver.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/managesieveserver.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/domainlist.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/mailrepositorystore.xml B server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/keystore AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/smtpserver.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/pop3server.xml AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/MailReceptionCheckIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationImmutableTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/WorkQueueEnabledDeletedMessageVaultIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerBlobGCIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQQuotaSearchIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationImmutableTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQUnauthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java AL server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/pom.xml AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationImmutableTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/WebAdminServerIntegrationTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/AuthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/ExportRequest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessagesVaultRequests.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/vault/DeletedMessageVaultIntegrationTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/JwtFilterIntegrationTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/UnauthorizedModule.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/FastViewProjectionHealthCheckIntegrationContract.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/ForwardIntegrationTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/QuotaSearchIntegrationTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/UnauthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/src/main/java/org/apache/james/webadmin/integration/TestFixture.java AL server/protocols/webadmin-integration-test/webadmin-integration-test-common/pom.xml AL server/protocols/webadmin-integration-test/pom.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/webadmin.properties AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/listeners.xml !????? server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/jwt_publickey AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/dnsservice.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/lmtpserver.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/mailetcontainer.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/imapserver.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/managesieveserver.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/domainlist.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/mailrepositorystore.xml B server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/keystore AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/smtpserver.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/pop3server.xml AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationImmutableTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUnauthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/DisabledMetricsTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUsernameChangeIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryQuotaSearchIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryForwardIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUserDeletionIntegrationTest.java AL server/protocols/webadmin-integration-test/memory-webadmin-integration-test/pom.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/webadmin.properties AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/listeners.xml !????? server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/jwt_publickey AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/dnsservice.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/lmtpserver.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/mailetcontainer.xml !????? server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/eml/emailWithOnlyAttachment.eml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/imapserver.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/managesieveserver.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/domainlist.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/mailrepositorystore.xml B server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/keystore AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/smtpserver.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/pop3server.xml AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/vault/PostgresDeletedMessageVaultIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresJwtFilterIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresUnauthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresWebAdminServerBlobGCIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresAuthorizedEndpointsTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresPopulateEmailQueryViewTaskIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresWebAdminServerIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresFastViewProjectionHealthCheckIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresQuotaSearchIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresForwardIntegrationTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/postgres/PostgresWebAdminServerIntegrationImmutableTest.java AL server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/pom.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/listeners.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/dnsservice.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/mailetcontainer.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/imapserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/managesieveserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/domainlist.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/mailrepositorystore.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/usersrepository.xml B server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/keystore !????? server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/smtpserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/pop3server.xml !????? server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/rabbitmq.properties AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresPushSubscriptionSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEmailGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEmailQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEmailSubmissionSetMethodFutureReleaseTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresVacationResponseSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresCustomMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEmailSubmissionSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresQuotaGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresJmapPreviewTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMDNSendMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresThreadGetTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresDownloadTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMailboxChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresWebSocketTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresQuotaChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresIdentityGetTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresVacationResponseGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMailboxGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEchoMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresAuthenticationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresWebPushTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresProvisioningTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresDelegatedAccountSetTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresDelegatedAccountGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEmailSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMailboxQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMailboxQueryChangesTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresQuotaQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresIdentitySetTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresEmailChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresBase.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresSessionRoutesTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresCustomNamespaceTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMDNParseMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresMailboxSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/pom.xml AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegatedAccountSetContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxSetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/VacationRelayIntegrationTest.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ImapKeywordsConsistencyContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxQueryChangesContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailParseMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegatedAccountGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EchoMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/QuotaQueryMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegateSetContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/QuotaChangesMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MDNParseMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/SessionRoutesContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/VacationResponseGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketWithPingIntervalContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EventSourceContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/JmapRequests.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailChangesMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/BackReferenceContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/QuotaGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/VacationResponseSetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/JmapPreviewContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/PushSubscriptionSetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/tags/CategoryTags.java AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/IdentityChangesContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ProvisioningContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetMethodFutureReleaseContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/PushServerExtension.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CorsHeaderAPITest.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailImportContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/probe/DelegationProbe.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/AuthenticationContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ThreadChangesContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/custom/authentication/strategy/DenyAuthenticationStrategy.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/custom/authentication/strategy/ModularizeJmapRFC8621AuthenticationStrategyContract.java AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/custom/authentication/strategy/AllowAuthenticationStrategy.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/IdentitySetContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebPushContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSubmissionSetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/SearchSnippetGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/package.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxQueryMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ImapSetMessagesMailboxesUpdatesCompatibilityContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ThreadGetContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomNamespaceContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DownloadContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DelegateGetMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/IdentityGetContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/QuotaMailingTest.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/Fixture.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/DisabledCapabilityContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/VacationIntegrationTest.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MDNSendMethodContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxChangesMethodContract.scala !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/nested.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/inlined-single-attachment.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_complex.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/related_in_alternative_multipart.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/alternative.cal.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/html.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/inlined-mixed.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/multipart_simple.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_simple.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/multipart_complex.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_relate_original_message.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/html_body.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/alternative.eml !????? server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/nested2.eml AL server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/pom.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/listeners.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/dnsservice.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/lmtpserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/mailetcontainer.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/imapserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/managesieveserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/domainlist.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/mailrepositorystore.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/usersrepository.xml B server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/keystore !????? server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/smtpserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/pop3server.xml AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCorsHeaderAPITest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDownloadTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEventSourceTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryQuotaMailingTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMDNSendMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailSubmissionSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryQuotaQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryQuotaChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryVacationRelayIntegrationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryVacationResponseSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryAuthenticationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDisabledCapabilityTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryThreadGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIdentityGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryModularizeJmapRFC8621AuthenticationStrategyContract.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailImportTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIMAPKeywordsInconsistenciesTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIdentitySetMethodTests.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIdentityChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemorySearchSnippetGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegatedAccountGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryWebSocketTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryVacationResponseGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIMAPSetMessagesCompatibilityTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegateSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryProvisioningTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailParseMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegatedAccountSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemorySessionRouteTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryPushSubscriptionSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryQuotaGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryBackReferenceTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailSubmissionSetMethodFutureReleaseTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEmailQueryMethodNoViewTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryWebSocketWithPingIntervalTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryBase.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCustomNamespaceTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMailboxQueryChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryMDNParseMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryThreadChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryCustomMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryWebPushTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryDelegateGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryVacationIntegrationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/pom.xml AL server/protocols/jmap-rfc-8621-integration-tests/pom.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/listeners.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/dnsservice.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/lmtpserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/mailetcontainer.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/imapserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/domainlist.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/mailrepositorystore.xml B server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/keystore !????? server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/smtpserver.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/pop3server.xml AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedProvisioningTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedWebSocketTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEchoMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedSessionRouteTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailQueryMethodNoViewTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDownloadTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedVacationIntegrationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedIMAPSetMessagesCompatibilityTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedThreadGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxQueryChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedJmapPreviewTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMDNParseMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedVacationResponseGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedAuthenticationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCustomNamespaceTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedQuotaGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedIdentitySetTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedQuotaMailingTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/ReadLevelTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailSubmissionSetMethodtest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegateSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedIdentityGetTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailChangeMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedBase.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegatedAccountSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedWebPushTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedQuotaQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailQueryMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedQuotaChangesMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedPushSubscriptionSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxChangeMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMDNSendMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedVacationRelayIntegrationTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegateGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCorsHeaderAPITest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailSubmissionSetMethodFutureReleaseTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedSearchSnippetGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEmailSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedMailboxSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedDelegatedAccountGetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedCustomMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedVacationResponseSetMethodTest.java AL server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/pom.xml AL server/protocols/jwt/src/main/java/org/apache/james/jwt/PublicKeyProvider.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/JwksPublicKeyProvider.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/DefaultPublicKeyProvider.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/JwtConfiguration.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/JwtTokenVerifier.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/introspection/TokenIntrospectionResponse.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/introspection/TokenIntrospectionException.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/introspection/IntrospectionEndpoint.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/PublicKeyReader.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/userinfo/UserinfoResponse.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/userinfo/UserInfoCheckException.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/CheckTokenClient.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/DefaultCheckTokenClient.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/OidcJwtTokenVerifier.java AL server/protocols/jwt/src/main/java/org/apache/james/jwt/MissingOrInvalidKeyException.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/OidcJwtTokenVerifierTest.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/JwksPublicKeyProviderTest.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/OidcTokenFixture.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/introspection/DefaultCheckTokenClientTest.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/JwtConfigurationTest.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/JwtTokenVerifierTest.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/DefaultPublicKeyProviderTest.java AL server/protocols/jwt/src/test/java/org/apache/james/jwt/PublicKeyReaderTest.java AL server/protocols/jwt/pom.xml AL server/protocols/protocols-pop3/src/main/resources/META-INF/spring/pop3server-context.xml AL server/protocols/protocols-pop3/src/main/resources/pop3server.xml AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3ServerMBean.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3Server.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/netty/POP3ServerFactory.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/jmx/CommandHandlerResultJMXMonitor.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/jmx/POP3CommandHandlerStatsMBean.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/jmx/POP3CommandHandlerStats.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/jmx/JMXHandlersLoader.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/jmx/ConnectHandlerResultJMXMonitor.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/jmx/LineHandlerResultJMXMonitor.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/core/CoreCmdHandlerLoader.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/DefaultMailboxAdapterFactory.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java AL server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapterFactory.java B server/protocols/protocols-pop3/src/test/resources/keystore !????? server/protocols/protocols-pop3/src/test/resources/pop3server.xml AL server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java AL server/protocols/protocols-pop3/src/reporting-site/site.xml AL server/protocols/protocols-pop3/pom.xml AL server/protocols/protocols-imap4/src/main/resources/META-INF/spring/imapserver-context.xml AL server/protocols/protocols-imap4/src/main/resources/imapserver.xml AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapMetrics.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyConstants.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPHealthCheck.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/TrafficShapingConfiguration.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapHeartbeatHandler.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ChannelImapResponseWriter.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyStreamImapRequestLineReader.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapRequestLineReader.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPMDCContext.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapLineHandlerAdapter.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ReactiveThrottler.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/NettyImapSession.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineBasedFrameDecoderFactory.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/AbstractNettyImapRequestLineReader.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerFactory.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/SwitchableLineBasedFrameDecoder.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/HAProxyMessageHandler.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/IMAPServerMBean.java AL server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslJKSNotFound.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPEM.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthAllowed.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSSLCompress.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslDefaultJKS.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthEnabledWithoutRequireSSL.xml !????? server/protocols/protocols-imap4/src/test/resources/oauth.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsTrueAndStartSSLIsFalse.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthDisabled.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMBadPass.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerProxy.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSSL.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMNoPass.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerCompress.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerImapConnectCheck.xml B server/protocols/protocols-imap4/src/test/resources/keystore.p12 !????? server/protocols/protocols-imap4/src/test/resources/private.nopass.key !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12MissingPassword.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServer.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslJKSBadPassword.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMExtraPass.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerNoLimits.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslNoKeys.xml B server/protocols/protocols-imap4/src/test/resources/keystore !????? server/protocols/protocols-imap4/src/test/resources/imapSSL.xml !????? server/protocols/protocols-imap4/src/test/resources/private.key !????? server/protocols/protocols-imap4/src/test/resources/imapServerHealthCheck.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerIdCommandResponseFields.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsFalseAndStartSSLIsTrue.xml B server/protocols/protocols-imap4/src/test/resources/keystore.jks !????? server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsTrueAndStartSSLIsTrue.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthDisallowed.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerStartTLS.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslJKS.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMMissingPass.xml !????? server/protocols/protocols-imap4/src/test/resources/certs.csr !????? server/protocols/protocols-imap4/src/test/resources/certs.self-signed.csr !????? server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsFalseAndStartSSLIsFalse.xml !????? server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12WrongPassword.xml AL server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/ReactiveThrottlerTest.java AL server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerTest.java AL server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPHealthCheckTest.java AL server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IpConnectionCheck.java AL server/protocols/protocols-imap4/src/test/java/org/apache/james/imapserver/netty/IMAPServerConfigurationTest.java AL server/protocols/protocols-imap4/src/reporting-site/site.xml AL server/protocols/protocols-imap4/pom.xml AL server/protocols/fetchmail/src/main/resources/META-INF/spring/fetchmail-context.xml AL server/protocols/fetchmail/src/main/resources/fetchmail.xml AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ParsedConfiguration.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchMail.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchSchedulerMBean.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/DynamicAccount.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/Account.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ProcessorAbstract.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FetchScheduler.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/FolderProcessor.java AL server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/StoreProcessor.java AL server/protocols/fetchmail/src/test/java/org/apache/james/fetchmail/FetchMailTest.java AL server/protocols/fetchmail/src/reporting-site/site.xml AL server/protocols/fetchmail/pom.xml AL server/protocols/protocols-smtp-dkim/src/main/java/org/apache/james/smtpserver/DKIMHook.java AL server/protocols/protocols-smtp-dkim/src/test/java/org/apache/james/smtpserver/DKIMHookTest.java AL server/protocols/protocols-smtp-dkim/pom.xml !????? server/Overview.md !????? server/mailet/rate-limiter-redis/redis.properties !????? server/mailet/rate-limiter-redis/docker-compose-sample/redis.properties !????? server/mailet/rate-limiter-redis/docker-compose-sample/docker-compose-with-redis-sentinel.yml !????? server/mailet/rate-limiter-redis/docker-compose-sample/README.md !????? server/mailet/rate-limiter-redis/docker-compose-sample/config-template/replica/redis.conf.template !????? server/mailet/rate-limiter-redis/docker-compose-sample/config-template/replica/docker-entrypoint-replica.sh !????? server/mailet/rate-limiter-redis/docker-compose-sample/config-template/sentinel/docker-entrypoint-sentinel.sh !????? server/mailet/rate-limiter-redis/docker-compose-sample/config-template/sentinel/sentinel.conf.template !????? server/mailet/rate-limiter-redis/docker-compose-sample/config-template/master/redis.conf.template !????? server/mailet/rate-limiter-redis/docker-compose-sample/config-template/master/docker-entrypoint-master.sh !????? server/mailet/rate-limiter-redis/extensions.properties AL server/mailet/rate-limiter-redis/mailetcontainer.xml !????? server/mailet/rate-limiter-redis/docker-compose.yml !????? server/mailet/rate-limiter-redis/README.adoc AL server/mailet/rate-limiter-redis/src/main/scala/org/apache/james/rate/limiter/redis/RedisRateLimiter.scala AL server/mailet/rate-limiter-redis/src/main/java/org/apache/james/rate/limiter/redis/RedisMasterReplicaRateLimiterFactory.java B server/mailet/rate-limiter-redis/src/test/resources/keystore.p12 AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/RedisRateLimiterWithTLSSentinelTest.java AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/TopologyRedisRateLimiterTest.scala AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/RedisRateLimiterTest.scala AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/RedisRateLimiterWithSentinelTest.scala AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/RedisRateLimiterWithTLSTest.scala AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/RedisRateLimiterWithTLSMasterReplicaTopologyTest.java AL server/mailet/rate-limiter-redis/src/test/java/org/apache/james/rate/limiter/RedisRateLimiterWithMasterReplicaTopologyTest.scala AL server/mailet/rate-limiter-redis/pom.xml !????? server/mailet/rate-limiter-redis/healthcheck.properties AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/MockPublicKeyRecordRetriever.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/DKIMSign.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/DKIMVerify.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/CRLFOutputStream.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/DKIMVerifier.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/MimeMessageHeaders.java AL server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/HeaderSkippingOutputStream.java B server/mailet/dkim/src/test/resources/test-dkim-pkcs8.pem B server/mailet/dkim/src/test/resources/test-dkim-pkcs1.pem AL server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/DKIMVerifyTest.java AL server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/DKIMSignTest.java AL server/mailet/dkim/pom.xml AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/smtp/priority/SmtpMtPriorityRelayTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/smtp/tls/SmtpRequireTlsRelayTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/smtp/dsn/DSNRemoteIntegrationTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/smtp/dsn/DSNRelayTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/smtp/dsn/DSNLocalIntegrationTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryForwardIntegrationTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryDKIMIntegrationTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryOnSuccessTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryErrorTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/mailets/RemoteDeliveryErrorHandlingTest.java AL server/mailet/remote-delivery-integration-testing/src/test/java/org/apache/james/SubAddressingRelayTest.java AL server/mailet/remote-delivery-integration-testing/pom.xml AL server/mailet/integration-testing/src/main/resources/dnsservice.xml B server/mailet/integration-testing/src/main/resources/trusted_cert_keystore AL server/mailet/integration-testing/src/main/resources/lmtpserver.xml !????? server/mailet/integration-testing/src/main/resources/eml/message-multipart-8bit.eml !????? server/mailet/integration-testing/src/main/resources/eml/mail_with_no_signature.eml !????? server/mailet/integration-testing/src/main/resources/eml/crypted.eml !????? server/mailet/integration-testing/src/main/resources/eml/mail_with_bad_signature.eml !????? server/mailet/integration-testing/src/main/resources/eml/non_smime_mail.eml !????? server/mailet/integration-testing/src/main/resources/eml/message-multipart-7bit.eml !????? server/mailet/integration-testing/src/main/resources/eml/dlp_read_mail_with_attachment.eml !????? server/mailet/integration-testing/src/main/resources/eml/message-text-only-8bit.eml !????? server/mailet/integration-testing/src/main/resources/eml/crypted_with_attachment.eml !????? server/mailet/integration-testing/src/main/resources/eml/message-text-only-7bit.eml !????? server/mailet/integration-testing/src/main/resources/eml/calendar.eml !????? server/mailet/integration-testing/src/main/resources/eml/bad_crypted.eml !????? server/mailet/integration-testing/src/main/resources/eml/yahooInvitation.eml !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/instruction.md !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.srl !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail_with_signature.eml !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.private.key !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail_with_signature_and_content_type_xpkcs7mime.eml !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/private.key !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.crt !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/request.csr !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail-with-signature-and-multi-certs.eml !????? server/mailet/integration-testing/src/main/resources/smime-test-resource-set/certificate.crt AL server/mailet/integration-testing/src/main/resources/imapserver.xml AL server/mailet/integration-testing/src/main/resources/managesieveserver.xml AL server/mailet/integration-testing/src/main/resources/domainlist.xml AL server/mailet/integration-testing/src/main/resources/mailrepositorystore.xml AL server/mailet/integration-testing/src/main/resources/usersrepository.xml AL server/mailet/integration-testing/src/main/resources/recipientrewritetable.xml B server/mailet/integration-testing/src/main/resources/keystore B server/mailet/integration-testing/src/main/resources/trusted_certificate.pem B server/mailet/integration-testing/src/main/resources/smime.p12 AL server/mailet/integration-testing/src/main/resources/smtpserver.xml AL server/mailet/integration-testing/src/main/resources/pop3server.xml AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/SerializableAsXml.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/SmtpConfiguration.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/MailetConfiguration.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/ProcessorConfiguration.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/CommonProcessors.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/Constants.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/configuration/MailetContainer.java AL server/mailet/integration-testing/src/main/java/org/apache/james/mailets/TemporaryJamesServer.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpContentTypeTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpSizeLimitationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpNullSenderTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/StaticInputChecker.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/SMTPHeloHooksTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/hooks/DeclinedHeloHook.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/hooks/OkHeloHook.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/hooks/DenyHeloHook.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/hooks/RecordingHeloHook.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/extensions/hooks/DenySoftHeloHook.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpRandomStoringTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpIdentityVerificationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpMaxRcptHandlerTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpBracketEnforcementTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/NoopMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/NoClassDefFoundErrorMatcher.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ErrorMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/OneRuntimeErrorMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ErrorMatcher.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/OneRuntimeExceptionMatcher.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/PerSenderRateLimitIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RequeueThrottlingIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/NoClassDefFoundErrorMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttachmentTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToSenderDomainRepositoryIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/OneRuntimeExceptionMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ExtractAttributeStub.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/MailReprocessingIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DomainMappingTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AliasMappingTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RuntimeExceptionMatcher.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RuntimeErrorMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GlobalRateLimitIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/amqp/AmqpExtension.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/RuntimeExceptionMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttributeIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/OneThreadSuicideMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingRelayTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/PerRecipientRateLimitMailetIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DKIMIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/CountingExecutionMailetBis.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/FirstRecipientCountingExecutions.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/CountingExecutionMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/CollectMailAttributeMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/ShutDownIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/CollectingExecutionMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/NoneWithNull.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/CountingExecutionTerminatingMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/None.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/CollectingExecutionMailetBis.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/AddRecipient.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/PauseThenCountingExecutionMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/ClearRecipientsMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/ExecutionFlowTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/flow/EnsureNotDisposed.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/WithStorageDirectiveIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SieveDelivery.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/MailetConfigurationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/SmtpConfigurationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SPFIntegrationTests.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardLoopIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/AddDeliveredToHeaderTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SubAddressingTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SenderIsLocalIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/RecipientRewriteTableIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SizeGreaterThanIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MissingProcessorTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/ForwardBounceLoopIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DirectResolutionRemoteDeliveryIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MailetErrorsTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DKIMHookIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/BounceIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NoSuchMethodErrorMailet.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/FilterForwardIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithPemFileIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMESignIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithKeyStoreFileIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMEDecryptIntegrationTest.java AL server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureIntegrationTest.java AL server/mailet/integration-testing/pom.xml AL server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/CacheSettings.java AL server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/HasLDAPAttribute.java AL server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/AttributeUtils.java AL server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/SenderIsInLDAPGroup.java AL server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/SenderHasLDAPAttribute.java AL server/mailet/ldap/src/main/java/org/apache/james/transport/matchers/IsInLDAPGroup.java !????? server/mailet/ldap/src/test/resources/ldif-files/populate.ldif AL server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/SenderHasLDAPAttributeTest.java AL server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/CacheSettingsTest.java AL server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/IsInLDAPGroupTest.java AL server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/SenderIsInLDAPGroupTest.java AL server/mailet/ldap/src/test/java/org/apache/james/transport/matchers/HasLDAPAttributeTest.java AL server/mailet/ldap/pom.xml !????? server/mailet/ldap/README.md !????? server/mailet/rate-limiter/extensions.properties AL server/mailet/rate-limiter/mailetcontainer.xml !????? server/mailet/rate-limiter/docker-compose.yml !????? server/mailet/rate-limiter/README.adoc AL server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/EntityType.scala AL server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/GlobalRateLimit.scala AL server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/PerRecipientRateLimit.scala AL server/mailet/rate-limiter/src/main/scala/org/apache/james/transport/mailets/PerSenderRateLimit.scala AL server/mailet/rate-limiter/src/main/scala/org/apache/james/rate/limiter/memory/MemoryRateLimiter.scala AL server/mailet/rate-limiter/src/main/scala/org/apache/james/rate/limiter/api/RateLimiter.scala AL server/mailet/rate-limiter/src/test/scala/org/apache/james/transport/mailets/GlobalRateLimitTest.scala AL server/mailet/rate-limiter/src/test/scala/org/apache/james/transport/mailets/PerSenderRateLimitTest.scala AL server/mailet/rate-limiter/src/test/scala/org/apache/james/transport/mailets/PerRecipientRateLimitTest.scala AL server/mailet/rate-limiter/src/test/scala/org/apache/james/rate/limiter/memory/MemoryRateLimiterTest.scala AL server/mailet/rate-limiter/src/test/scala/org/apache/james/rate/limiter/api/RateLimiterContract.scala AL server/mailet/rate-limiter/pom.xml AL server/mailet/mailets/src/main/scala/org/apache/james/transport/mailets/XOriginatingIpInNetwork.scala AL server/mailet/mailets/src/main/resources/sieveConfig.xml !????? server/mailet/mailets/src/main/resources/managesieve.help.txt AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/MimeMessageBodyGenerator.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/SenderUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/RecipientsUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/SizeUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/SpecialAddressesUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/Patterns.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/MailAddressUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/ReplyToUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/util/TosUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCode.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/package.html AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsSenderInRRTLoop.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/DSNSuccessRequested.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentError.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsOverQuota.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsInDropList.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteAddrInNetwork.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/DSNFailureRequested.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractNetworkMatcher.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpRulesLoader.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/Dlp.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/DSNDelayRequested.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/InSpammerBlacklist.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/SenderInFakeDomain.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsMarkedAsSpam.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/RemoteAddrNotInNetwork.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/IsRemoteDeliveryTemporaryError.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/transcode/MessageToCoreToMessage.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/RedirectNotify.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/AddressExtractor.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MessageAlteringUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddress.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetInitParameters.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/InitParameters.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessage.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/LoadedOnceInitParameters.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/RedirectMailetInitParameters.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/ProcessRedirectNotify.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/TypeCode.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/SpecialAddressKind.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/MailModifier.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/redirect/InitParametersSerializer.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionDispatcher.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/MailAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/FileIntoAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/DiscardAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionContext.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RedirectAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ActionUtils.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SievePoster.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutor.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/delivery/SieveFailureMessageComposer.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/Poster.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/SieveMailAdapter.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/VacationReply.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/KeepAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/RejectAction.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Bounce.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SPF.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/MailToAllUsers.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/package.html AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DeconnectionRight.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToPlainText.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SplitMail.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/LocalDelivery.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToRepository.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Redirect.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DnsHelper.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MessageComposer.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Bouncer.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Delay.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/ExecutionResult.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProvider.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/EnhancedMessagingException.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRunnable.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Repeat.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DelaysAndMaxRetry.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRetriesHelper.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/InternetAddressConverter.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfiguration.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrer.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/AddressesArrayToMailAddressListConverter.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Sieve.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifySender.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithStorageDirective.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Forward.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToSenderFolder.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImpl.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/SimpleMailStore.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailDispatcher.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailStore.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/MetricsMailet.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/VacationMailet.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Resend.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/FromRepository.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SubAddressing.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/DSNBounce.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/Requeue.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToSenderDomainRepository.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/NotifyPostmaster.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTable.java AL server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/VacationReply.java AL server/mailet/mailets/src/test/scala/org/apache/james/transport/mailets/XOriginatingIpInNetworkSpec.scala !????? server/mailet/mailets/src/test/resources/noReplyTo.eml !????? server/mailet/mailets/src/test/resources/brokenReplyTo.eml !????? server/mailet/mailets/src/test/resources/spamMail.eml !????? server/mailet/mailets/src/test/resources/eml/gmail.eml AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/envelopeFromOtherSender.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/headerEncodedFolded.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllResend-From.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllFrom.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/discard.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/true.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/vacationDaysReason.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/allofAllTrue.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/stop.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/vacationMime.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/vacationSubjectFromReason.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressDomain.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/redirect.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/reject.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/keep.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyRawInvalid.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyTextMatch.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyContentMatch.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressLocalPart.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/envelopeFrom.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllSender.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/exists.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/false.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllBcc.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllCc.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllResend-To.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyTextInvalid.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/envelopeTo.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/anyofOneFalse.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/addressAllTo.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/sizeOver.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyContentInvalid.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/notFalse.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/allofOneFalse.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/envelopeToOtherReceiver.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/vacationReasonAndFileInto.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/header.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyContentWrongContentType.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/allofAllFalse.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/doubleVacation.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/vacationDaysAddressesReason.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/notTrue.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/anyofAllFalse.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/bodyRawMatch.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/sizeUnder.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/vacationReason.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/fileinto.script AL server/mailet/mailets/src/test/resources/org/apache/james/transport/mailets/delivery/anyofAllTrue.script AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/TosUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/SenderUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/SizeUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/RecipientsUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/MailAddressUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/MimeMessageBodyGeneratorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/ReplyToUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/util/SpecialAddressesUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/InSpammerBlacklistTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteAddrNotInNetworkTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/DSNDelayRequestedTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsMarkedAsSpamTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/DSNFailureRequestedTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteAddrInNetworkTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/DSNSuccessRequestedTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsInDropListTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/dlp/DlpTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/dlp/DlpDomainRulesTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/RemoteDeliveryFailedWithSMTPCodeTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsRemoteDeliveryPermanentErrorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsSenderInRRTLoopTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsRemoteDeliveryTemporaryErrorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ForwardTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/LoadedOnceInitParametersTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/AddressExtractorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/NotifyMailetsMessageTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/RedirectMailetInitParametersTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/MessageAlteringUtilsTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/MailModifierTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/SpecialAddressTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/redirect/NotifyMailetInitParametersTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/jsieve/delivery/SieveExecutorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/jsieve/DiscardActionTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/NotifyPostmasterTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DeconnectionRightTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/VacationReplyTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/MetricsMailetTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/DelaysAndMaxRetryTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/InternetAddressConverterTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RepeatTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRetryHelperTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/DeliveryRunnableTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/DelayTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/BouncerTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/AddressesArrayToMailAddressListConverterTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProviderTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/WithPriorityTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RequeueTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResendTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/VacationMailetTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToSenderDomainRepositoryTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RedirectTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/NotifySenderTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SPFTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderImplTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SimpleMailStoreTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SubAddressingTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToPlainTextTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/MailToAllUsersTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/WithStorageDirectiveTest.java AL server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SplitMailTest.java AL server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/HelloWorldMailet.java AL server/mailet/mailets/src/test/java/org/apache/james/samples/mailets/InstrumentationMailet.java AL server/mailet/mailets/src/reporting-site/site.xml AL server/mailet/mailets/pom.xml AL server/mailet/mailetcontainer-impl/src/main/resources/META-INF/spring/mailetcontainer-context.xml AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/MatcherConfigImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/ProcessorUtil.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/CompositeProcessorImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/MatcherMailetPair.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/MatcherSplitter.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/LocalResourcesImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/jmx/JMXStateMailetProcessorListener.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/jmx/JMXStateCompositeProcessorListener.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/jmx/MailProcessorManagement.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/jmx/MatcherManagement.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/jmx/MailetManagement.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailSpooler.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/matchers/Not.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/matchers/CompositeMatcher.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/matchers/Or.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/matchers/And.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/matchers/Xor.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/matchers/GenericCompositeMatcher.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/MailetConfigImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/MailetProcessorImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/impl/ProcessorImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImpl.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/lib/AbstractStateCompositeProcessor.java AL server/mailet/mailetcontainer-impl/src/main/java/org/apache/james/mailetcontainer/lib/AbstractStateMailetProcessor.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/MailetProcessorImplTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/matchers/XorTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/matchers/InvertMatcherWithCompositeMatcherTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/matchers/NotTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/matchers/OrTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/matchers/AndTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/MailetConfigImplTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/CompositeProcessorImplTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextContract.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/AutomaticallySentMailDetectorImplTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/lib/AbstractStateMailetProcessorTest.java AL server/mailet/mailetcontainer-impl/src/test/java/org/apache/james/mailetcontainer/lib/AbstractStateCompositeProcessorTest.java AL server/mailet/mailetcontainer-impl/src/reporting-site/site.xml AL server/mailet/mailetcontainer-impl/pom.xml AL server/mailet/mailetcontainer-api/src/main/resources/mailetcontainer.xml AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/MailProcessor.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/jmx/MailetManagementMBean.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/jmx/MailProcessorManagementMBean.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/jmx/MailSpoolerMBean.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/jmx/MatcherManagementMBean.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/MailetLoader.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/MatcherLoader.java AL server/mailet/mailetcontainer-api/src/main/java/org/apache/james/mailetcontainer/api/LocalResources.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/ExceptionThrowingMatcher.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/MockMatcherLoader.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/MockMatcher.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/ExceptionThrowingMailet.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/MockMailProcessor.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/MockMailet.java AL server/mailet/mailetcontainer-api/src/test/java/org/apache/james/mailetcontainer/api/mock/MockMailetLoader.java AL server/mailet/mailetcontainer-api/src/reporting-site/site.xml AL server/mailet/mailetcontainer-api/pom.xml !????? server/mailet/mock-smtp-server/README.adoc !????? server/mailet/mock-smtp-server/src/main/jib/logback.xml AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/ExtendedEhloCommand.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/HTTPConfigurationServer.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/ExtendedRcptToCommand.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/ExtendedMailFromCommand.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockMessageHandler.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/MockSMTPBehavior.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/MockSmtpBehaviors.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Response.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Mails.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/SMTPCommand.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/SMTPExtensions.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Condition.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Mail.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/Operator.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/SMTPExtension.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/model/MockSMTPBehaviorInformation.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockSMTPServerMain.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/jackson/MailAddressSerializer.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/jackson/MailAddressModule.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/jackson/MailAddressDeserializer.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/MockSMTPServer.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/ReceivedMailRepository.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/ConfigurationClient.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/SMTPBehaviorRepository.java AL server/mailet/mock-smtp-server/src/main/java/org/apache/james/mock/smtp/server/testing/MockSmtpServerExtension.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/MockSMTPServerTest.java !????? server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ConfigurationClientTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/SMTPBehaviorRepositoryTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/HTTPConfigurationServerTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/ResponseTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MailsTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MockSMTPBehaviorTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/OperatorTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MockSmtpBehaviorsTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/ConditionTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/model/MockSMTPBehaviorInformationTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ReceivedMailRepositoryTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/jackson/MailAddressModuleTest.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/Fixture.java AL server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/SMTPCommandTest.java AL server/mailet/mock-smtp-server/pom.xml AL server/container/spring/src/main/resources/META-INF/spring/loaders-context.xml AL server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-authenticator.xml AL server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-authorizator.xml AL server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml N server/container/spring/src/main/resources/META-INF/org/apache/james/README AL server/container/spring/src/main/appended-resources/supplemental-models.xml AL server/container/spring/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurableBeanPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationProvider.java AL server/container/spring/src/main/java/org/apache/james/container/spring/lifecycle/AbstractLifecycleBeanPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/lifecycle/ConfigurationProviderImpl.java AL server/container/spring/src/main/java/org/apache/james/container/spring/resource/JamesResourceLoader.java AL server/container/spring/src/main/java/org/apache/james/container/spring/resource/SpringUserEntityValidator.java AL server/container/spring/src/main/java/org/apache/james/container/spring/resource/DefaultJamesResourceLoader.java AL server/container/spring/src/main/java/org/apache/james/container/spring/rmi/RmiRegistryFactoryBean.java AL server/container/spring/src/main/java/org/apache/james/container/spring/filesystem/FileSystemImpl.java AL server/container/spring/src/main/java/org/apache/james/container/spring/filesystem/ResourceLoaderFileSystem.java AL server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java AL server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/SpringResolver.java AL server/container/spring/src/main/java/org/apache/james/container/spring/context/web/JamesServerWebApplicationContext.java AL server/container/spring/src/main/java/org/apache/james/container/spring/context/JamesServerApplicationContext.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/protocols/ProtocolHandlerLoaderBeanFactory.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailrepositorystore/MailRepositoryStoreBeanFactory.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/AbstractBeanFactory.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailetcontainer/MailetLoaderBeanFactory.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailetcontainer/AbstractLoaderBeanFactory.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailetcontainer/MatcherLoaderBeanFactory.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/IndexerConfigurationBeanFactoryPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/FileSystemBeanFactoryPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/QuotaBeanFactoryPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/ConfigurationBeanFactoryPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/factorypostprocessor/MailboxConfigurationBeanFactoryPostProcessor.java AL server/container/spring/src/main/java/org/apache/james/container/spring/bean/AbstractBeanFactory.java AL server/container/spring/src/test/java/org/apache/james/container/spring/filesystem/FileSystemImplTest.java AL server/container/spring/src/reporting-site/site.xml AL server/container/spring/pom.xml AL server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/JamesDirectoriesProvider.java AL server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/FileSystem.java !????? server/container/filesystem-api/src/test/resources/classpathTest.txt !????? server/container/filesystem-api/src/test/resources/class path Test.txt AL server/container/filesystem-api/src/test/java/org/apache/james/filesystem/api/AbstractFileSystemTest.java AL server/container/filesystem-api/src/test/java/org/apache/james/filesystem/api/FileSystemFixture.java AL server/container/filesystem-api/src/test/java/org/apache/james/filesystem/api/mock/MockFileSystem.java AL server/container/filesystem-api/src/reporting-site/site.xml AL server/container/filesystem-api/pom.xml AL server/container/util/src/main/java/org/apache/james/util/io/InputStreamConsummer.java AL server/container/util/src/main/java/org/apache/james/util/io/ZeroedInputStream.java AL server/container/util/src/main/java/org/apache/james/util/io/CountDownConsumeInputStream.java AL server/container/util/src/main/java/org/apache/james/util/io/CurrentPositionInputStream.java AL server/container/util/src/main/java/org/apache/james/util/io/InputStreamUtils.java AL server/container/util/src/main/java/org/apache/james/util/io/BodyOffsetInputStream.java AL server/container/util/src/main/java/org/apache/james/util/FunctionalUtils.java AL server/container/util/src/main/java/org/apache/james/util/RestrictingRMISocketFactory.java AL server/container/util/src/main/java/org/apache/james/util/MDCStructuredLogger.java AL server/container/util/src/main/java/org/apache/james/util/reactor/Constants.java AL server/container/util/src/main/java/org/apache/james/util/ValuePatch.java AL server/container/util/src/main/java/org/apache/james/util/ClassLoaderUtils.java AL server/container/util/src/main/java/org/apache/james/util/GuavaUtils.java AL server/container/util/src/main/java/org/apache/james/util/DurationParser.java AL server/container/util/src/main/java/org/apache/james/util/UnitParser.java AL server/container/util/src/main/java/org/apache/james/util/Runnables.java AL server/container/util/src/main/java/org/apache/james/util/streams/Offset.java AL server/container/util/src/main/java/org/apache/james/util/streams/Iterables.java AL server/container/util/src/main/java/org/apache/james/util/streams/Iterators.java AL server/container/util/src/main/java/org/apache/james/util/streams/Limit.java AL server/container/util/src/main/java/org/apache/james/util/LoggingLevel.java AL server/container/util/src/main/java/org/apache/james/util/IteratorWrapper.java AL server/container/util/src/main/java/org/apache/james/util/StructuredLogger.java AL server/container/util/src/main/java/org/apache/james/util/AuditTrail.java AL server/container/util/src/main/java/org/apache/james/util/Size.java AL server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java AL server/container/util/src/main/java/org/apache/james/util/MemoizedSupplier.java AL server/container/util/src/main/java/org/apache/james/util/ReactorUtils.java AL server/container/util/src/main/java/org/apache/james/util/html/HtmlTextExtractor.java AL server/container/util/src/main/java/org/apache/james/util/StreamUtils.java AL server/container/util/src/main/java/org/apache/james/util/DataChunker.java AL server/container/util/src/main/java/org/apache/james/util/date/ZonedDateTimeProvider.java AL server/container/util/src/main/java/org/apache/james/util/date/DefaultZonedDateTimeProvider.java AL server/container/util/src/main/java/org/apache/james/util/date/ImapDateTimeFormatter.java AL server/container/util/src/main/java/org/apache/james/util/MimeMessageUtil.java AL server/container/util/src/main/java/org/apache/james/util/SizeFormat.java AL server/container/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledScheduledThreadPoolExecutor.java AL server/container/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledScheduledThreadPoolExecutorMBean.java AL server/container/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java AL server/container/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java AL server/container/util/src/main/java/org/apache/james/util/OptionalUtils.java AL server/container/util/src/main/java/org/apache/james/util/MDCBuilder.java AL server/container/util/src/main/java/org/apache/james/util/sql/JDBCUtil.java AL server/container/util/src/main/java/org/apache/james/util/sql/SqlResources.java AL server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java AL server/container/util/src/test/java/org/apache/james/util/AuditTrailTest.java AL server/container/util/src/test/java/org/apache/james/util/DataChunkerTest.java AL server/container/util/src/test/java/org/apache/james/util/io/CurrentPositionInputStreamTest.java AL server/container/util/src/test/java/org/apache/james/util/ReactorUtilsTest.java AL server/container/util/src/test/java/org/apache/james/util/BodyOffsetInputStreamTest.java AL server/container/util/src/test/java/org/apache/james/util/DurationParserTest.java AL server/container/util/src/test/java/org/apache/james/util/RunnablesTest.java AL server/container/util/src/test/java/org/apache/james/util/FunctionalUtilsTest.java AL server/container/util/src/test/java/org/apache/james/util/IteratorWrapperTest.java AL server/container/util/src/test/java/org/apache/james/util/OptionalUtilsTest.java AL server/container/util/src/test/java/org/apache/james/util/streams/OffsetTest.java AL server/container/util/src/test/java/org/apache/james/util/streams/IteratorsTest.java AL server/container/util/src/test/java/org/apache/james/util/streams/ImmutableCollectorsTest.java AL server/container/util/src/test/java/org/apache/james/util/streams/LimitTest.java AL server/container/util/src/test/java/org/apache/james/util/MemoizedSupplierTest.java AL server/container/util/src/test/java/org/apache/james/util/CommutativityCheckerTest.java AL server/container/util/src/test/java/org/apache/james/util/StreamUtilsTest.java AL server/container/util/src/test/java/org/apache/james/util/InputStreamUtilsTest.java AL server/container/util/src/test/java/org/apache/james/util/SizeTest.java AL server/container/util/src/test/java/org/apache/james/util/mime/MessageContentExtractorTest.java AL server/container/util/src/test/java/org/apache/james/util/MDCBuilderTest.java AL server/container/util/src/test/java/org/apache/james/util/date/ImapDateTimeFormatterTest.java AL server/container/util/src/test/java/org/apache/james/util/LoggingLevelTest.java AL server/container/util/src/test/java/org/apache/james/util/CommutativityChecker.java AL server/container/util/src/test/java/org/apache/james/util/SizeFormatTest.java AL server/container/util/src/test/java/org/apache/james/util/GuavaUtilsTest.java AL server/container/util/src/test/java/org/apache/james/util/concurrency/ConcurrentTestRunnerTest.java AL server/container/util/src/test/java/org/apache/james/util/ValuePatchTest.java AL server/container/util/src/reporting-site/site.xml AL server/container/util/pom.xml AL server/container/feature-checks/src/main/java/org/apache/james/healthcheck/MailReceptionCheck.java AL server/container/feature-checks/pom.xml AL server/container/core/src/main/resources/jmx.properties AL server/container/core/src/main/java/org/apache/james/server/core/package.html AL server/container/core/src/main/java/org/apache/james/server/core/ContentTypeCleaner.java AL server/container/core/src/main/java/org/apache/james/server/core/MimeMessageSource.java AL server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java AL server/container/core/src/main/java/org/apache/james/server/core/configuration/ConfigurationProvider.java AL server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java AL server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStream.java AL server/container/core/src/main/java/org/apache/james/server/core/MailImpl.java AL server/container/core/src/main/java/org/apache/james/server/core/MissingArgumentException.java AL server/container/core/src/main/java/org/apache/james/server/core/MailHeaders.java AL server/container/core/src/main/java/org/apache/james/server/core/JamesServerResourceLoader.java AL server/container/core/src/main/java/org/apache/james/server/core/InternetHeadersInputStream.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/FileSystemResource.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/UrlResource.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/Resource.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/ResourceUtils.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/ResourceFactory.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/FileSystemImpl.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/ClassPathResource.java AL server/container/core/src/main/java/org/apache/james/server/core/filesystem/SimpleUrl.java AL server/container/core/src/main/java/org/apache/james/server/core/MimeMessageInputStreamSource.java AL server/container/core/src/main/java/org/apache/james/server/core/MimeMessageUtil.java AL server/container/core/src/main/java/org/apache/james/server/core/Envelope.java AL server/container/core/src/main/java/org/apache/james/server/core/MimeMessageWrapper.java AL server/container/core/src/main/java/org/apache/james/server/core/BufferedDeferredFileOutputStream.java !????? server/container/core/src/test/resources/JAMES-1593.eml !????? server/container/core/src/test/resources/invalid.eml !????? server/container/core/src/test/resources/mail-containing-unicode-characters.eml AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageFromStreamTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MailHeadersTest.java AL server/container/core/src/test/java/org/apache/james/server/core/ContentTypeCleanerTest.java AL server/container/core/src/test/java/org/apache/james/server/core/BufferedDeferredFileOutputStreamTest.java AL server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MailImplTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageInputStreamSourceTest.java AL server/container/core/src/test/java/org/apache/james/server/core/filesystem/FileSystemImplTest.java AL server/container/core/src/test/java/org/apache/james/server/core/filesystem/SimpleUrlTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageWrapperTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageFromSharedStreamTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageUtilTest.java AL server/container/core/src/test/java/org/apache/james/server/core/EnvelopeTest.java AL server/container/core/src/test/java/org/apache/james/server/core/MimeMessageFromMimeMessageTest.java AL server/container/core/src/reporting-site/site.xml AL server/container/core/pom.xml AL server/container/mailbox-adapter/src/main/resources/mailbox.xml AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizator.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/UsersRepositoryUsernameSupplier.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/QuotaUsernameChangeTaskStep.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/ACLUsernameChangeTaskStep.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/UserRepositoryAuthenticator.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxUserDeletionTaskStep.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/UserRepositoryAuthorizator.java AL server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/MailboxUsernameChangeTaskStep.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/QuotaUsernameChangeTaskStepTest.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/UserRepositoryAuthenticatorTest.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/DelegationStoreAuthorizatorTest.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxUsernameChangeTaskStepTest.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/UserRepositoryAuthorizatorTest.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxUserDeletionTaskStepTest.java AL server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/ACLUsernameChangeTaskStepTest.java AL server/container/mailbox-adapter/src/reporting-site/site.xml AL server/container/mailbox-adapter/pom.xml AL server/container/guice/distributed/src/main/java/org/apache/james/modules/event/JMAPEventBusModule.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/event/MailboxEventBusModule.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreCacheModulesChooser.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/mailbox/DistributedDeletedMessageVaultModule.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/mailbox/DeletedMessageVaultWorkQueueReconnectionHandler.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/mailbox/DistributedDeletedMessageVaultDeletionCallback.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/DistributedTaskSerializationModule.java AL server/container/guice/distributed/src/main/java/org/apache/james/modules/plugins/QuotaMailingModule.java AL server/container/guice/distributed/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java AL server/container/guice/distributed/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java AL server/container/guice/distributed/src/test/java/org/apache/james/modules/blobstore/BlobStoreCacheModulesChooserTest.java AL server/container/guice/distributed/pom.xml AL server/container/guice/data-cassandra/src/main/java/org/apache/james/modules/data/CassandraRecipientRewriteTableModule.java AL server/container/guice/data-cassandra/src/main/java/org/apache/james/modules/data/CassandraUsersRepositoryModule.java AL server/container/guice/data-cassandra/src/main/java/org/apache/james/modules/data/CassandraDomainListModule.java AL server/container/guice/data-cassandra/src/main/java/org/apache/james/modules/data/CassandraDelegationStoreModule.java AL server/container/guice/data-cassandra/pom.xml AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPADomainListModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPADataModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAEntityManagerModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPADropListsModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAAuthorizatorModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAUsersRepositoryModule.java AL server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPARecipientRewriteTableModule.java AL server/container/guice/jpa-common/src/test/java/org/apache/james/TestJPAConfigurationModule.java AL server/container/guice/jpa-common/src/test/java/org/apache/james/TestJPAConfigurationModuleWithSqlValidation.java AL server/container/guice/jpa-common/pom.xml AL server/container/guice/opensearch/src/main/java/org/apache/james/SearchModuleChooser.java AL server/container/guice/opensearch/src/main/java/org/apache/james/SearchConfiguration.java AL server/container/guice/opensearch/src/main/java/org/apache/james/OpenSearchHighlightModule.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/OpenSearchDisabledModule.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/OpenSearchQuotaSearcherModule.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/OpenSearchStartUpCheck.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/OpenSearchClientModule.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/OpenSearchMailboxConfigurationModule.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/TikaConfigurationReader.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/TikaMailboxModule.java AL server/container/guice/opensearch/src/main/java/org/apache/james/modules/mailbox/OpenSearchMailboxModule.java AL server/container/guice/opensearch/src/test/java/org/apache/james/TikaExtension.java AL server/container/guice/opensearch/src/test/java/org/apache/james/DockerOpenSearchExtension.java AL server/container/guice/opensearch/src/test/java/org/apache/james/modules/TestTikaModule.java AL server/container/guice/opensearch/src/test/java/org/apache/james/modules/mailbox/SearchOverrideA.java AL server/container/guice/opensearch/src/test/java/org/apache/james/modules/mailbox/TestDockerOpenSearchModule.java AL server/container/guice/opensearch/src/test/java/org/apache/james/modules/mailbox/SearchOverrideB.java AL server/container/guice/opensearch/src/test/java/org/apache/james/modules/mailbox/TikaConfigurationReaderTest.java AL server/container/guice/opensearch/src/test/java/org/apache/james/modules/mailbox/OpenSearchMailboxModuleTest.java AL server/container/guice/opensearch/src/test/java/org/apache/james/SearchConfigurationTest.java AL server/container/guice/opensearch/src/test/java/org/apache/james/DockerOpenSearchRule.java AL server/container/guice/opensearch/pom.xml AL server/container/guice/memory/src/main/java/org/apache/james/FakeMessageSearchIndex.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/eventstore/MemoryEventStoreModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaSearchModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryUsersRepositoryModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataJmapModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDelegationStoreModule.java AL server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDropListsModule.java AL server/container/guice/memory/src/main/java/org/apache/james/FakeSearchMailboxModule.java AL server/container/guice/memory/pom.xml !????? server/container/guice/memory/README.md AL server/container/guice/queue/memory/src/main/java/org/apache/james/modules/queue/memory/MemoryMailQueueModule.java AL server/container/guice/queue/memory/pom.xml AL server/container/guice/queue/rabbitmq/src/main/java/org/apache/james/modules/queue/rabbitmq/RabbitMQMailQueueModule.java AL server/container/guice/queue/rabbitmq/src/main/java/org/apache/james/modules/queue/rabbitmq/SpoolerReconnectionHandler.java AL server/container/guice/queue/rabbitmq/src/main/java/org/apache/james/modules/queue/rabbitmq/RabbitMQModule.java AL server/container/guice/queue/rabbitmq/src/main/java/org/apache/james/modules/queue/rabbitmq/FakeMailQueueViewModule.java AL server/container/guice/queue/rabbitmq/src/main/java/org/apache/james/modules/queue/rabbitmq/MailQueueViewChoice.java AL server/container/guice/queue/rabbitmq/src/main/java/org/apache/james/modules/queue/rabbitmq/CassandraMailQueueViewModule.java AL server/container/guice/queue/rabbitmq/src/test/java/org/apache/james/modules/DockerRabbitMQRule.java AL server/container/guice/queue/rabbitmq/src/test/java/org/apache/james/modules/TestRabbitMQModule.java AL server/container/guice/queue/rabbitmq/src/test/java/org/apache/james/modules/RabbitMQExtension.java AL server/container/guice/queue/rabbitmq/pom.xml AL server/container/guice/queue/activemq/src/main/java/org/apache/james/modules/queue/activemq/ActiveMQQueueModule.java AL server/container/guice/queue/activemq/pom.xml AL server/container/guice/queue/pulsar/src/main/java/org/apache/james/queue/pulsar/module/PulsarQueueModule.java AL server/container/guice/queue/pulsar/src/main/java/org/apache/james/queue/pulsar/module/PulsarMailQueueViewModule.java AL server/container/guice/queue/pulsar/pom.xml AL server/container/guice/blob/s3/src/main/java/org/apache/james/modules/objectstorage/aws/s3/AwsS3ConfigurationReader.java AL server/container/guice/blob/s3/src/main/java/org/apache/james/modules/objectstorage/S3BlobStoreModule.java AL server/container/guice/blob/s3/src/main/java/org/apache/james/modules/objectstorage/S3BucketModule.java AL server/container/guice/blob/s3/src/main/java/org/apache/james/modules/objectstorage/S3BlobStoreConfigurationReader.java AL server/container/guice/blob/s3/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java AL server/container/guice/blob/s3/src/test/java/org/apache/james/modules/objectstorage/aws/s3/DockerAwsS3TestRule.java AL server/container/guice/blob/s3/src/test/java/org/apache/james/modules/objectstorage/aws/s3/AwsS3ConfigurationReaderTest.java AL server/container/guice/blob/s3/pom.xml AL server/container/guice/blob/memory/src/main/java/org/apache/james/modules/BlobMemoryModule.java AL server/container/guice/blob/memory/pom.xml AL server/container/guice/blob/export/src/main/java/org/apache/james/modules/BlobExportImplChoice.java AL server/container/guice/blob/export/src/main/java/org/apache/james/modules/BlobExportMechanismModule.java AL server/container/guice/blob/export/src/main/java/org/apache/james/modules/LocalFileBlobExportMechanismModule.java AL server/container/guice/blob/export/src/test/java/org/apache/james/modules/BlobExportMechanismModuleTest.java AL server/container/guice/blob/export/src/test/java/org/apache/james/modules/BlobExportImplChoiceTest.java AL server/container/guice/blob/export/pom.xml AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/StoragePolicyConfigurationSanityEnforcementModule.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/StorageStrategyModule.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/StorageStrategyAggregate.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/RegisterStorageStrategy.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/EventsourcingStorageStrategy.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/StorageStrategyChangedDTO.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/StorageStrategyChanged.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/RegisterStorageStrategyCommandHandler.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/BlobStoreConfigurationValidationStartUpCheck.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/validation/StorageStrategyValidationEventSourcingSystem.java AL server/container/guice/blob/deduplication-gc/src/main/java/org/apache/james/modules/blobstore/BlobDeduplicationGCModule.java AL server/container/guice/blob/deduplication-gc/src/test/java/org/apache/james/modules/blobstore/validation/StorageStrategyValidationEventSourcingSystemTest.java AL server/container/guice/blob/deduplication-gc/src/test/java/org/apache/james/modules/blobstore/validation/StorageStrategyChangedDTOTest.java AL server/container/guice/blob/deduplication-gc/pom.xml AL server/container/guice/blob/api/src/main/java/org/apache/james/modules/mailbox/BlobStoreAPIModule.java AL server/container/guice/blob/api/src/main/java/org/apache/james/modules/mailbox/ConfigurationComponent.java AL server/container/guice/blob/api/pom.xml AL server/container/guice/blob/postgres/src/main/java/modules/BlobPostgresModule.java AL server/container/guice/blob/postgres/pom.xml AL server/container/guice/data-ldap/src/main/java/org/apache/james/data/UsersRepositoryModuleChooser.java AL server/container/guice/data-ldap/src/main/java/org/apache/james/data/LdapUsersRepositoryModule.java AL server/container/guice/data-ldap/src/test/java/org/apache/james/data/DockerLdapRule.java AL server/container/guice/data-ldap/src/test/java/org/apache/james/data/LdapTestExtension.java AL server/container/guice/data-ldap/pom.xml AL server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAQuotaSearchModule.java AL server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JpaQuotaModule.java AL server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java AL server/container/guice/mailbox-jpa/pom.xml AL server/container/guice/sieve-jpa/src/main/java/org/apache/james/modules/data/SieveJPARepositoryModules.java AL server/container/guice/sieve-jpa/pom.xml AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/task/PostgresTaskExecutionDetailsProjectionGuiceModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/task/DistributedTaskManagerModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/events/PostgresDeadLetterModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresEventStoreModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresMailRepositoryModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDomainListModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresUsersRepositoryModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDropListsModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDelegationStoreModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataJmapModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDLPConfigurationStoreModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresRecipientRewriteTableModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresCommonModule.java AL server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresVacationModule.java AL server/container/guice/postgres-common/pom.xml AL server/container/guice/configuration/src/main/java/org/apache/james/utils/InitilizationOperationBuilder.java AL server/container/guice/configuration/src/main/java/org/apache/james/utils/UserDefinedStartable.java AL server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java AL server/container/guice/configuration/src/main/java/org/apache/james/utils/GuiceProbe.java AL server/container/guice/configuration/src/main/java/org/apache/james/utils/KeystoreCreator.java AL server/container/guice/configuration/src/main/java/org/apache/james/utils/InitializationOperation.java AL server/container/guice/configuration/src/main/java/org/apache/james/utils/DelegatedPropertiesConfiguration.java !????? server/container/guice/configuration/src/test/resources/b.properties !????? server/container/guice/configuration/src/test/resources/a.properties !????? server/container/guice/configuration/src/test/resources/env.properties AL server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java AL server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java AL server/container/guice/configuration/pom.xml AL server/container/guice/common/src/main/java/org/apache/james/PeriodicalHealthChecks.java AL server/container/guice/common/src/main/java/org/apache/james/NaiveDelegationStoreModule.java AL server/container/guice/common/src/main/java/org/apache/james/IsStartedProbe.java AL server/container/guice/common/src/main/java/org/apache/james/ConfigurationSanitizingPerformer.java AL server/container/guice/common/src/main/java/org/apache/james/modules/CommonServicesModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/StartUpChecksModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/RunArgumentsModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/ClockModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/MailetProcessingModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/StartablesModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/PeriodicalHealthChecksModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/protocols/ProtocolHandlerModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/ErrorMailRepositoryEmptyHealthCheckModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/DefaultProcessorsConfigurationProviderModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/DropWizardMetricsModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/TaskManagerModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/DNSServiceModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/HostnameModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/RawPostDequeueDecoratorModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/TaskSerializationModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/LoggingMetricsModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/CleanupTaskModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/MimeMessageModule.java AL server/container/guice/common/src/main/java/org/apache/james/modules/IsStartedProbeModule.java AL server/container/guice/common/src/main/java/org/apache/james/CoreDataModule.java AL server/container/guice/common/src/main/java/org/apache/james/TemporaryJamesServer.java AL server/container/guice/common/src/main/java/org/apache/james/GuiceLifecycleHealthCheck.java AL server/container/guice/common/src/main/java/org/apache/james/JamesServerMain.java AL server/container/guice/common/src/main/java/org/apache/james/ProtocolConfigurationSanitizer.java AL server/container/guice/common/src/main/java/org/apache/james/utils/InitializationOperations.java AL server/container/guice/common/src/main/java/org/apache/james/utils/MailboxManagerDefinition.java AL server/container/guice/common/src/main/java/org/apache/james/utils/Startables.java AL server/container/guice/common/src/main/java/org/apache/james/utils/DataProbeImpl.java AL server/container/guice/common/src/main/java/org/apache/james/utils/MailRepositoryProbeImpl.java AL server/container/guice/common/src/main/java/org/apache/james/utils/FilteringManagementProbeImpl.java AL server/container/guice/common/src/main/java/org/apache/james/utils/GuiceProbeProvider.java AL server/container/guice/common/src/main/java/org/apache/james/utils/GuiceProtocolHandlerLoader.java AL server/container/guice/common/src/main/java/org/apache/james/utils/DropListProbeImpl.java AL server/container/guice/common/src/main/java/org/apache/james/ExtraProperties.java AL server/container/guice/common/src/main/java/org/apache/james/StartUpChecksPerformer.java AL server/container/guice/common/src/main/java/org/apache/james/PeriodicalHealthChecksConfiguration.java AL server/container/guice/common/src/main/java/org/apache/james/GuiceJamesServer.java AL server/container/guice/common/src/main/java/org/apache/james/RunArguments.java AL server/container/guice/common/src/main/java/org/apache/james/CleanupTasksPerformer.java !????? server/container/guice/common/src/test/resources/eml/mail-containing-unicode-characters.eml AL server/container/guice/common/src/test/resources/test.xml !????? server/container/guice/common/src/test/resources/test.properties AL server/container/guice/common/src/test/java/org/apache/james/AggregateJunitExtension.java AL server/container/guice/common/src/test/java/org/apache/james/GuiceModuleTestExtension.java AL server/container/guice/common/src/test/java/org/apache/james/JamesServerContract.java AL server/container/guice/common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java AL server/container/guice/common/src/test/java/org/apache/james/PeriodicalHealthChecksConfigurationTest.java AL server/container/guice/common/src/test/java/org/apache/james/modules/InitializationOperationsTest.java AL server/container/guice/common/src/test/java/org/apache/james/GuiceModuleTestRule.java AL server/container/guice/common/src/test/java/org/apache/james/PeriodicalHealthChecksTest.java AL server/container/guice/common/src/test/java/org/apache/james/JamesServerBuilder.java AL server/container/guice/common/src/test/java/org/apache/james/TempFilesystemTestRule.java AL server/container/guice/common/src/test/java/org/apache/james/RegistrableExtension.java AL server/container/guice/common/src/test/java/org/apache/james/utils/FileConfigurationProviderTest.java AL server/container/guice/common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java AL server/container/guice/common/src/test/java/org/apache/james/utils/ConfigurablesTest.java AL server/container/guice/common/src/test/java/org/apache/james/utils/GuiceProbeProviderTest.java AL server/container/guice/common/src/test/java/org/apache/james/TemporaryFolderRegistrableExtension.java AL server/container/guice/common/src/test/java/org/apache/james/ClockExtension.java AL server/container/guice/common/src/test/java/org/apache/james/JamesServerExtension.java AL server/container/guice/common/src/test/java/org/apache/james/StartUpChecksPerformerTest.java AL server/container/guice/common/src/test/java/org/apache/james/FakePropertiesProvider.java AL server/container/guice/common/src/test/java/org/apache/james/AggregateGuiceModuleTestRule.java AL server/container/guice/common/pom.xml AL server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServer.java AL server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JMXServerModule.java AL server/container/guice/jmx/src/main/java/org/apache/james/modules/server/JmxConfiguration.java AL server/container/guice/jmx/src/main/java/org/apache/james/utils/GuiceMailboxManagerResolver.java AL server/container/guice/jmx/src/test/java/org/apache/james/modules/server/JmxConfigurationTest.java AL server/container/guice/jmx/pom.xml AL server/container/guice/sieve-postgres/src/main/java/org/apache/james/modules/data/SievePostgresRepositoryModules.java AL server/container/guice/sieve-postgres/pom.xml AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/LifeCycleStageModule.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/NoOpStageableTypeMapper.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/AbstractMethodTypeListener.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/StageHandler.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/NoOpStageHandler.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/StageableMethod.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/Stageable.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/AbstractStageable.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/AbstractBasicStageable.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/PreDestroyModule.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/LifeCycleModule.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/DefaultStager.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/DisposingStager.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/StageableTypeMapper.java AL server/container/guice/onami/src/main/java/org/apache/james/onami/lifecycle/Stager.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/TestAnnotationB.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/TestAnnotationA.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/DefaultStagerTestCase.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/StageObject2.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/StageObject1.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/StagingOrderTestCase.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/MultiLifeCycleObject.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/TestAnnotationC.java AL server/container/guice/onami/src/test/java/org/apache/james/onami/lifecycle/MultiLifeCycleTestCase.java AL server/container/guice/onami/pom.xml AL server/container/guice/sieve-file/src/main/java/org/apache/james/modules/data/SieveFileRepositoryModule.java AL server/container/guice/sieve-file/pom.xml AL server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/RLSSupportPostgresMailboxModule.java AL server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresQuotaModule.java AL server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresDeletedMessageVaultModule.java AL server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresMailboxModule.java AL server/container/guice/mailbox-postgres/pom.xml AL server/container/guice/pom.xml AL server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SMTPServerModule.java AL server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/SmtpGuiceProbe.java AL server/container/guice/protocols/smtp/src/main/java/org/apache/james/modules/protocols/JSPFModule.java AL server/container/guice/protocols/smtp/pom.xml AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/WebAdminServer.java AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/TaskRoutesModule.java AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/HealthCheckRoutesModule.java AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/NoJwtModule.java AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/ServerRouteModule.java AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/modules/server/WebAdminServerModule.java AL server/container/guice/protocols/webadmin/src/main/java/org/apache/james/utils/WebAdminGuiceProbe.java !????? server/container/guice/protocols/webadmin/src/test/resources/webadmin-two.properties !????? server/container/guice/protocols/webadmin/src/test/resources/webadmin-one.properties !????? server/container/guice/protocols/webadmin/src/test/resources/webadmin-empty.properties !????? server/container/guice/protocols/webadmin/src/test/resources/webadmin-none.properties AL server/container/guice/protocols/webadmin/src/test/java/org/apache/james/modules/server/WebAdminServerModuleTest.java AL server/container/guice/protocols/webadmin/pom.xml AL server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/UserIdentityModule.java AL server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTasksModule.java AL server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapTaskSerializationModule.java AL server/container/guice/protocols/webadmin-jmap/src/main/java/org/apache/james/modules/server/JmapUploadCleanupModule.java AL server/container/guice/protocols/webadmin-jmap/pom.xml AL server/container/guice/protocols/lmtp/src/main/java/org/apache/james/modules/protocols/LMTPServerModule.java AL server/container/guice/protocols/lmtp/src/main/java/org/apache/james/modules/protocols/LmtpGuiceProbe.java AL server/container/guice/protocols/lmtp/pom.xml AL server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoriesRoutesModule.java AL server/container/guice/protocols/webadmin-mailrepository/src/main/java/org/apache/james/modules/server/MailRepositoryTaskSerializationModule.java AL server/container/guice/protocols/webadmin-mailrepository/pom.xml AL server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueTaskSerializationModule.java AL server/container/guice/protocols/webadmin-mailqueue/src/main/java/org/apache/james/modules/server/MailQueueRoutesModule.java AL server/container/guice/protocols/webadmin-mailqueue/pom.xml AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesBackupModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxExportTaskSerializationModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/ReIndexingModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesExportRoutesModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/InconsistencyQuotasSolvingRoutesModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MessagesRoutesModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebadminMailboxTaskSerializationModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxesRoutesModule.java AL server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/WebAdminReIndexingTaskSerializationModule.java AL server/container/guice/protocols/webadmin-mailbox/pom.xml AL server/container/guice/protocols/netty/pom.xml AL server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/VacationRoutesModule.java AL server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DLPRoutesModule.java AL server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DataRoutesModules.java AL server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/SieveRoutesModule.java AL server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/server/DropListsRoutesModule.java AL server/container/guice/protocols/webadmin-data/src/main/java/org/apache/james/modules/blobstore/server/BlobRoutesModules.java AL server/container/guice/protocols/webadmin-data/pom.xml AL server/container/guice/protocols/pop/src/main/java/org/apache/james/modules/protocols/Pop3GuiceProbe.java AL server/container/guice/protocols/pop/src/main/java/org/apache/james/modules/protocols/POP3ServerModule.java AL server/container/guice/protocols/pop/pom.xml AL server/container/guice/protocols/jmap/src/main/resources/defaultJmapMailetContainer.xml AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/MessageIdProbe.java AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPModule.java AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/rfc8621/RFC8621MethodsModule.java AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JmapGuiceProbe.java AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPListenerModule.java AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/modules/protocols/JmapEventBusModule.java AL server/container/guice/protocols/jmap/src/main/java/org/apache/james/modules/protocols/JMAPServerModule.java AL server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/JmapJamesServerContract.java AL server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPModuleTest.java AL server/container/guice/protocols/jmap/src/test/java/org/apache/james/jmap/MailetPreconditionTest.java AL server/container/guice/protocols/jmap/src/test/java/org/apache/james/modules/TestJMAPServerModule.java AL server/container/guice/protocols/jmap/pom.xml AL server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ConnectionCheckFactoryImpl.java AL server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ImapPackage.java AL server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/IMAPServerModule.java AL server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/ImapGuiceProbe.java AL server/container/guice/protocols/imap/src/main/java/org/apache/james/modules/protocols/DefaultImapPackage.java AL server/container/guice/protocols/imap/pom.xml AL server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/ManageSieveServerModule.java AL server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java AL server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveModule.java AL server/container/guice/protocols/managedsieve/pom.xml AL server/container/guice/protocols/webadmin-rabbitmq-mailqueue/src/main/java/org/apache/james/modules/server/RabbitMailQueueTaskSerializationModule.java AL server/container/guice/protocols/webadmin-rabbitmq-mailqueue/src/main/java/org/apache/james/modules/server/RabbitMailQueueRoutesModule.java AL server/container/guice/protocols/webadmin-rabbitmq-mailqueue/src/main/java/org/apache/james/modules/server/BrowseStartTaskModule.java AL server/container/guice/protocols/webadmin-rabbitmq-mailqueue/pom.xml AL server/container/guice/protocols/webadmin-mail-over-web/src/main/java/org/apache/james/modules/server/WebAdminMailOverWebModule.java AL server/container/guice/protocols/webadmin-mail-over-web/pom.xml AL server/container/guice/mailet/src/main/java/org/apache/james/modules/server/DKIMMailetModule.java AL server/container/guice/mailet/src/main/java/org/apache/james/modules/server/MailetContainerModule.java AL server/container/guice/mailet/src/main/java/org/apache/james/utils/MailetConfigurationOverride.java AL server/container/guice/mailet/src/main/java/org/apache/james/utils/GuiceMatcherLoader.java AL server/container/guice/mailet/src/main/java/org/apache/james/utils/GuiceMailetLoader.java AL server/container/guice/mailet/src/main/java/org/apache/james/utils/SpoolerProbe.java A server/container/guice/mailet/src/test/resources/recursive/extensions-jars/custom-mailets-implementation-3.9.0-SNAPSHOT.jar A server/container/guice/mailet/src/test/resources/recursive/extensions-jars/james-server-guice-custom-mailets-3.9.0-SNAPSHOT-jar-with-dependencies.jar AL server/container/guice/mailet/src/test/java/org/apache/james/transport/matchers/sub/TestMatcher.java AL server/container/guice/mailet/src/test/java/org/apache/james/transport/mailets/sub/TestMailet.java AL server/container/guice/mailet/src/test/java/org/apache/james/modules/server/MailetContainerModuleTest.java AL server/container/guice/mailet/src/test/java/org/apache/james/utils/GuiceMatcherLoaderTest.java AL server/container/guice/mailet/src/test/java/org/apache/james/utils/GuiceMailetLoaderTest.java AL server/container/guice/mailet/pom.xml AL server/container/guice/mailrepository-blob/src/main/java/org/apache/james/modules/mailrepository/BlobstoreMailRepositoryModule.java AL server/container/guice/mailrepository-blob/pom.xml AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/Names.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/ConfigurationProbe.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/EventDeadLettersProbe.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoader.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/FastRetryBackoffModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenerFactory.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookConfiguration.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImpl.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenerConfiguration.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ListenersConfiguration.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MailReceptionHealthCheckModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookLoaderImpl.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHooksConfiguration.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookLoader.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/ReIndexingTaskSerializationModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultEventModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/PreDeletionHookModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/MemoryDeadLetterModule.java AL server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/PreDeletionHookConfigurationTest.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ListenerConfigurationTest.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopPreDeletionHook.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/NoopMailboxListener.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ConfiguredListener.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/PreDeletionHookLoaderImplTest.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/ReactiveNoopMailboxListener.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/MailboxListenersLoaderImplTest.java AL server/container/guice/mailbox/src/test/java/org/apache/james/modules/mailbox/PreDeletionHooksConfigurationTest.java AL server/container/guice/mailbox/pom.xml AL server/container/guice/utils/src/main/java/org/apache/james/utils/ExtensionModule.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/UserStartables.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/ExtensionConfiguration.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/FullyQualifiedClassName.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/NamingScheme.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/ExtendedClassLoader.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/ClassName.java AL server/container/guice/utils/src/main/java/org/apache/james/utils/PackageName.java !????? server/container/guice/utils/src/test/resources/extensions-empty.properties !????? server/container/guice/utils/src/test/resources/extensions-two.properties !????? server/container/guice/utils/src/test/resources/extensions-none.properties !????? server/container/guice/utils/src/test/resources/extensions-one.properties AL server/container/guice/utils/src/test/java/org/apache/james/utils/NamingSchemeTest.java AL server/container/guice/utils/src/test/java/org/apache/james/utils/ExtensionConfigurationTest.java AL server/container/guice/utils/src/test/java/org/apache/james/utils/ClassNameTest.java AL server/container/guice/utils/src/test/java/org/apache/james/utils/PackageNameTest.java AL server/container/guice/utils/src/test/java/org/apache/james/utils/FullyQualifiedClassNameTest.java AL server/container/guice/utils/pom.xml AL server/container/guice/mailbox-plugin-deleted-messages-vault/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultModule.java AL server/container/guice/mailbox-plugin-deleted-messages-vault/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultConfigurationModule.java AL server/container/guice/mailbox-plugin-deleted-messages-vault/src/main/java/org/apache/james/modules/vault/VaultTaskSerializationModule.java AL server/container/guice/mailbox-plugin-deleted-messages-vault/src/main/java/org/apache/james/modules/vault/DeletedMessageVaultRoutesModule.java AL server/container/guice/mailbox-plugin-deleted-messages-vault/src/test/java/org/apache/james/modules/vault/TestDeleteMessageVaultPreDeletionHookModule.java AL server/container/guice/mailbox-plugin-deleted-messages-vault/pom.xml AL server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/GuiceMailRepositoryLoader.java AL server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/MultiBoundGuiceRepositoryLoader.java AL server/container/guice/mailrepository-loaders/pom.xml AL server/container/guice/mailrepository-cassandra/src/main/java/org/apache/james/modules/mailrepository/CassandraMailRepositoryModule.java AL server/container/guice/mailrepository-cassandra/pom.xml AL server/container/guice/lucene/src/main/java/org/apache/james/modules/mailbox/LuceneMemorySearchMailboxModule.java AL server/container/guice/lucene/src/main/java/org/apache/james/modules/mailbox/LuceneSearchMailboxModule.java AL server/container/guice/lucene/pom.xml AL server/container/guice/testing/dependency/src/main/java/org/apache/james/dependency/MyDependency.java AL server/container/guice/testing/dependency/pom.xml AL server/container/guice/testing/custom-mailets/src/main/java/com/custom/matchers/AnotherMatcher.java AL server/container/guice/testing/custom-mailets/src/main/java/com/custom/mailets/AnotherMailet.java AL server/container/guice/testing/custom-mailets/src/main/java/org/apache/james/transport/matchers/CustomMatcher.java AL server/container/guice/testing/custom-mailets/src/main/java/org/apache/james/transport/mailets/CustomMailet.java AL server/container/guice/testing/custom-mailets/src/main/java/org/apache/james/transport/mailets/CustomMailetWithCustomDependencyInConstructor.java AL server/container/guice/testing/custom-mailets/src/main/java/org/apache/james/transport/mailets/MyGenericMailet.java AL server/container/guice/testing/custom-mailets/src/main/java/org/apache/james/transport/mailets/MyInterface.java AL server/container/guice/testing/custom-mailets/src/main/java/org/apache/james/transport/mailets/CustomMailetWithCustomDependencyInService.java AL server/container/guice/testing/custom-mailets/pom.xml !????? server/container/guice/testing/custom-mailets/README.md AL server/container/guice/testing/pom.xml AL server/container/guice/testing/custom-mailets-implementation/src/main/java/org/apache/james/transport/mailets/MyInterfaceImplementation.java AL server/container/guice/testing/custom-mailets-implementation/src/main/java/org/apache/james/transport/mailets/MyExtensionModule.java AL server/container/guice/testing/custom-mailets-implementation/pom.xml AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/metrics/CassandraMetricsModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/InconsistencySolvingRoutesModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/TasksCleanupRoutesModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/CassandraRoutesModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/CassandraConsistencyTaskSerializationModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/eventstore/CassandraEventStoreModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/TasksCleanupTaskSerializationModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraDeadLetterModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/DefaultBucketModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheck.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaMailingModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraThreadIdGuessingModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/KeyspacesConfiguration.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraDeletedMessageVaultModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraSieveQuotaModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraVacationModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraDropListsModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraDLPConfigurationStoreModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraSieveQuotaLegacyModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraSieveRepositoryModule.java AL server/container/guice/cassandra/src/main/java/org/apache/james/server/CassandraProbe.java AL server/container/guice/cassandra/src/main/java/org/apache/james/server/CassandraTruncateTableTask.java !????? server/container/guice/cassandra/src/test/resources/modules/mailbox/cassandra.properties AL server/container/guice/cassandra/src/test/java/org/apache/james/modules/mailbox/KeyspacesConfigurationTest.java AL server/container/guice/cassandra/pom.xml AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerResolver.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxCopierManagement.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagementMBean.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxCopierManagementMBean.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/ReIndexerManagementMBean.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagementMBean.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerResolverException.java AL server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/ReIndexerManagement.java !????? server/container/mailbox-jmx/src/test/resources/eml/frnog.eml AL server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java AL server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java AL server/container/mailbox-jmx/pom.xml AL server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Startable.java AL server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Configurable.java AL server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/LifecycleUtil.java AL server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/Disposable.java AL server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/ConfigurationSanitizer.java AL server/container/lifecycle-api/src/main/java/org/apache/james/lifecycle/api/StartUpCheck.java AL server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/StartUpCheckTest.java AL server/container/lifecycle-api/src/test/java/org/apache/james/lifecycle/api/LeakAwareTest.java AL server/container/lifecycle-api/src/reporting-site/site.xml AL server/container/lifecycle-api/pom.xml AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOV1.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveSpaceTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveActiveTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveQuotaTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/tables/CassandraSieveClusterQuotaTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/FakeSieveQuotaDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/ActiveScriptInfo.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/Script.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/migration/SieveQuotaMigration.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOV2.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/tables/CassandraDomainsTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainListModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraMappingsSourcesDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/tables/CassandraRecipientRewriteTableTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/tables/CassandraMappingsSourcesTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskDTO.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/CassandraRRTModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/CassandraVacationRepository.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/CassandraVacationModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/tables/CassandraNotificationTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/tables/CassandraVacationTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/CassandraNotificationRegistry.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/CassandraNotificationRegistryModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/CassandraVacationDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/vacation/cassandra/CassandraNotificationRegistryDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/dlp/eventsourcing/cassandra/DLPConfigurationModules.java AL server/data/data-cassandra/src/main/java/org/apache/james/dlp/eventsourcing/cassandra/DLPConfigurationItemsRemovedDTO.java AL server/data/data-cassandra/src/main/java/org/apache/james/dlp/eventsourcing/cassandra/DLPConfigurationItemAddedDTO.java AL server/data/data-cassandra/src/main/java/org/apache/james/dlp/eventsourcing/cassandra/DLPConfigurationItemDTO.java AL server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/tables/CassandraUserTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepositoryModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraRepositoryConfiguration.java AL server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraDelegationStore.java AL server/data/data-cassandra/src/main/java/org/apache/james/droplists/cassandra/tables/CassandraDropListTable.java AL server/data/data-cassandra/src/main/java/org/apache/james/droplists/cassandra/CassandraDropListModule.java AL server/data/data-cassandra/src/main/java/org/apache/james/droplists/cassandra/CassandraDropListDAO.java AL server/data/data-cassandra/src/main/java/org/apache/james/droplists/cassandra/CassandraDropList.java B server/data/data-cassandra/src/test/resources/json/dlp/eventsourcing/items_added_event_2.json B server/data/data-cassandra/src/test/resources/json/dlp/eventsourcing/items_removed_event_2.json B server/data/data-cassandra/src/test/resources/json/dlp/eventsourcing/items_removed_event_1.json B server/data/data-cassandra/src/test/resources/json/dlp/eventsourcing/configuration_item_1.json B server/data/data-cassandra/src/test/resources/json/dlp/eventsourcing/items_added_event_1.json AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveCurrentUploadUsageCalculatorTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveRepositoryTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOV1Test.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/ScriptTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOContract.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/migration/SieveQuotaMigrationTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOV2Test.java AL server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CassandraDomainListTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/domainlist/cassandra/CacheDomainListTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableDAOTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraMappingsSourcesDAOTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraStepdefs.java AL server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/RewriteTablesTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/vacation/cassandra/CassandraVacationRepositoryTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/vacation/cassandra/CassandraNotificationRegistryTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/dlp/eventsourcing/cassandra/CassandraEventSourcingDLPConfigurationStoreTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/dlp/eventsourcing/cassandra/DTOTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/dlp/eventsourcing/cassandra/CassandraEventSourcingDLPConfigurationStoreExtension.java AL server/data/data-cassandra/src/test/java/org/apache/james/user/cassandra/CassandraDelegationStoreTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/user/cassandra/CassandraUsersRepositoryTest.java AL server/data/data-cassandra/src/test/java/org/apache/james/droplists/cassandra/CassandraDropListTest.java AL server/data/data-cassandra/pom.xml AL server/data/data-library/src/main/resources/META-INF/spring/data-context.xml AL server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListManagement.java AL server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java AL server/data/data-library/src/main/java/org/apache/james/domainlist/lib/EnvDetector.java AL server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListConfiguration.java AL server/data/data-library/src/main/java/org/apache/james/UserEntityValidator.java AL server/data/data-library/src/main/java/org/apache/james/repository/file/AbstractFileRepository.java AL server/data/data-library/src/main/java/org/apache/james/repository/file/ClassLoaderObjectInputStream.java AL server/data/data-library/src/main/java/org/apache/james/repository/file/FilePersistentObjectRepository.java AL server/data/data-library/src/main/java/org/apache/james/repository/file/ExtensionFileFilter.java AL server/data/data-library/src/main/java/org/apache/james/repository/file/NumberedRepositoryFileFilter.java AL server/data/data-library/src/main/java/org/apache/james/repository/file/FilePersistentStreamRepository.java AL server/data/data-library/src/main/java/org/apache/james/repository/api/StreamRepository.java AL server/data/data-library/src/main/java/org/apache/james/repository/api/ObjectRepository.java AL server/data/data-library/src/main/java/org/apache/james/RecipientRewriteTableUserEntityValidator.java AL server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableUtil.java AL server/data/data-library/src/main/java/org/apache/james/rrt/lib/CanSendFromImpl.java AL server/data/data-library/src/main/java/org/apache/james/rrt/lib/AliasReverseResolverImpl.java AL server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableManagement.java AL server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java AL server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java AL server/data/data-library/src/main/java/org/apache/james/AggregateUserEntityValidator.java AL server/data/data-library/src/main/java/org/apache/james/droplist/lib/DropListManagement.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/events/ConfigurationItemsAdded.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/events/ConfigurationItemsRemoved.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/EventSourcingDLPConfigurationStore.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/commands/ClearCommandHandler.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/commands/StoreCommand.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/commands/StoreCommandHandler.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/commands/ClearCommand.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/aggregates/DLPAggregateId.java AL server/data/data-library/src/main/java/org/apache/james/dlp/eventsourcing/aggregates/DLPDomainConfiguration.java AL server/data/data-library/src/main/java/org/apache/james/DefaultVacationService.java AL server/data/data-library/src/main/java/org/apache/james/user/lib/UsersRepositoryManagement.java AL server/data/data-library/src/main/java/org/apache/james/user/lib/package.html AL server/data/data-library/src/main/java/org/apache/james/user/lib/model/Algorithm.java AL server/data/data-library/src/main/java/org/apache/james/user/lib/model/DefaultUser.java AL server/data/data-library/src/main/java/org/apache/james/user/lib/UsersRepositoryImpl.java AL server/data/data-library/src/main/java/org/apache/james/user/lib/UsersDAO.java AL server/data/data-library/src/main/java/org/apache/james/DefaultUserEntityValidator.java !????? server/data/data-library/src/test/resources/sieve/my_sieve !????? server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature AL server/data/data-library/src/test/java/org/apache/james/domainlist/api/mock/SimpleDomainList.java AL server/data/data-library/src/test/java/org/apache/james/domainlist/lib/DomainListContract.java AL server/data/data-library/src/test/java/org/apache/james/domainlist/lib/DomainListConfigurationTest.java AL server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java AL server/data/data-library/src/test/java/org/apache/james/rrt/lib/RecipientRewriteTableFixture.java AL server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java AL server/data/data-library/src/test/java/org/apache/james/rrt/lib/RecipientRewriteTableContract.java AL server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java AL server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryContract.java AL server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java AL server/data/data-library/src/test/java/org/apache/james/dlp/eventsourcing/events/ConfigurationItemsAddedTest.java AL server/data/data-library/src/test/java/org/apache/james/dlp/eventsourcing/events/ConfigurationItemsRemovedTest.java AL server/data/data-library/src/test/java/org/apache/james/dlp/eventsourcing/commands/StoreCommandTest.java AL server/data/data-library/src/test/java/org/apache/james/dlp/eventsourcing/commands/ClearCommandTest.java AL server/data/data-library/src/test/java/org/apache/james/dlp/eventsourcing/aggregates/DLPAggregateIdTest.java AL server/data/data-library/src/test/java/org/apache/james/user/lib/UsersRepositoryContract.java AL server/data/data-library/src/test/java/org/apache/james/user/lib/model/AlgorithmTest.java AL server/data/data-library/src/test/java/org/apache/james/user/lib/model/DefaultUserTest.java AL server/data/data-library/src/test/java/org/apache/james/DefaultVacationServiceTest.java AL server/data/data-library/src/reporting-site/site.xml AL server/data/data-library/pom.xml AL server/data/data-postgres/src/main/java/org/apache/james/sieve/postgres/PostgresSieveQuotaDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/sieve/postgres/PostgresSieveRepository.java AL server/data/data-postgres/src/main/java/org/apache/james/sieve/postgres/PostgresSieveModule.java AL server/data/data-postgres/src/main/java/org/apache/james/sieve/postgres/model/PostgresSieveScriptId.java AL server/data/data-postgres/src/main/java/org/apache/james/sieve/postgres/model/PostgresSieveScript.java AL server/data/data-postgres/src/main/java/org/apache/james/sieve/postgres/PostgresSieveScriptDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/domainlist/postgres/PostgresDomainList.java AL server/data/data-postgres/src/main/java/org/apache/james/domainlist/postgres/PostgresDomainModule.java AL server/data/data-postgres/src/main/java/org/apache/james/rrt/postgres/PostgresRecipientRewriteTableDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/rrt/postgres/PostgresRecipientRewriteTable.java AL server/data/data-postgres/src/main/java/org/apache/james/rrt/postgres/PostgresRecipientRewriteTableModule.java AL server/data/data-postgres/src/main/java/org/apache/james/vacation/postgres/PostgresNotificationRegistry.java AL server/data/data-postgres/src/main/java/org/apache/james/vacation/postgres/PostgresVacationRepository.java AL server/data/data-postgres/src/main/java/org/apache/james/vacation/postgres/PostgresVacationResponseDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/vacation/postgres/PostgresVacationModule.java AL server/data/data-postgres/src/main/java/org/apache/james/vacation/postgres/PostgresNotificationRegistryDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/user/postgres/PostgresDelegationStore.java AL server/data/data-postgres/src/main/java/org/apache/james/user/postgres/PostgresUsersRepositoryConfiguration.java AL server/data/data-postgres/src/main/java/org/apache/james/user/postgres/PostgresUserModule.java AL server/data/data-postgres/src/main/java/org/apache/james/user/postgres/PostgresUsersRepository.java AL server/data/data-postgres/src/main/java/org/apache/james/user/postgres/PostgresUsersDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/droplists/postgres/PostgresDropListModule.java AL server/data/data-postgres/src/main/java/org/apache/james/droplists/postgres/PostgresDropList.java AL server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryModule.java AL server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryContentDAO.java AL server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepository.java AL server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryFactory.java AL server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryBlobReferenceSource.java AL server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStore.java !????? server/data/data-postgres/src/test/resources/log4j.properties AL server/data/data-postgres/src/test/java/org/apache/james/sieve/postgres/PostgresSieveQuotaDAOTest.java AL server/data/data-postgres/src/test/java/org/apache/james/sieve/postgres/PostgresSieveRepositoryTest.java AL server/data/data-postgres/src/test/java/org/apache/james/domainlist/postgres/PostgresDomainListTest.java AL server/data/data-postgres/src/test/java/org/apache/james/rrt/postgres/PostgresStepdefs.java AL server/data/data-postgres/src/test/java/org/apache/james/rrt/postgres/PostgresRecipientRewriteTableTest.java AL server/data/data-postgres/src/test/java/org/apache/james/rrt/postgres/RewriteTablesTest.java AL server/data/data-postgres/src/test/java/org/apache/james/vacation/postgres/PostgresVacationRepositoryTest.java AL server/data/data-postgres/src/test/java/org/apache/james/vacation/postgres/PostgresNotificationRegistryTest.java AL server/data/data-postgres/src/test/java/org/apache/james/user/postgres/PostgresDelegationStoreTest.java AL server/data/data-postgres/src/test/java/org/apache/james/user/postgres/PostgresUsersRepositoryTest.java AL server/data/data-postgres/src/test/java/org/apache/james/droplists/postgres/PostgresDropListsTest.java AL server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryBlobReferenceSourceTest.java AL server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreExtension.java AL server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreTest.java AL server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryTest.java AL server/data/data-postgres/src/reporting-site/site.xml !????? server/data/data-postgres/pom.xml AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/LdapHealthCheck.java AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUser.java AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPGroupRestriction.java AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/LdapRepositoryConfiguration.java AL server/data/data-ldap/src/main/java/org/apache/james/user/ldap/LDAPConnectionFactory.java !????? server/data/data-ldap/src/test/resources/usersrepository-enableVirtualHosting.xml !????? server/data/data-ldap/src/test/resources/invalid/ldif-files/populate.ldif !????? server/data/data-ldap/src/test/resources/localpartLogin/ldif-files/populate.ldif !????? server/data/data-ldap/src/test/resources/ldif-files/populate.ldif !????? server/data/data-ldap/src/test/resources/usersrepository-supportsVirtualHosting.xml !????? server/data/data-ldap/src/test/resources/usersrepository-default.xml AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryWithLocalPartAsLoginNameTest.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/DockerLdapSingleton.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryWithLDAPFailoverTest.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryInvalidDnTest.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/LdapHealthCheckTest.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/LdapRepositoryConfigurationTest.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/LdapGenericContainer.java AL server/data/data-ldap/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryEmptyListTest.java AL server/data/data-ldap/src/reporting-site/site.xml AL server/data/data-ldap/pom.xml AL server/data/data-api/src/main/java/org/apache/james/domainlist/api/DomainList.java AL server/data/data-api/src/main/java/org/apache/james/domainlist/api/AutoDetectedDomainRemovalException.java AL server/data/data-api/src/main/java/org/apache/james/domainlist/api/DomainListException.java AL server/data/data-api/src/main/java/org/apache/james/domainlist/api/DomainListManagementMBean.java AL server/data/data-api/src/main/java/org/apache/james/rrt/ForwardUsernameChangeTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/rrt/RecipientRewriteTableUserDeletionTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/AliasReverseResolver.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/SourceDomainIsNotInDomainListException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTableManagementMBean.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTableConfiguration.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/MappingConflictException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/MappingAlreadyExistsException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/LoopDetectedException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/SameSourceAndDestinationException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTableException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/RecipientRewriteTable.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/CanSendFrom.java AL server/data/data-api/src/main/java/org/apache/james/rrt/api/InvalidRegexException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/SeparatorUtil.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/SkipMappingProcessingException.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mappings.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java AL server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/ScriptSummary.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveCurrentUploadUsageCalculator.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/IsActiveException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/StorageException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/QuotaExceededException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/SieveRepositoryException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/QuotaNotFoundException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/ScriptNotFoundException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/exception/DuplicateException.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/ScriptContent.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepositoryManagementMBean.java AL server/data/data-api/src/main/java/org/apache/james/sieverepository/api/ScriptName.java AL server/data/data-api/src/main/java/org/apache/james/probe/SieveProbe.java AL server/data/data-api/src/main/java/org/apache/james/probe/DropListProbe.java AL server/data/data-api/src/main/java/org/apache/james/probe/DataProbe.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/AccountId.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/VacationService.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/VacationPatch.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/VacationRepository.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/NotificationRegistry.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/VacationDeleteUserTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/Vacation.java AL server/data/data-api/src/main/java/org/apache/james/vacation/api/RecipientId.java AL server/data/data-api/src/main/java/org/apache/james/DisconnectorNotifier.java AL server/data/data-api/src/main/java/org/apache/james/dlp/api/DLPRules.java AL server/data/data-api/src/main/java/org/apache/james/dlp/api/DLPConfigurationStore.java AL server/data/data-api/src/main/java/org/apache/james/dlp/api/DLPConfigurationItem.java AL server/data/data-api/src/main/java/org/apache/james/dlp/api/DLPConfigurationLoader.java AL server/data/data-api/src/main/java/org/apache/james/user/api/DelegationUserDeletionTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepositoryManagementMBean.java AL server/data/data-api/src/main/java/org/apache/james/user/api/DelegationUsernameChangeTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/user/api/AlreadyExistInUsersRepositoryException.java AL server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java AL server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepositoryException.java AL server/data/data-api/src/main/java/org/apache/james/user/api/DeleteUserDataTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/user/api/UsernameChangeTaskStep.java AL server/data/data-api/src/main/java/org/apache/james/user/api/InvalidUsernameException.java AL server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java AL server/data/data-api/src/main/java/org/apache/james/user/api/DelegationStore.java AL server/data/data-api/src/main/java/org/apache/james/droplists/api/DropListEntry.java AL server/data/data-api/src/main/java/org/apache/james/droplists/api/DropList.java AL server/data/data-api/src/main/java/org/apache/james/droplists/api/DeniedEntityType.java AL server/data/data-api/src/main/java/org/apache/james/droplists/api/OwnerScope.java AL server/data/data-api/src/main/java/org/apache/james/droplists/api/DropListManagementMBean.java AL server/data/data-api/src/test/resources/sieverepository.xml AL server/data/data-api/src/test/resources/domainlist.xml AL server/data/data-api/src/test/resources/mailrepositorystore.xml AL server/data/data-api/src/test/resources/usersrepository.xml AL server/data/data-api/src/test/resources/recipientrewritetable.xml AL server/data/data-api/src/test/java/org/apache/james/rrt/api/RecipientRewriteTableConfigurationTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/SeparatorUtilTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingTest.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/AliasReverseResolverContract.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/CanSendFromContract.java AL server/data/data-api/src/test/java/org/apache/james/rrt/lib/RegexRewriterTest.java AL server/data/data-api/src/test/java/org/apache/james/sieverepository/api/SieveCurrentUploadUsageCalculatorContract.java AL server/data/data-api/src/test/java/org/apache/james/sieverepository/api/ScriptSummaryTest.java AL server/data/data-api/src/test/java/org/apache/james/sieverepository/api/ScriptNameTest.java AL server/data/data-api/src/test/java/org/apache/james/vacation/api/AccountIdTest.java AL server/data/data-api/src/test/java/org/apache/james/vacation/api/VacationPatchTest.java AL server/data/data-api/src/test/java/org/apache/james/vacation/api/NotificationRegistryContract.java AL server/data/data-api/src/test/java/org/apache/james/vacation/api/VacationTest.java AL server/data/data-api/src/test/java/org/apache/james/vacation/api/VacationRepositoryContract.java AL server/data/data-api/src/test/java/org/apache/james/dlp/api/DLPConfigurationItemTest.java AL server/data/data-api/src/test/java/org/apache/james/dlp/api/DLPConfigurationStoreContract.java AL server/data/data-api/src/test/java/org/apache/james/dlp/api/DLPFixture.java AL server/data/data-api/src/test/java/org/apache/james/user/api/DelegationStoreContract.java AL server/data/data-api/src/test/java/org/apache/james/droplists/api/DropListContract.java AL server/data/data-api/src/test/java/org/apache/james/droplists/api/DropListEntryTest.java AL server/data/data-api/src/reporting-site/site.xml AL server/data/data-api/pom.xml AL server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java AL server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java AL server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java AL server/data/data-memory/src/main/java/org/apache/james/vacation/memory/MemoryVacationRepository.java AL server/data/data-memory/src/main/java/org/apache/james/vacation/memory/MemoryNotificationRegistry.java AL server/data/data-memory/src/main/java/org/apache/james/user/memory/NaiveDelegationStore.java AL server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryDelegationStore.java AL server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java AL server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersDAO.java AL server/data/data-memory/src/main/java/org/apache/james/droplists/memory/MemoryDropList.java AL server/data/data-memory/src/test/resources/fakemailrepositorystore.xml AL server/data/data-memory/src/test/java/org/apache/james/domainlist/memory/MemoryDomainListTest.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTableTest.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/memory/RecipientRewriteTableUserDeletionTaskStepTest.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/memory/InMemoryStepdefs.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/memory/ForwardUsernameChangeTaskStepTest.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/memory/RewriteTablesTest.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/lib/AliasReverseResolverImplTest.java AL server/data/data-memory/src/test/java/org/apache/james/rrt/lib/CanSendFromImplTest.java AL server/data/data-memory/src/test/java/org/apache/james/vacation/memory/VacationDeleteUserTaskStepTest.java AL server/data/data-memory/src/test/java/org/apache/james/vacation/memory/MemoryNotificationRegistryTest.java AL server/data/data-memory/src/test/java/org/apache/james/vacation/memory/MemoryVacationRepositoryTest.java AL server/data/data-memory/src/test/java/org/apache/james/dlp/memory/EventSourcingDLPConfigurationStoreTest.java AL server/data/data-memory/src/test/java/org/apache/james/dlp/memory/InMemoryEventSourcingDLPConfigurationStoreExtension.java AL server/data/data-memory/src/test/java/org/apache/james/user/memory/MemoryUsersRepositoryTest.java AL server/data/data-memory/src/test/java/org/apache/james/user/memory/DelegationUsernameChangeTaskStepTest.java AL server/data/data-memory/src/test/java/org/apache/james/user/memory/MemoryDelegationStoreTest.java AL server/data/data-memory/src/test/java/org/apache/james/user/memory/UsersRepositoryManagementTest.java AL server/data/data-memory/src/test/java/org/apache/james/user/memory/DelegationUserDeletionTaskStepTest.java AL server/data/data-memory/src/test/java/org/apache/james/droplists/memory/MemoryDropListTest.java AL server/data/data-memory/pom.xml AL server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/model/JPASieveScript.java AL server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/model/JPASieveQuota.java AL server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java AL server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java AL server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/model/JPADomain.java AL server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java AL server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java AL server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersDAO.java AL server/data/data-jpa/src/main/java/org/apache/james/user/jpa/JPAUsersRepository.java AL server/data/data-jpa/src/main/java/org/apache/james/user/jpa/model/JPAUser.java AL server/data/data-jpa/src/main/java/org/apache/james/jpa/healthcheck/JPAHealthCheck.java AL server/data/data-jpa/src/main/java/org/apache/james/droplists/jpa/model/JPADropListEntry.java AL server/data/data-jpa/src/main/java/org/apache/james/droplists/jpa/JPADropList.java AL server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java AL server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/model/JPAMail.java AL server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/model/JPAUrl.java AL server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/MimeMessageJPASource.java AL server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryFactory.java AL server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepository.java !????? server/data/data-jpa/src/test/resources/log4j.properties AL server/data/data-jpa/src/test/resources/persistence.xml AL server/data/data-jpa/src/test/java/org/apache/james/sieve/jpa/JpaSieveRepositoryTest.java AL server/data/data-jpa/src/test/java/org/apache/james/domainlist/jpa/JPADomainListTest.java AL server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPAStepdefs.java AL server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/RewriteTablesTest.java AL server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPARecipientRewriteTableTest.java AL server/data/data-jpa/src/test/java/org/apache/james/user/jpa/model/JPAUserTest.java AL server/data/data-jpa/src/test/java/org/apache/james/user/jpa/JpaUsersRepositoryTest.java AL server/data/data-jpa/src/test/java/org/apache/james/jpa/healthcheck/JPAHealthCheckTest.java AL server/data/data-jpa/src/test/java/org/apache/james/droplists/jpa/JPADropListTest.java AL server/data/data-jpa/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreTest.java AL server/data/data-jpa/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreExtension.java AL server/data/data-jpa/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryTest.java AL server/data/data-jpa/src/reporting-site/site.xml AL server/data/data-jpa/pom.xml AL server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java AL server/data/data-file/src/main/java/org/apache/james/rrt/file/XMLRecipientRewriteTable.java AL server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java AL server/data/data-file/src/main/java/org/apache/james/mailrepository/file/Lock.java AL server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java AL server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MimeMessageStreamRepositorySource.java !????? server/data/data-file/src/test/resources/org/apache/james/mailrepository/testdata/Inbox AL server/data/data-file/src/test/java/org/apache/james/domainlist/xml/XMLDomainListTest.java AL server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLStepdefs.java AL server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java AL server/data/data-file/src/test/java/org/apache/james/rrt/file/RewriteTablesTest.java AL server/data/data-file/src/test/java/org/apache/james/sieverepository/file/SieveFileRepositoryTest.java AL server/data/data-file/src/test/java/org/apache/james/mailrepository/FileMailRepositoryTest.java AL server/data/data-file/src/reporting-site/site.xml AL server/data/data-file/pom.xml AL server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/utils/EmailAddressTupleUtil.scala AL server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityDAO.scala AL server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/tables/CassandraCustomIdentityTable.scala AL server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityModule.scala AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/tables/CassandraPushSubscriptionTable.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionDAO.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionRepository.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraEmailQueryViewTable.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/table/CassandraMessageFastViewProjectionTable.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjection.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionDeletionCallback.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryView.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadBucketName.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepository.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/CassandraUploadRepository.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/UploadDAO.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/CassandraFilteringProjectionModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/filtering/CassandraFilteringProjection.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeRepository.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraMailboxChangeTable.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/tables/CassandraEmailChangeTable.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeRepository.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/MailboxChangeRepositoryDAO.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/EmailChangeRepositoryDAO.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraChangesConfiguration.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeModule.java AL server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/change/CassandraStateFactory.java B server/data/data-jmap-cassandra/src/test/resources/json/event-v2.json B server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v2.json B server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json B server/data/data-jmap-cassandra/src/test/resources/json/increment-v3.json B server/data/data-jmap-cassandra/src/test/resources/json/event-v3.json B server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json B server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json B server/data/data-jmap-cassandra/src/test/resources/json/increment-v2.json B server/data/data-jmap-cassandra/src/test/resources/json/eventEmpty.json B server/data/data-jmap-cassandra/src/test/resources/json/event.json B server/data/data-jmap-cassandra/src/test/resources/json/eventComplex.json B server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v3.json B server/data/data-jmap-cassandra/src/test/resources/json/increment.json AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/pushsubscription/CassandraPushSubscriptionRepositoryTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraMessageFastViewProjectionTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/projections/CassandraEmailQueryViewTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadServiceTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadRepositoryTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/UploadBucketNameTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraJMAPCurrentUploadUsageCalculatorTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementNoProjectionTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/CassandraEventSourcingFilteringManagementTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraChangesConfigurationTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraMailboxChangeRepositoryTest.java AL server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeRepositoryTest.java AL server/data/data-jmap-cassandra/pom.xml AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/pushsubscription/PostgresPushSubscriptionDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/pushsubscription/PostgresPushSubscriptionModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/pushsubscription/PostgresPushSubscriptionRepository.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresMessageFastViewProjection.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryView.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManager.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresMessageFastViewProjectionModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresMessageFastViewProjectionDeletionCallback.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/upload/PostgresUploadUsageRepository.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/upload/PostgresUploadModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/upload/PostgresUploadRepository.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/upload/PostgresUploadDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/PostgresDataJMapAggregateModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/filtering/PostgresFilteringProjectionModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/filtering/PostgresFilteringProjectionDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/filtering/PostgresFilteringProjection.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/identity/PostgresCustomIdentityDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/identity/PostgresCustomIdentityModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresMailboxChangeDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresStateFactory.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresMailboxChangeModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresMailboxChangeRepository.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresEmailChangeDAO.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresEmailChangeModule.java AL server/data/data-jmap-postgres/src/main/java/org/apache/james/jmap/postgres/change/PostgresEmailChangeRepository.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/pushsubscription/PostgresPushSubscriptionRepositoryTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresMessageFastViewProjectionTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/projections/PostgresEmailQueryViewManagerRLSTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/upload/PostgresUploadUsageRepositoryTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/upload/PostgresUploadRepositoryTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/upload/PostgresUploadServiceTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/filtering/PostgresEventSourcingFilteringManagementTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/filtering/PostgresEventSourcingFilteringManagementNoProjectionTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/identity/PostgresCustomIdentityDAOTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/change/PostgresMailboxChangeRepositoryTest.java AL server/data/data-jmap-postgres/src/test/java/org/apache/james/jmap/postgres/change/PostgresEmailChangeRepositoryTest.java AL server/data/data-jmap-postgres/pom.xml AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/memory/identity/MemoryCustomIdentityDAO.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/Identity.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/PushSubscription.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/State.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/TypeName.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/EmailAddress.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/identity/IdentityUserDeletionTaskStep.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/identity/CustomIdentityDAO.scala AL server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/change/TypeStateFactory.scala AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionModule.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryView.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjection.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/upload/InMemoryUploadRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/upload/InMemoryUploadUsageRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/change/MemoryMailboxChangeRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/memory/change/MemoryEmailChangeRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/mime4j/SizeUtils.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/mime4j/AvoidBinaryBodyBufferingBodyFactory.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/mime4j/AvoidBinaryBodyReadingBodyFactory.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/mime4j/FakeBinaryBody.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/pushsubscription/PushSubscriptionRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/pushsubscription/PushSubscriptionHelpers.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/pushsubscription/PushDeleteUserDataTaskStep.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/pushsubscription/PushSubscriptionDisconnector.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryView.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/EmailQueryViewManager.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionHealthCheck.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/DefaultEmailQueryViewManager.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Upload.scala AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/UploadId.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/AccountId.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Size.scala AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/UploadService.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/UploadRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/JMAPCurrentUploadUsageCalculator.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/RecomputeJMAPUploadCurrentQuotasService.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/UploadUsageRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/UploadServiceDefaultImpl.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/upload/JmapUploadQuotaConfiguration.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregate.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommand.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/RuleSetDefined.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandHandler.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilterUsernameChangeTaskStep.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/IncrementalRuleChange.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FiltersDeleteUserDataTaskStep.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringRuleSetDefineDTOModules.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Version.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rules.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringRuleSetDefinedDTO.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringIncrementalRuleChangeDTO.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/exception/ChangeNotFoundException.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/exception/StateMismatchException.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/JmapChange.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChange.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/CanNotCalculateChangesException.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxAndEmailChange.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChange.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChanges.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChanges.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/EmailChangeRepository.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/State.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/Limit.java AL server/data/data-jmap/src/main/java/org/apache/james/jmap/api/change/MailboxChangeRepository.java AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/memory/identity/IdentityUserDeletionTaskStepTest.scala AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/memory/identity/MemoryCustomIdentityTest.scala AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/pushsubscription/PushDeleteUserDataTaskStepTest.scala AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/pushsubscription/PushSubscriptionRepositoryContract.scala AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/upload/UploadServiceContract.scala AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/identity/IdentityRepositoryTest.scala AL server/data/data-jmap/src/test/scala/org/apache/james/jmap/api/identity/CustomIdentityDAOContract.scala AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/pushsubscription/MemoryPushSubscriptionRepositoryTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/projections/MemoryMessageFastViewProjectionTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/projections/MemoryEmailQueryViewTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/upload/InMemoryUploadRepositoryTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/upload/InMemoryJMAPCurrentUploadUsageCalculatorTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/upload/InMemoryUploadServiceTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/upload/InMemoryUploadUsageRepositoryTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/change/MemoryEmailChangeRepositoryTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/change/MemoryMailboxChangeRepositoryTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/EmailQueryViewContract.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedPropertiesTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionContract.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionHealthCheckTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/model/PreviewTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/upload/JMAPCurrentUploadUsageCalculatorContract.scala !????? server/data/data-jmap/src/test/java/org/apache/james/jmap/api/upload/UploadUsageRepositoryContract.scala AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/upload/UploadRepositoryContract.scala AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/FiltersDeleteUserDataTaskStepTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/IncrementalRuleChangeTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/FilterUsernameChangeTaskStepTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/InMemoryEventSourcingFilteringManagementTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/VersionTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RulesTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/MailboxChangeRepositoryContract.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/MailboxChangeTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/StateTest.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java AL server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/LimitTest.java AL server/data/data-jmap/pom.xml AL server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryFactory.java AL server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStore.java AL server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java AL server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MailRepositoryStoreConfiguration.java AL server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepository.java AL server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/SimpleMailRepositoryLoader.java AL server/mailrepository/mailrepository-memory/src/test/resources/mailrepositorystore.xml AL server/mailrepository/mailrepository-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreTest.java AL server/mailrepository/mailrepository-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryTest.java AL server/mailrepository/mailrepository-memory/src/test/java/org/apache/james/mailrepository/memory/MailRepositoryStoreConfigurationTest.java AL server/mailrepository/mailrepository-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryEmptyErrorMailRepositoryHealthCheckTest.java AL server/mailrepository/mailrepository-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreExtension.java AL server/mailrepository/mailrepository-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStoreTest.java AL server/mailrepository/mailrepository-memory/pom.xml AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/Protocol.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepository.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/Initializable.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryLoader.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryStore.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailKey.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryPath.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/EmptyErrorMailRepositoryHealthCheck.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/package-info.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryFactory.java AL server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrl.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryUrlStoreContract.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/api/ProtocolTest.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryPathTest.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/api/MailKeyTest.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/api/EmptyErrorMailRepositoryHealthCheckContract.java AL server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlTest.java AL server/mailrepository/mailrepository-api/pom.xml AL server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/MailMetadata.scala AL server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepository.scala AL server/mailrepository/mailrepository-blob/src/main/scala/org/apache/james/mailrepository/blob/BlobMailRepositoryFactory.scala AL server/mailrepository/mailrepository-blob/src/test/java/org/apache/james/mailrepository/blob/MailRepositoryBlobIdFactoryTest.java AL server/mailrepository/mailrepository-blob/src/test/java/org/apache/james/mailrepository/blob/BlobMailRepositoryTest.java AL server/mailrepository/mailrepository-blob/pom.xml AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryModule.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/UrlsTable.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryFactory.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/MailRepositoryTableV2.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/MailRepositoryTable.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStore.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDaoV2.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlModule.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/MailRepositoryBlobReferenceSource.java AL server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/UrlsDao.java AL server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreTest.java AL server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryUrlStoreExtension.java AL server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java AL server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java AL server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java AL server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java AL server/mailrepository/mailrepository-cassandra/pom.xml AL server/testing/src/main/java/org/apache/james/util/docker/RateLimiters.java AL server/testing/src/main/java/org/apache/james/util/docker/DockerContainer.java AL server/testing/src/main/java/org/apache/james/util/docker/Images.java AL server/testing/src/main/java/org/apache/james/jmap/LocalHostURIBuilder.java AL server/testing/src/main/java/org/apache/james/jmap/JmapRFCCommonRequests.java AL server/testing/src/main/java/org/apache/james/jmap/JMAPTestingConstants.java AL server/testing/src/main/java/org/apache/james/utils/SMTPSendingException.java AL server/testing/src/main/java/org/apache/james/utils/SMTPMessageSenderExtension.java AL server/testing/src/main/java/org/apache/james/utils/TestIMAPClient.java AL server/testing/src/main/java/org/apache/james/utils/SmtpSendingStep.java AL server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java AL server/testing/src/main/java/org/apache/james/utils/AllMatching.java AL server/testing/src/main/java/org/apache/james/utils/FakeSmtp.java AL server/testing/src/main/java/org/apache/james/utils/UpdatableTickingClock.java AL server/testing/src/main/java/org/apache/james/utils/DiscreteDistribution.java AL server/testing/src/main/java/org/apache/james/junit/TemporaryFolderExtension.java AL server/testing/src/main/java/org/apache/james/junit/categories/BasicFeature.java AL server/testing/src/main/java/org/apache/james/junit/ExecutorExtension.java AL server/testing/src/test/java/org/apache/james/utils/SMTPMessageSenderTest.java AL server/testing/src/test/java/org/apache/james/utils/DiscreteDistributionTest.java AL server/testing/src/test/java/org/apache/james/utils/TestIMAPClientTest.java AL server/testing/pom.xml B server/grafana-reporting/prometheus-datasource/James_JMAP_CountBoard.json B server/grafana-reporting/prometheus-datasource/James_DNS_Dashboard.json B server/grafana-reporting/prometheus-datasource/James_webAdmin.json B server/grafana-reporting/prometheus-datasource/James_IMAP_CountBoard.json B server/grafana-reporting/prometheus-datasource/James_BlobStore.json B server/grafana-reporting/prometheus-datasource/James_MATCHER.json B server/grafana-reporting/prometheus-datasource/James_MAILET.json B server/grafana-reporting/prometheus-datasource/James_SMTP_CountBoard.json B server/grafana-reporting/prometheus-datasource/James_MailQueue.json !????? server/grafana-reporting/prometheus-datasource/README.md B server/grafana-reporting/prometheus-datasource/James_IMAP_Board.json B server/grafana-reporting/prometheus-datasource/James_JMAP_Board.json B server/grafana-reporting/prometheus-datasource/James_JVM.json B server/grafana-reporting/prometheus-datasource/James_SMTP_Board.json B server/grafana-reporting/es-datasource/IMAP_count_board-1488774815587-dashboard.json B server/grafana-reporting/es-datasource/JAMES_DNS_dashboard-1491268903944-dashboard.json B server/grafana-reporting/es-datasource/DeletedMessagesVault-1563771591074-dashboard.json B server/grafana-reporting/es-datasource/JMAP_board-1488774804236-dashboard.json B server/grafana-reporting/es-datasource/CacheBlobStore-15911761170000-dashboard.json B server/grafana-reporting/es-datasource/MATCHER-1490071813409-dashboard.json B server/grafana-reporting/es-datasource/SMTP_count_board-1488774761350-dashboard.json B server/grafana-reporting/es-datasource/SpamAssassin-1522226824255-dashboard.json B server/grafana-reporting/es-datasource/Cassandra_driver-1504068385404-dashboard.json B server/grafana-reporting/es-datasource/MailQueue-1490071879988-dashboard.json B server/grafana-reporting/es-datasource/Miscalleneous-1490072265151-dashboard.json B server/grafana-reporting/es-datasource/MAILET-1490071694187-dashboard.json B server/grafana-reporting/es-datasource/MessageFastViewProjection-1575520507952.json B server/grafana-reporting/es-datasource/BlobStore-1543222647953-dashboard.json B server/grafana-reporting/es-datasource/James_JVM-1504068360629-dashboard.json B server/grafana-reporting/es-datasource/JMAP_count_board-1488774795514-dashboard.json !????? server/grafana-reporting/es-datasource/README.md B server/grafana-reporting/es-datasource/SMTP_board-1488774774172-dashboard.json B server/grafana-reporting/es-datasource/Tika-1522226794419-dashboard.json B server/grafana-reporting/es-datasource/PreDeletionHooks-1553684324244-dashboard.json B server/grafana-reporting/es-datasource/MailboxListeners rate-1552903378376.json B server/grafana-reporting/es-datasource/MailboxListeners-1528958667486-dashboard.json B server/grafana-reporting/es-datasource/IMAP_board-1488774825351-dashboard.json AL mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICal4JConfigurator.java AL mailet/icalendar/src/main/java/org/apache/james/transport/mailets/model/ICALAttributeDTO.java AL mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToHeader.java AL mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java AL mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java AL mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICalendarParser.java !????? mailet/icalendar/src/test/resources/ics_in_header.eml !????? mailet/icalendar/src/test/resources/ics/no_event.ics !????? mailet/icalendar/src/test/resources/ics/meeting_without_dtstamp.ics !????? mailet/icalendar/src/test/resources/ics/ics_with_error.ics !????? mailet/icalendar/src/test/resources/ics/meeting_without_sequence.ics !????? mailet/icalendar/src/test/resources/ics/meeting_2.ics !????? mailet/icalendar/src/test/resources/ics/meeting_without_uid.ics !????? mailet/icalendar/src/test/resources/ics/meeting.ics !????? mailet/icalendar/src/test/resources/ics/meeting_without_method.ics AL mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICalendarParserTest.java AL mailet/icalendar/src/test/java/org/apache/james/transport/mailets/model/ICALAttributeDTOTest.java AL mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java AL mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToHeadersTest.java AL mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICSSanitizerTest.java AL mailet/icalendar/pom.xml AL mailet/test/src/main/java/org/apache/mailet/base/test/FakeMailContext.java AL mailet/test/src/main/java/org/apache/mailet/base/test/FakeMatcherConfig.java AL mailet/test/src/main/java/org/apache/mailet/base/test/MailUtil.java AL mailet/test/src/main/java/org/apache/mailet/base/test/FakeMailetConfig.java AL mailet/test/src/main/java/org/apache/mailet/base/test/FakeMail.java AL mailet/test/src/main/java/org/apache/mailet/base/MailAddressFixture.java AL mailet/test/src/test/java/org/apache/mailet/base/test/FakeMailTest.java AL mailet/test/pom.xml N mailet/standard/LICENSE.txt N mailet/standard/NOTICE.txt AL mailet/standard/src/main/appended-resources/supplemental-models.xml AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasMimeType.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeaderWithPrefix.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/GenericRegexMatcher.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/package.html AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SMTPIsAuthNetwork.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/CompareNumericHeaderValue.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/RecipientIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderIsNull.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SMTPAuthUserIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderDomainIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/IsFromMailingList.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasMailAttributeWithValueRegex.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasMimeTypeAnySubPart.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/RecipientIsLocal.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasHeader.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/UserIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SentByMailet.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasException.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/AtMost.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/RecipientCountExceeds.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SubjectStartsWith.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/CommandListservMatcher.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/TooManyLines.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/PartHasContentType.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/CommandForListserv.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/All.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderIsLocal.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SubjectIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/NESSpamCheck.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/TooManyRecipients.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/FileRegexMatcher.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasMailAttribute.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/RecipientDomainIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/FetchedFrom.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HostIsLocal.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SMTPAuthSuccessful.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/IsSingleRecipient.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderHostIsLocal.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SenderIsRegex.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/utils/MailAddressCollectionReader.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/utils/MimeWalk.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasMailAttributeWithValue.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/RecipientIsRegex.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/SizeGreaterThan.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/RelayLimit.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/AttachmentFileNameIs.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasMimeTypeParameter.java AL mailet/standard/src/main/java/org/apache/james/transport/matchers/HasAttachment.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/package.html AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ToProcessor.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/Null.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/MimeDecodingMailet.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/SetErrorMessage.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/PropagateError.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/WrapText.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/RecoverAttachment.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/SetMimeHeader.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ContentReplacer.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeader.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/SetMailAttribute.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveAllMailAttributes.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/HeadersToHTTP.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/MailAttributesListToMimeHeaders.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/MappingArgument.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/PatternExtractor.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/debug/package.html AL mailet/standard/src/main/java/org/apache/james/transport/mailets/debug/Counter.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/debug/Identity.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/debug/DumpSystemErr.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/debug/ExceptionThrowingMailet.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/MailAttributesToMimeHeaders.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/PostmasterAlias.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/FoldLongLines.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ContactExtractor.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/LogMessage.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/Expires.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/RecipientToLowerCase.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/UnwrapText.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/AddDeliveredToHeader.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/MimeUtil.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ReplaceConfig.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ReplacingPattern.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/AddSubjectPrefix.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/StripAttachment.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/AddFooter.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMailAttribute.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefix.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageModifier.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/utils/MimeMessageUtils.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ReplaceContent.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/SerialiseToHTTP.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ClassifyBounce.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/ServerTime.java AL mailet/standard/src/main/java/org/apache/james/transport/mailets/OnlyText.java A mailet/standard/src/test/resources/nested.zip AL mailet/standard/src/test/resources/org/apache/james/mailet/standard/mailets/replaceSubject.patterns !????? mailet/standard/src/test/resources/mime/sendToRemoteHttp.mime !????? mailet/standard/src/test/resources/mime/gmail.mime !????? mailet/standard/src/test/resources/mime/headerFolded.mime !????? mailet/standard/src/test/resources/mime/space.eml !????? mailet/standard/src/test/resources/mime/incorrect-headers.mime A mailet/standard/src/test/resources/sonde.zip AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/TooManyLinesTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/TooManyRecipientsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SentByMailetTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SizeGreaterThanTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/AttachmentFileNameIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasMailAttributeTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SMTPAuthSuccessfulTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderIsLocalTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/util/MailAddressCollectionReaderTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/FetchedFromTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SubjectStartsWithTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasMailAttributeWithValueTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasMimeTypeTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/AllTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderIsNullTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/RecipientIsRegexTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/UserIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasMimeTypeParameterTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasMimeTypeAnySubPartTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/RecipientIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SubjectIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/RecipientDomainIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderWithPrefixTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/RelayLimitTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HostIsLocalTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderDomainIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SMTPAuthUserIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SMTPIsAuthNetworkTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/AbstractHasMailAttributeTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/IsSingleRecipientTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/AtMostTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/RecipientCountExceedsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderHostIsLocalTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasExceptionTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/utils/MimeWalkTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/RecipientIsLocalTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/PartHasContentTypeTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HostIsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasMailAttributeWithValueRegexTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/NESSpamCheckTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/IsFromMailingListTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/SenderIsRegexTest.java AL mailet/standard/src/test/java/org/apache/james/transport/matchers/HasAttachmentTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/FoldLongLinesTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/SetMailAttributeTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/SerialiseToHTTPTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderByPrefixTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/PostmasterAliasTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/PatternExtractorTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/OnlyTextTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/SetMimeHeaderTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/HeadersToHTTPTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/UnwrapTextTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/MimeDecodingMailetTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/AddDeliveredToHeaderTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/RecipientToLowerCaseTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/ReplaceContentTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/AddFooterTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/ToProcessorTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/StripAttachmentTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/MappingArgumentTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMailAttributeTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/ContentReplacerTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/MailAttributesToMimeHeadersTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/ExpiresTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageUtilsTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/utils/MimeMessageModifierTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveMimeHeaderTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/NullTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/PropagateErrorTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/AddSubjectPrefixTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/LogMessageTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/SetErrorMessageTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/MailAttributesListToMimeHeadersTest.java AL mailet/standard/src/test/java/org/apache/james/transport/mailets/RemoveAllMailAttributesTest.java AL mailet/standard/pom.xml !????? mailet/standard/LICENSE.apache !????? mailet/standard/LICENSE.activation N mailet/standard/RELEASE_NOTES.txt !????? mailet/standard/LICENSE.mail N mailet/ai/LICENSE.txt N mailet/ai/NOTICE.txt N mailet/ai/BUILDING.txt AL mailet/ai/src/main/java/org/apache/james/ai/classic/TokenProbabilityStrength.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/JDBCUtil.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysis.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/JDBCBayesianAnalyzer.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalyzer.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/TokenCounter.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/SystemContext.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/Tokenizer.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/BayesianAnalysisFeeder.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/SqlResources.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/CorpusLoaderThread.java AL mailet/ai/src/main/java/org/apache/james/ai/classic/TokenCollector.java AL mailet/ai/pom.xml AL mailet/src/reporting-site/site-standard.xml AL mailet/src/reporting-site/site/site.xml AL mailet/src/reporting-site/site-crypto.xml AL mailet/src/reporting-site/site-base.xml AL mailet/src/reporting-site/site.xml AL mailet/src/reporting-site/site-mailetdoc.xml AL mailet/api/src/main/java/org/apache/mailet/HostAddress.java AL mailet/api/src/main/java/org/apache/mailet/package.html AL mailet/api/src/main/java/org/apache/mailet/AttributeName.java AL mailet/api/src/main/java/org/apache/mailet/TemporaryLookupException.java AL mailet/api/src/main/java/org/apache/mailet/ArbitrarySerializable.java AL mailet/api/src/main/java/org/apache/mailet/Matcher.java AL mailet/api/src/main/java/org/apache/mailet/ExcludeFromDocumentation.java AL mailet/api/src/main/java/org/apache/mailet/StorageDirective.java AL mailet/api/src/main/java/org/apache/mailet/Mail.java AL mailet/api/src/main/java/org/apache/mailet/MailAddress.java AL mailet/api/src/main/java/org/apache/mailet/MailetConfig.java AL mailet/api/src/main/java/org/apache/mailet/MatcherConfig.java AL mailet/api/src/main/java/org/apache/mailet/Serializer.java AL mailet/api/src/main/java/org/apache/mailet/Mailet.java AL mailet/api/src/main/java/org/apache/mailet/LoopPrevention.java AL mailet/api/src/main/java/org/apache/mailet/MailetContext.java AL mailet/api/src/main/java/org/apache/mailet/Attribute.java AL mailet/api/src/main/java/org/apache/mailet/LookupException.java AL mailet/api/src/main/java/org/apache/mailet/AttributeValue.java AL mailet/api/src/main/java/org/apache/mailet/Experimental.java AL mailet/api/src/main/java/org/apache/mailet/PerRecipientHeaders.java AL mailet/api/src/main/java/org/apache/mailet/MailetException.java AL mailet/api/src/main/java/org/apache/mailet/DsnParameters.java AL mailet/api/src/main/java/org/apache/mailet/AttributeUtils.java AL mailet/api/src/main/java/org/apache/mailet/ProcessingState.java AL mailet/api/src/test/java/org/apache/mailet/AttributeValueTest.java AL mailet/api/src/test/java/org/apache/mailet/AttributeTest.java AL mailet/api/src/test/java/org/apache/mailet/AttributeNameTest.java AL mailet/api/src/test/java/org/apache/mailet/ContractMailTest.java AL mailet/api/src/test/java/org/apache/mailet/DsnParametersTest.java AL mailet/api/src/test/java/org/apache/mailet/LoopPreventionTest.java AL mailet/api/pom.xml N mailet/api/NOTICE N mailet/api/RELEASE_NOTES.txt N mailet/api/LICENSE GEN mailet/pom.xml AL mailet/amqp/src/main/java/org/apache/james/transport/mailets/AmqpForwardAttribute.java AL mailet/amqp/src/test/java/org/apache/james/transport/mailets/AmqpForwardAttributeTest.java AL mailet/amqp/pom.xml AL mailet/base/src/main/appended-resources/supplemental-models.xml AL mailet/base/src/main/java/org/apache/mailet/base/AutomaticallySentMailDetector.java AL mailet/base/src/main/java/org/apache/mailet/base/package.html AL mailet/base/src/main/java/org/apache/mailet/base/RFC2822Headers.java AL mailet/base/src/main/java/org/apache/mailet/base/GenericMatcher.java AL mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java AL mailet/base/src/main/java/org/apache/mailet/base/FlowedMessageUtils.java AL mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java AL mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java AL mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java AL mailet/base/src/main/java/org/apache/mailet/base/MailetPipelineLogging.java AL mailet/base/src/main/java/org/apache/mailet/base/GenericRecipientMatcher.java AL mailet/base/src/main/java/org/apache/mailet/base/DateFormats.java AL mailet/base/src/main/java/org/apache/mailet/base/MatcherInverter.java !????? mailet/base/src/test/resources/eml/text-only-7bit.eml !????? mailet/base/src/test/resources/eml/multipart-7bit.eml !????? mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt !????? mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt !????? mailet/base/src/test/resources/eml/multipart-8bit.eml !????? mailet/base/src/test/resources/eml/text-only-8bit.eml AL mailet/base/src/test/java/org/apache/mailet/base/MatcherInverterTest.java AL mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java AL mailet/base/src/test/java/org/apache/mailet/base/FlowedMessageUtilsTest.java AL mailet/base/src/test/java/org/apache/mailet/base/GenericMailetTest.java AL mailet/base/src/test/java/org/apache/mailet/base/MailetPipelineLoggingTest.java AL mailet/base/src/test/java/org/apache/mailet/base/StringUtilsTest.java AL mailet/base/src/test/java/org/apache/mailet/base/MailetUtilTest.java AL mailet/base/pom.xml N mailet/base/NOTICE N mailet/base/RELEASE_NOTES.txt N mailet/base/LICENSE N mailet/mailetdocs-maven-plugin/LICENSE.txt N mailet/mailetdocs-maven-plugin/NOTICE.txt AL mailet/mailetdocs-maven-plugin/src/main/appended-resources/supplemental-models.xml AL mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/MailetMatcherDescriptor.java AL mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/AggregateMailetdocsReport.java AL mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/MailetdocsReport.java AL mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/AbstractMailetdocsReport.java AL mailet/mailetdocs-maven-plugin/src/main/java/org/apache/james/mailet/DefaultDescriptorsExtractor.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/MailetMatcherDescriptorTest.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/excluded/ExcludedFromDocumentationMailet.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/excluded/NotExcludedFromDocumentationMailet.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/constructor/ConstructorMailet.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/DefaultDescriptorsExtractorTest.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/experimental/NonExperimentalMailet.java AL mailet/mailetdocs-maven-plugin/src/test/java/org/apache/james/mailet/experimental/ExperimentalMailet.java AL mailet/mailetdocs-maven-plugin/pom.xml N mailet/mailetdocs-maven-plugin/RELEASE_NOTES.txt N mailet/crypto/src/main/resources/META-INF/README.txt AL mailet/crypto/src/main/appended-resources/supplemental-models.xml AL mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderConfiguration.java AL mailet/crypto/src/main/java/org/apache/james/transport/package.html AL mailet/crypto/src/main/java/org/apache/james/transport/SMIMESignerInfo.java AL mailet/crypto/src/main/java/org/apache/james/transport/PemReader.java AL mailet/crypto/src/main/java/org/apache/james/transport/matcher/package.html AL mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsSMIMESigned.java AL mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsX509CertificateSubject.java AL mailet/crypto/src/main/java/org/apache/james/transport/matcher/IsSMIMEEncrypted.java AL mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolder.java AL mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderFactory.java AL mailet/crypto/src/main/java/org/apache/james/transport/KeyHolder.java AL mailet/crypto/src/main/java/org/apache/james/transport/SMIMEAttributeNames.java AL mailet/crypto/src/main/java/org/apache/james/transport/InitJCE.java AL mailet/crypto/src/main/java/org/apache/james/transport/KeyFileType.java AL mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMEDecrypt.java AL mailet/crypto/src/main/java/org/apache/james/transport/mailets/Sign.java AL mailet/crypto/src/main/java/org/apache/james/transport/mailets/package.html AL mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMESign.java AL mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMECheckSignature.java AL mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java AL mailet/crypto/src/main/java/org/apache/james/transport/SMIMEKeyHolder.java AL mailet/crypto/src/test/java/org/apache/james/transport/matcher/IsSMIMESignedTest.java AL mailet/crypto/pom.xml N mailet/crypto/NOTICE N mailet/crypto/RELEASE_NOTES.txt N mailet/crypto/README.txt N mailet/crypto/LICENSE AL event-bus/distributed/src/main/java/org/apache/james/events/RegistrationQueueName.java AL event-bus/distributed/src/main/java/org/apache/james/events/RoutingKeyConverter.java AL event-bus/distributed/src/main/java/org/apache/james/events/EventDispatcher.java AL event-bus/distributed/src/main/java/org/apache/james/events/GroupRegistrationHandler.java AL event-bus/distributed/src/main/java/org/apache/james/events/RabbitMQMailboxEventBusDeadLetterQueueHealthCheck.java AL event-bus/distributed/src/main/java/org/apache/james/events/ListenerExecutor.java AL event-bus/distributed/src/main/java/org/apache/james/events/RabbitMQEventBus.java AL event-bus/distributed/src/main/java/org/apache/james/events/NamingStrategy.java AL event-bus/distributed/src/main/java/org/apache/james/events/GroupRegistration.java AL event-bus/distributed/src/main/java/org/apache/james/events/KeyReconnectionHandler.java AL event-bus/distributed/src/main/java/org/apache/james/events/LocalListenerRegistry.java AL event-bus/distributed/src/main/java/org/apache/james/events/WaitDelayGenerator.java AL event-bus/distributed/src/main/java/org/apache/james/events/RabbitMQJmapEventBusDeadLetterQueueHealthCheck.java AL event-bus/distributed/src/main/java/org/apache/james/events/KeyRegistrationHandler.java AL event-bus/distributed/src/main/java/org/apache/james/events/KeyRegistration.java AL event-bus/distributed/src/main/java/org/apache/james/events/GroupConsumerRetry.java AL event-bus/distributed/src/main/java/org/apache/james/events/RegistrationBinder.java AL event-bus/distributed/src/main/java/org/apache/james/events/EventBusReconnectionHandler.java AL event-bus/distributed/src/main/java/org/apache/james/events/GroupRegistrationHandlerGroup.java AL event-bus/distributed/src/main/java/org/apache/james/events/RabbitEventBusConsumerHealthCheck.java AL event-bus/distributed/src/main/java/org/apache/james/events/EventBusId.java AL event-bus/distributed/src/test/java/org/apache/james/events/EventBusIdTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/WaitDelayGeneratorTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQJmapEventBusDeadLetterQueueHealthCheckTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/RoutingKeyConverterTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/LocalListenerRegistryTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQMailboxEventBusDeadLetterQueueHealthCheckTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/NetworkErrorTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusDeadLetterQueueUpgradeTest.java AL event-bus/distributed/src/test/java/org/apache/james/events/RabbitMQEventBusUsingQuorumQueueTest.java AL event-bus/distributed/pom.xml AL event-bus/api/src/main/java/org/apache/james/events/EventDeadLetters.java AL event-bus/api/src/main/java/org/apache/james/events/EventListener.java AL event-bus/api/src/main/java/org/apache/james/events/GroupAlreadyRegistered.java AL event-bus/api/src/main/java/org/apache/james/events/GroupRegistrationNotFound.java AL event-bus/api/src/main/java/org/apache/james/events/Group.java AL event-bus/api/src/main/java/org/apache/james/events/Event.java AL event-bus/api/src/main/java/org/apache/james/events/EventBus.java AL event-bus/api/src/main/java/org/apache/james/events/RegistrationKey.java AL event-bus/api/src/main/java/org/apache/james/events/RetryBackoffConfiguration.java AL event-bus/api/src/main/java/org/apache/james/events/EventBusName.java AL event-bus/api/src/main/java/org/apache/james/events/DispatchingFailureGroup.java AL event-bus/api/src/main/java/org/apache/james/events/EventSerializersAggregator.java AL event-bus/api/src/main/java/org/apache/james/events/Registration.java AL event-bus/api/src/main/java/org/apache/james/events/EventSerializer.java AL event-bus/api/src/main/java/org/apache/james/events/EventDeadLettersHealthCheck.java AL event-bus/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java AL event-bus/api/src/test/java/org/apache/james/events/RetryBackoffConfigurationTest.java AL event-bus/api/src/test/java/org/apache/james/events/EventCollector.java AL event-bus/api/src/test/java/org/apache/james/events/ErrorHandlingContract.java AL event-bus/api/src/test/java/org/apache/james/events/KeyContract.java AL event-bus/api/src/test/java/org/apache/james/events/EventBusContract.java AL event-bus/api/src/test/java/org/apache/james/events/GroupContract.java AL event-bus/api/src/test/java/org/apache/james/events/InsertionIdTest.java AL event-bus/api/src/test/java/org/apache/james/events/EventBusTestFixture.java AL event-bus/api/src/test/java/org/apache/james/events/DispatchingFailureGroupTest.java AL event-bus/api/src/test/java/org/apache/james/events/EventDeadLettersHealthCheckContract.java AL event-bus/api/src/test/java/org/apache/james/events/GroupTest.java AL event-bus/api/src/test/java/org/apache/james/events/EventDeadLettersContract.java AL event-bus/api/src/test/java/org/apache/james/events/EventBusConcurrentTestContract.java AL event-bus/api/pom.xml AL event-bus/pom.xml AL event-bus/in-vm/src/main/java/org/apache/james/events/delivery/EventDelivery.java AL event-bus/in-vm/src/main/java/org/apache/james/events/delivery/InVmEventDelivery.java AL event-bus/in-vm/src/main/java/org/apache/james/events/InVMEventBus.java AL event-bus/in-vm/src/main/java/org/apache/james/events/MemoryEventDeadLetters.java AL event-bus/in-vm/src/test/java/org/apache/james/events/delivery/InVmEventDeliveryTest.java AL event-bus/in-vm/src/test/java/org/apache/james/events/MemoryEventDeadLettersHealthCheckTest.java AL event-bus/in-vm/src/test/java/org/apache/james/events/MemoryEventDeadLettersTest.java AL event-bus/in-vm/src/test/java/org/apache/james/events/InVMEventBusTest.java AL event-bus/in-vm/pom.xml AL event-bus/postgres/src/main/java/org/apache/james/events/PostgresEventDeadLettersModule.java AL event-bus/postgres/src/main/java/org/apache/james/events/PostgresEventDeadLetters.java AL event-bus/postgres/src/test/java/org/apache/james/events/PostgresEventDeadLettersTest.java AL event-bus/postgres/pom.xml AL event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLetters.java AL event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersTable.java AL event-bus/cassandra/src/main/java/org/apache/james/events/tables/CassandraEventDeadLettersGroupTable.java AL event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersDAO.java AL event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersGroupDAO.java AL event-bus/cassandra/src/main/java/org/apache/james/events/CassandraEventDeadLettersModule.java AL event-bus/cassandra/src/test/java/org/apache/james/events/CassandraEventDeadLettersGroupDAOTest.java AL event-bus/cassandra/src/test/java/org/apache/james/events/CassandraEventDeadLettersDAOTest.java AL event-bus/cassandra/src/test/java/org/apache/james/events/CassandraEventDeadLettersHealthCheckTest.java AL event-bus/cassandra/src/test/java/org/apache/james/events/CassandraEventDeadLettersTest.java AL event-bus/cassandra/pom.xml AL examples/custom-webadmin-route/src/main/resources/webadmin.properties AL examples/custom-webadmin-route/src/main/java/org/apache/james/examples/RouteA.java AL examples/custom-webadmin-route/pom.xml !????? examples/custom-webadmin-route/README.md !????? examples/metrics-graphite/docker-compose.yml !????? examples/metrics-graphite/james/extensions.properties AL examples/metrics-graphite/src/main/java/org/apache/james/examples/GraphiteExporter.java AL examples/metrics-graphite/pom.xml !????? examples/metrics-graphite/README.md B examples/metrics-graphite/image/metrics-graphite.png AL examples/custom-smtp-hooks/src/main/resources/smtpserver.xml AL examples/custom-smtp-hooks/src/main/java/org/apache/james/examples/LoggingRcptHook.java AL examples/custom-smtp-hooks/pom.xml !????? examples/custom-smtp-hooks/README.md !????? examples/proxy-smtp/docker-compose.yml !????? examples/proxy-smtp/haproxy.cfg AL examples/proxy-smtp/imapserver.xml !????? examples/proxy-smtp/README.md AL examples/proxy-smtp/smtpserver.xml AL examples/custom-smtp-command/src/main/resources/smtpserver.xml AL examples/custom-smtp-command/src/main/java/org/apache/james/examples/MyNoopCmdHandler.java AL examples/custom-smtp-command/src/main/java/org/apache/james/examples/MyCmdHandlerLoader.java AL examples/custom-smtp-command/pom.xml !????? examples/custom-smtp-command/README.md AL examples/custom-listeners/src/main/resources/listeners.xml AL examples/custom-listeners/src/main/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessages.java AL examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java AL examples/custom-listeners/pom.xml !????? examples/custom-listeners/README.md !????? examples/custom-imap/docker-compose.yml AL examples/custom-imap/src/main/resources/imapserver.xml AL examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingCommandParser.java AL examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingProcessor.java AL examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingImapPackages.java AL examples/custom-imap/src/main/java/org/apache/james/examples/imap/PingResponseEncoder.java AL examples/custom-imap/src/test/resources/listeners.xml AL examples/custom-imap/src/test/resources/dnsservice.xml AL examples/custom-imap/src/test/resources/lmtpserver.xml AL examples/custom-imap/src/test/resources/mailetcontainer.xml AL examples/custom-imap/src/test/resources/managesieveserver.xml AL examples/custom-imap/src/test/resources/domainlist.xml AL examples/custom-imap/src/test/resources/mailrepositorystore.xml AL examples/custom-imap/src/test/resources/usersrepository.xml B examples/custom-imap/src/test/resources/keystore AL examples/custom-imap/src/test/resources/smtpserver.xml AL examples/custom-imap/src/test/resources/pop3server.xml AL examples/custom-imap/src/test/java/org/apache/james/examples/imap/ImapCustomPackagesTest.java AL examples/custom-imap/pom.xml !????? examples/custom-imap/README.md AL examples/custom-imap/sample-configuration/imapserver.xml AL examples/custom-mailets/src/main/resources/mailetcontainer.xml AL examples/custom-mailets/src/main/java/org/apache/james/examples/custom/mailets/IsDelayedForMoreThan.java AL examples/custom-mailets/src/main/java/org/apache/james/examples/custom/mailets/SendPromotionCode.java AL examples/custom-mailets/pom.xml !????? examples/custom-mailets/README.md AL examples/custom-healthcheck/src/main/resources/healthcheck.properties AL examples/custom-healthcheck/src/main/java/org/apache/james/examples/HealthCheckA.java AL examples/custom-healthcheck/pom.xml !????? examples/custom-healthcheck/README.md AL examples/pom.xml !????? examples/README.md B examples/imap-autoconf/thunderbird_autoconf.png B examples/imap-autoconf/outlook_enjoyAutoConfig.jpg !????? examples/imap-autoconf/content/mail/config-v1.1.xml !????? examples/imap-autoconf/content/Autodiscover/Autodiscover.xml !????? examples/imap-autoconf/content/.well-known/autoconfig/mail/config-v1.1.xml !????? examples/imap-autoconf/content/autodiscover/autodiscover.xml !????? examples/imap-autoconf/docker-compose.yml !????? examples/imap-autoconf/README.adoc B examples/imap-autoconf/outlook_enterMailAddress.jpg !????? examples/imap-autoconf/default.conf B examples/imap-autoconf/outlook_enterPassword.jpg AL examples/custom-james-assembly/src/main/java/org/apache/james/examples/CustomJamesServerMain.java AL examples/custom-james-assembly/pom.xml !????? examples/custom-james-assembly/custom-james-assembly.iml !????? examples/custom-james-assembly/README.md AL examples/custom-james-assembly/sample-configuration/mailetcontainer.xml AL examples/custom-james-assembly/sample-configuration/imapserver.xml AL examples/custom-james-assembly/sample-configuration/mailrepositorystore.xml AL examples/custom-james-assembly/sample-configuration/logback.xml AL examples/custom-james-assembly/sample-configuration/smtpserver.xml B examples/opensearch-dahsboard/img_13.png B examples/opensearch-dahsboard/img_1.png B examples/opensearch-dahsboard/img_12.png B examples/opensearch-dahsboard/img_10.png B examples/opensearch-dahsboard/img_15.png !????? examples/opensearch-dahsboard/docker-compose.yml B examples/opensearch-dahsboard/img_5.png B examples/opensearch-dahsboard/img_3.png B examples/opensearch-dahsboard/img.png B examples/opensearch-dahsboard/img_2.png !????? examples/opensearch-dahsboard/README.md B examples/opensearch-dahsboard/img_8.png B examples/opensearch-dahsboard/img_7.png !????? examples/opensearch-dahsboard/james-dashboard.ndjson B examples/opensearch-dahsboard/img_6.png B examples/opensearch-dahsboard/img_4.png B examples/opensearch-dahsboard/img_14.png B examples/opensearch-dahsboard/img_11.png B examples/opensearch-dahsboard/img_9.png B examples/oidc/keycloak/realm-oidc.json !????? examples/oidc/test.sh !????? examples/oidc/docker-compose.yml !????? examples/oidc/james/imapserver.xml AL examples/oidc/james/usersrepository.xml !????? examples/oidc/james/jmap.properties !????? examples/oidc/james/smtpserver.xml B examples/oidc/_media/oidc-sso.png B examples/oidc/_media/smtp-setting.png !????? examples/oidc/_media/oidc-sso.drawio B examples/oidc/_media/imap-setting.png B examples/oidc/_media/receive-mail.png B examples/oidc/_media/send-mail.png B examples/oidc/_media/login-popup.png B examples/oidc/_media/IMAP-SMTP-oidc.png !????? examples/oidc/_media/oidc-slo.drawio B examples/oidc/_media/oidc-slo.png !????? examples/oidc/_media/IMAP_SMTP oidc.drawio !????? examples/oidc/apisix/conf/apisix.yaml !????? examples/oidc/apisix/conf/config.yaml !????? examples/oidc/README.md !????? examples/oidc/ldap/populate.ldif AL mailbox/spring/src/main/resources/META-INF/spring/mailbox-locker.xml AL mailbox/spring/src/main/resources/META-INF/spring/quota.xml AL mailbox/spring/src/main/resources/META-INF/spring/event-system.xml AL mailbox/spring/src/main/resources/META-INF/spring/spring-mailbox.xml AL mailbox/spring/src/main/resources/META-INF/spring/mailbox-no-authorizator.xml AL mailbox/spring/src/main/resources/META-INF/spring/mailbox-authenticator-anonymous.xml AL mailbox/spring/src/main/resources/log4j.properties AL mailbox/spring/src/main/java/org/apache/james/mailbox/spring/SpringMailbox.java AL mailbox/spring/src/main/java/org/apache/james/mailbox/spring/AnonymousAuthenticator.java AL mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java AL mailbox/spring/src/main/java/org/apache/james/mailbox/spring/MailboxInitializer.java AL mailbox/spring/src/test/resources/META-INF/spring/mailbox-index-lucene-test.xml AL mailbox/spring/src/test/resources/META-INF/spring/metrics.xml AL mailbox/spring/src/test/resources/META-INF/spring/quota-alias.xml AL mailbox/spring/src/test/resources/META-INF/persistence.xml AL mailbox/spring/src/test/resources/META-INF/org/apache/james/database.properties AL mailbox/spring/src/test/java/org/apache/james/mailbox/spring/SpringMailboxTest.java !????? mailbox/spring/src/test/README.md AL mailbox/spring/src/reporting-site/site.xml AL mailbox/spring/pom.xml AL mailbox/plugin/quota-mailing-memory/src/test/java/org/apache/james/mailbox/quota/memory/listeners/InMemoryQuotaMailingListenersIntegrationTest.java AL mailbox/plugin/quota-mailing-memory/src/test/java/org/apache/james/mailbox/quota/memory/listeners/InMemoryQuotaThresholdConfigurationChangesTest.java AL mailbox/plugin/quota-mailing-memory/pom.xml AL mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/Offset.java AL mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaClause.java AL mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaBoundary.java AL mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaQuery.java AL mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaSearcher.java AL mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/Limit.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/OffsetTest.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchTestSystem.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaClauseTest.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaQueryTest.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaBoundaryFixture.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java AL mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/LimitTest.java AL mailbox/plugin/quota-search/pom.xml B mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event2.json B mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event.json B mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event4.json B mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event3.json AL mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/listeners/CassandraQuotaMailingListenersIntegrationTest.java AL mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java AL mailbox/plugin/quota-mailing-cassandra/pom.xml AL mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java AL mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java AL mailbox/plugin/quota-search-scanning/src/test/java/org/apache/james/quota/search/scanning/MemoryQuotaSearchTestSystemExtension.java AL mailbox/plugin/quota-search-scanning/src/test/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcherTest.java AL mailbox/plugin/quota-search-scanning/pom.xml AL mailbox/plugin/deleted-messages-vault-postgres/src/main/java/org/apache/james/vault/metadata/PostgresDeletedMessageVaultDeletionCallback.java AL mailbox/plugin/deleted-messages-vault-postgres/src/main/java/org/apache/james/vault/metadata/PostgresDeletedMessageMetadataVault.java AL mailbox/plugin/deleted-messages-vault-postgres/src/main/java/org/apache/james/vault/metadata/PostgresDeletedMessageMetadataModule.java AL mailbox/plugin/deleted-messages-vault-postgres/src/test/java/org/apache/james/vault/metadata/PostgresDeletedMessageMetadataVaultTest.java AL mailbox/plugin/deleted-messages-vault-postgres/pom.xml AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/json/QuotaRatioAsJson.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/json/QuotaRatioToOpenSearchJson.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/json/JsonMessageConstants.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/QuotaSearchIndexCreationUtil.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/events/OpenSearchQuotaMailboxListener.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/QuotaQueryConverter.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/OpenSearchQuotaSearcher.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/QuotaRatioMappingFactory.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/UserRoutingKeyFactory.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/QuotaRatioOpenSearchConstants.java AL mailbox/plugin/quota-search-opensearch/src/main/java/org/apache/james/quota/search/opensearch/OpenSearchQuotaConfiguration.java B mailbox/plugin/quota-search-opensearch/src/test/resources/quotaRatioNoDomain.json B mailbox/plugin/quota-search-opensearch/src/test/resources/quotaRatio.json AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/OpenSearchQuotaSearchTestSystemExtension.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/UserRoutingKeyFactoryTest.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/json/QuotaRatioAsJsonTest.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/json/QuotaRatioToOpenSearchJsonTest.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/OpenSearchQuotaConfigurationTest.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/events/OpenSearchQuotaMailboxListenerTest.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/QuotaQueryConverterTest.java AL mailbox/plugin/quota-search-opensearch/src/test/java/org/apache/james/quota/search/opensearch/OpenSearchQuotaSearcherTest.java AL mailbox/plugin/quota-search-opensearch/pom.xml !????? mailbox/plugin/quota-mailing/src/main/resources/templates/QuotaThresholdMailBody.mustache !????? mailbox/plugin/quota-mailing/src/main/resources/templates/QuotaThresholdMailSubject.mustache AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/QuotaMailingListenerConfiguration.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaEventDTOModules.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/HistoryEvolutionDTO.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaThresholdChangedEventDTO.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaThresholdChangedEvent.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaDTO.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdMailer.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNotice.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossingHandler.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholdChange.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholdHistory.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/HistoryEvolution.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholds.java AL mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThreshold.java !????? mailbox/plugin/quota-mailing/src/test/resources/templates/body1.mustache !????? mailbox/plugin/quota-mailing/src/test/resources/templates/body2.mustache !????? mailbox/plugin/quota-mailing/src/test/resources/templates/subject2.mustache !????? mailbox/plugin/quota-mailing/src/test/resources/templates/subject1.mustache AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdListenersTestSystem.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdConfigurationChangesTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdMailingIntegrationTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListenerTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNoticeTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossingTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/QuotaMailingListenerConfigurationTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/HistoryEvolutionTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdChangeTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdHistoryTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdsTest.java AL mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java AL mailbox/plugin/quota-mailing/pom.xml AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageZipper.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/metadata/MemoryDeletedMessageMetadataVault.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BucketNameGenerator.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskDTO.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/MetadataSerializer.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/DeletedMessageWithStorageInformation.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/DeletedMessageMetadataVault.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/StorageInformation.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/VaultConfiguration.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageContentNotFoundException.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Query.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/DeletedMessageField.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/FieldName.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Combinator.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Criterion.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/Operator.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationDTO.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryDTO.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryElementDeserializer.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryElementSerializer.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/CriterionDTO.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryElement.java AL mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java B mailbox/plugin/deleted-messages-vault/src/test/resources/json/deleted_message_with_storage_information.json B mailbox/plugin/deleted-messages-vault/src/test/resources/json/deleted_message.json B mailbox/plugin/deleted-messages-vault/src/test/resources/json/storage_information.json B mailbox/plugin/deleted-messages-vault/src/test/resources/json/deleted_message_with_storage_information_invalid.json B mailbox/plugin/deleted-messages-vault/src/test/resources/json/deleted_message_with_subject.json AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageMailboxContextTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/memory/metadata/MemoryDeletedMessageMetadataVaultTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BucketNameGeneratorTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageZipperTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/VaultConfigurationTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageMetadataVaultContract.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/StorageInformationTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageVaultMetadataFixture.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageWithStorageInformationTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationDTOTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementSerializerTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryTranslatorTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementDeserializerTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/dto/query/QueryElementTest.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java AL mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java AL mailbox/plugin/deleted-messages-vault/pom.xml AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/StorageInformationDAO.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVault.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageMetadataModule.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageVaultDeletionCallback.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageIdentifier.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/DeletedMessageIdentifierTest.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java AL mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java AL mailbox/plugin/deleted-messages-vault-cassandra/pom.xml AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/MessageToOpenSearchJson.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/MessageUpdateJson.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/MimePartDto.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/HeaderDto.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/EMailerDto.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/JsonMessageConstants.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/IndexableMessage.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/EMailersDto.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/json/SubjectsDto.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/IndexAttachments.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/IndexHeaders.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/IndexBody.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndex.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/events/DisabledListeningMessageSearchIndex.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxOpenSearchConstants.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/CriterionConverter.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/SortConverter.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/QueryConverter.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/query/DateResolutionFormatter.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearchHighlighter.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearcher.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxIdRoutingKeyFactory.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/OpenSearchMailboxConfiguration.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxMappingFactory.java AL mailbox/opensearch/src/main/java/org/apache/james/mailbox/opensearch/MailboxIndexCreationUtil.java !????? mailbox/opensearch/src/test/resources/eml/emailWith3Attachments.eml !????? mailbox/opensearch/src/test/resources/eml/mailCustomStringHeader.eml !????? mailbox/opensearch/src/test/resources/eml/bodyMakeTikaToFail.eml !????? mailbox/opensearch/src/test/resources/eml/alternative_simple.eml B mailbox/opensearch/src/test/resources/eml/inlined-mixed.json B mailbox/opensearch/src/test/resources/eml/alternative_simple.json B mailbox/opensearch/src/test/resources/eml/alternative.json !????? mailbox/opensearch/src/test/resources/eml/mailCustomDateHeader.eml !????? mailbox/opensearch/src/test/resources/eml/inlined-mixed.eml !????? mailbox/opensearch/src/test/resources/eml/mailWithHeaders.eml !????? mailbox/opensearch/src/test/resources/eml/htmlContent.txt !????? mailbox/opensearch/src/test/resources/eml/alternative.eml AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/MessageToOpenSearchJsonTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/json/IndexableMessageTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchMailboxConfigurationTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchOptimizeMoveAndFuzzySearchIntegrationTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/events/OpenSearchListeningMessageSearchIndexTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/query/SearchQueryTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/query/DateResolutionFormatterTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearchHighlighterTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/search/OpenSearchSearcherTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchIntegrationTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/MailboxIdRoutingKeyFactoryTest.java AL mailbox/opensearch/src/test/java/org/apache/james/mailbox/opensearch/OpenSearchNoIndexBodyIntegrationTest.java AL mailbox/opensearch/src/reporting-site/site.xml AL mailbox/opensearch/pom.xml AL mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxSessionMapperFactory.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManager.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageId.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMessageManager.java AL mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryId.java !????? mailbox/memory/src/test/resources/test.eml AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTestSystem.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/listener/MailboxSubscriptionListenerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAttachmentMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageWithAttachmentMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMoveTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManagerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaCalculatorTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerStorageTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapperTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerProvider.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryQuotaMailboxMessageManagerTest.java AL mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageManagerTestSystem.java AL mailbox/memory/src/reporting-site/site.xml AL mailbox/memory/pom.xml AL mailbox/event/json/src/main/scala/org/apache/james/event/json/MailboxEventSerializer.scala AL mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala AL mailbox/event/json/src/main/java/org/apache/james/event/acl/ACLDiffDTO.java AL mailbox/event/json/src/main/java/org/apache/james/event/acl/ACLUpdatedDTO.java AL mailbox/event/json/src/main/java/org/apache/james/event/acl/ACLDTO.java AL mailbox/event/json/src/main/java/org/apache/james/event/acl/ACLUpdated.java AL mailbox/event/json/src/main/java/org/apache/james/event/MailboxAggregateId.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/SerializerFixture.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaRootTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageIdTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/SessionIdTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxIdTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/EventIdTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/FlagsTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageUidTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UpdatedFlagsTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageMetaDataTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ACLDiffTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java AL mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java AL mailbox/event/json/pom.xml AL mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaTextExtractor.java AL mailbox/tika/src/main/java/org/apache/james/mailbox/tika/ContentTypeFilteringTextExtractor.java AL mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaHttpClientImpl.java AL mailbox/tika/src/main/java/org/apache/james/mailbox/tika/CachingTextExtractor.java AL mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaConfiguration.java AL mailbox/tika/src/main/java/org/apache/james/mailbox/tika/TikaHttpClient.java B mailbox/tika/src/test/resources/documents/writter.docx A mailbox/tika/src/test/resources/documents/slides.odp B mailbox/tika/src/test/resources/documents/calc.xlsx A mailbox/tika/src/test/resources/documents/writter.odt B mailbox/tika/src/test/resources/documents/fake.txt B mailbox/tika/src/test/resources/documents/slides.pptx !????? mailbox/tika/src/test/resources/documents/Text.txt A mailbox/tika/src/test/resources/documents/calc.ods B mailbox/tika/src/test/resources/documents/PDF.pdf AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/CachingTextExtractorTest.java AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaExtension.java AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainerSingleton.java AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaConfigurationTest.java AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaContainer.java AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/ContentTypeFilteringTextExtractorTest.java AL mailbox/tika/src/test/java/org/apache/james/mailbox/tika/TikaTextExtractorTest.java AL mailbox/tika/pom.xml AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigrator.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/exception/JpaMigrateException.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateQuery.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP172JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP168JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP165JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP184JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP176JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/main/java/org/apache/james/mailbox/tools/jpa/migrator/command/IMAP180JpaMigrateCommand.java AL mailbox/tools/jpa-migrator/src/test/java/org/apache/james/mailbox/tools/jpa/migrator/JpaMigratorTest.java AL mailbox/tools/jpa-migrator/pom.xml AL mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java AL mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java AL mailbox/tools/copier/pom.xml AL mailbox/tools/indexer/src/main/resources/META-INF/spring/mailbox-tools.xml AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTask.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTask.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImpl.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingEvent.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingEventType.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingContext.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/RunningOptionsDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingContextInformation.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexingContextInformationDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/FullReindexingTaskDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskDTO.java AL mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ThrowsReIndexer.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java AL mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java AL mailbox/tools/indexer/pom.xml AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeSingleComponentCurrentQuotasService.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTask.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RunningOptionsDTO.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeSingleQuotaComponentResult.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeSieveUploadCurrentQuotasService.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskAdditionalInformationDTO.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskDTO.java AL mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeMailboxCurrentQuotasService.java AL mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasTaskSerializationTest.java AL mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasServiceContract.java AL mailbox/tools/quota-recompute/pom.xml AL mailbox/src/reporting-site/site.xml AL mailbox/api/src/main/java/org/apache/james/mailbox/RequestAware.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSessionIdGenerator.java AL mailbox/api/src/main/java/org/apache/james/mailbox/acl/ACLDiff.java AL mailbox/api/src/main/java/org/apache/james/mailbox/acl/PositiveUserACLChanged.java AL mailbox/api/src/main/java/org/apache/james/mailbox/acl/UnionMailboxACLResolver.java AL mailbox/api/src/main/java/org/apache/james/mailbox/acl/PositiveUserACLDiff.java AL mailbox/api/src/main/java/org/apache/james/mailbox/acl/MailboxACLResolver.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxPathLocker.java AL mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/DefaultMailboxes.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxAnnotationManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/Authorizator.java AL mailbox/api/src/main/java/org/apache/james/mailbox/Authenticator.java AL mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxEvents.java AL mailbox/api/src/main/java/org/apache/james/mailbox/events/MessageMoveEvent.java AL mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxIdRegistrationKey.java AL mailbox/api/src/main/java/org/apache/james/mailbox/FlagsBuilder.java AL mailbox/api/src/main/java/org/apache/james/mailbox/SystemMailboxesProvider.java AL mailbox/api/src/main/java/org/apache/james/mailbox/RightManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/UuidBackedAttachmentId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResultIterator.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Cid.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ContentType.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Header.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageRange.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ComposedMessageId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroup.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageIdDto.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/InputStreamContent.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ByteSourceContent.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaLimitValue.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MimeDescriptor.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Headers.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Mailbox.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ThreadId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageMetaData.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/StringBackedAttachmentId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaData.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageAttachmentMetadata.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactNameCaseInsensitive.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcardCaseInsensitive.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/PartContentDescriptor.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/DeleteResult.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/UpdatedFlags.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/HeaderAndBodyByteContent.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxCounters.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxConstants.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Content.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuota.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ByteContent.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageMoves.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotation.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/UidValidity.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/AttachmentMetadata.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MimePath.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/Profiles.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/ParsedAttachment.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRoot.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java AL mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java AL mailbox/api/src/main/java/org/apache/james/mailbox/UuidBackedAttachmentIdFactory.java AL mailbox/api/src/main/java/org/apache/james/mailbox/copier/MailboxCopier.java AL mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentContentLoader.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MetadataWithMailboxId.java AL mailbox/api/src/main/java/org/apache/james/mailbox/StringBackedAttachmentIdFactory.java AL mailbox/api/src/main/java/org/apache/james/mailbox/probe/QuotaProbe.java AL mailbox/api/src/main/java/org/apache/james/mailbox/probe/ACLProbe.java AL mailbox/api/src/main/java/org/apache/james/mailbox/probe/MailboxProbe.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/Limits.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootDeserializer.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCodec.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java AL mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaChangeNotifier.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/ThreadNotFoundException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/UnsupportedRightException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/HasEmptyMailboxNameInHierarchyException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/InboxAlreadyCreated.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MailboxRoleNotFoundException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/BadCredentialsException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MailboxException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/ForbiddenDelegationException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MessageRangeException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/AttachmentNotFoundException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/UnsupportedOperationException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/UnsupportedSearchException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MailboxExistsException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/DifferentDomainException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/TooLongMailboxNameException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/AnnotationException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/SubscriptionException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MailboxSecurityException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MailboxNotFoundException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/ReadOnlyException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/UnsupportedCriteriaException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/InsufficientRightsException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/exception/MailboxNameException.java AL mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexingExecutionFailures.java AL mailbox/api/src/main/java/org/apache/james/mailbox/indexer/IndexingDetailInformation.java AL mailbox/api/src/main/java/org/apache/james/mailbox/indexer/MessageIdReIndexer.java AL mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexer.java AL mailbox/api/src/main/java/org/apache/james/mailbox/Role.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxUtil.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MessageUid.java AL mailbox/api/src/main/java/org/apache/james/mailbox/ApplicableFlagBuilder.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java AL mailbox/api/src/main/java/org/apache/james/mailbox/SessionProvider.java AL mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java AL mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentIdFactory.java AL mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java AL mailbox/api/src/main/java/org/apache/james/mailbox/searchhighligt/SearchHighlighterConfiguration.java AL mailbox/api/src/main/java/org/apache/james/mailbox/searchhighligt/SearchSnippet.java AL mailbox/api/src/main/java/org/apache/james/mailbox/searchhighligt/SearchHighlighter.java AL mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java AL mailbox/api/src/main/java/org/apache/james/mailbox/extractor/ParsedContent.java AL mailbox/api/src/main/java/org/apache/james/mailbox/extractor/TextExtractor.java AL mailbox/api/src/main/java/org/apache/james/mailbox/SubscriptionManager.java !????? mailbox/api/src/test/resources/eml/twoAttachmentsApi.eml B mailbox/api/src/test/resources/shattered-2.pdf B mailbox/api/src/test/resources/shattered-1.pdf AL mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLChangedTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/acl/ACLDiffTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/RoleTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/util/EventCollector.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java AL mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java AL mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java AL mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMail.java AL mailbox/api/src/test/java/org/apache/james/mailbox/events/MailboxIdRegistrationKeyTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/EventTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MetadataWithMailboxIdTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAssertingTool.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRootTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAssertingToolTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxCountersTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MultimailboxesSearchQueryTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/UidValidityTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageAttachmentMetadataTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/ContentTypeTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/ThreadIdTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaOperationTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/SearchQueryTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/FetchGroupTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaDataTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/PartContentDescriptorTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/StringBackedAttachmentIdTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationKeyTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MimePathTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/TestMessageId.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/ExactNameTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedWildcardCaseInsensitiveTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedWildcardTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedRegexTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/ExactNameCaseInsensitiveTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/search/WildcardTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageIdDtoTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/TestId.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/AttachmentMetadataTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/CidTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/CurrentQuotasTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/UpdatedFlagsTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLEntryKeyTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/Rfc4314RightsTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageMetaDataTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageRangeTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/MessageMovesTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/ComposedMessageIdTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/SubscriptionManagerContract.java AL mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaFixture.java AL mailbox/api/src/test/java/org/apache/james/mailbox/ApplicableFlagBuilderTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingExecutionFailuresTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/indexer/ReindexingFailureTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MessageUidTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MailboxExceptionTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/manager/IntegrationResources.java AL mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java AL mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerContract.java AL mailbox/api/src/test/java/org/apache/james/mailbox/AppendResultTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressContract.java AL mailbox/api/src/test/java/org/apache/james/mailbox/searchhighligt/SearchHighLighterContract.java AL mailbox/api/src/test/java/org/apache/james/mailbox/ModSeqTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/extension/PreDeletionHookTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/extractor/ParsedContentTest.java AL mailbox/api/src/test/java/org/apache/james/mailbox/extractor/TextExtractorContract.java AL mailbox/api/src/reporting-site/site.xml AL mailbox/api/pom.xml AL mailbox/pom.xml !????? mailbox/README.md !????? mailbox/var/store/derby/db.lck B mailbox/var/store/derby/dbex.lck !????? mailbox/var/store/derby/service.properties B mailbox/var/store/derby/log/log1.dat B mailbox/var/store/derby/log/log.ctrl !????? mailbox/var/store/derby/log/README_DO_NOT_TOUCH_FILES.txt B mailbox/var/store/derby/log/logmirror.ctrl !????? mailbox/var/store/derby/README_DO_NOT_TOUCH_FILES.txt B mailbox/var/store/derby/seg0/c1f1.dat B mailbox/var/store/derby/seg0/c101.dat B mailbox/var/store/derby/seg0/c4f0.dat B mailbox/var/store/derby/seg0/c651.dat B mailbox/var/store/derby/seg0/c111.dat B mailbox/var/store/derby/seg0/c470.dat B mailbox/var/store/derby/seg0/c1e0.dat B mailbox/var/store/derby/seg0/c161.dat B mailbox/var/store/derby/seg0/c2f0.dat B mailbox/var/store/derby/seg0/c300.dat B mailbox/var/store/derby/seg0/c340.dat B mailbox/var/store/derby/seg0/c5a1.dat B mailbox/var/store/derby/seg0/ca1.dat B mailbox/var/store/derby/seg0/c41.dat B mailbox/var/store/derby/seg0/c141.dat B mailbox/var/store/derby/seg0/c530.dat B mailbox/var/store/derby/seg0/c121.dat B mailbox/var/store/derby/seg0/cc0.dat B mailbox/var/store/derby/seg0/c501.dat B mailbox/var/store/derby/seg0/cd1.dat B mailbox/var/store/derby/seg0/c81.dat B mailbox/var/store/derby/seg0/c3a1.dat B mailbox/var/store/derby/seg0/c2e1.dat B mailbox/var/store/derby/seg0/c230.dat B mailbox/var/store/derby/seg0/c2a1.dat B mailbox/var/store/derby/seg0/c5b0.dat B mailbox/var/store/derby/seg0/c1c0.dat B mailbox/var/store/derby/seg0/c90.dat B mailbox/var/store/derby/seg0/c3c0.dat B mailbox/var/store/derby/seg0/c541.dat B mailbox/var/store/derby/seg0/c661.dat B mailbox/var/store/derby/seg0/c6b1.dat B mailbox/var/store/derby/seg0/c371.dat B mailbox/var/store/derby/seg0/ce1.dat B mailbox/var/store/derby/seg0/c4b0.dat B mailbox/var/store/derby/seg0/c351.dat B mailbox/var/store/derby/seg0/c1d1.dat B mailbox/var/store/derby/seg0/c6d1.dat B mailbox/var/store/derby/seg0/c331.dat B mailbox/var/store/derby/seg0/c561.dat B mailbox/var/store/derby/seg0/c400.dat B mailbox/var/store/derby/seg0/c51.dat B mailbox/var/store/derby/seg0/c5d0.dat B mailbox/var/store/derby/seg0/c311.dat B mailbox/var/store/derby/seg0/c200.dat B mailbox/var/store/derby/seg0/c6a1.dat B mailbox/var/store/derby/seg0/c481.dat B mailbox/var/store/derby/seg0/c5f0.dat B mailbox/var/store/derby/seg0/c581.dat B mailbox/var/store/derby/seg0/c380.dat B mailbox/var/store/derby/seg0/c461.dat B mailbox/var/store/derby/seg0/c391.dat B mailbox/var/store/derby/seg0/c681.dat B mailbox/var/store/derby/seg0/c2c1.dat B mailbox/var/store/derby/seg0/c570.dat B mailbox/var/store/derby/seg0/c510.dat B mailbox/var/store/derby/seg0/c3f1.dat B mailbox/var/store/derby/seg0/c451.dat B mailbox/var/store/derby/seg0/c3e1.dat B mailbox/var/store/derby/seg0/c640.dat B mailbox/var/store/derby/seg0/c631.dat B mailbox/var/store/derby/seg0/c281.dat B mailbox/var/store/derby/seg0/c3b1.dat B mailbox/var/store/derby/seg0/c31.dat B mailbox/var/store/derby/seg0/c180.dat B mailbox/var/store/derby/seg0/c130.dat B mailbox/var/store/derby/seg0/c421.dat B mailbox/var/store/derby/seg0/c1b1.dat B mailbox/var/store/derby/seg0/c361.dat B mailbox/var/store/derby/seg0/c3d1.dat B mailbox/var/store/derby/seg0/c241.dat B mailbox/var/store/derby/seg0/c211.dat B mailbox/var/store/derby/seg0/c251.dat B mailbox/var/store/derby/seg0/c6c1.dat B mailbox/var/store/derby/seg0/c691.dat B mailbox/var/store/derby/seg0/c10.dat B mailbox/var/store/derby/seg0/c4a1.dat B mailbox/var/store/derby/seg0/c4d0.dat B mailbox/var/store/derby/seg0/c590.dat B mailbox/var/store/derby/seg0/c521.dat B mailbox/var/store/derby/seg0/c490.dat B mailbox/var/store/derby/seg0/c2b1.dat !????? mailbox/var/store/derby/seg0/README_DO_NOT_TOUCH_FILES.txt B mailbox/var/store/derby/seg0/c4e1.dat B mailbox/var/store/derby/seg0/c20.dat B mailbox/var/store/derby/seg0/c610.dat B mailbox/var/store/derby/seg0/c191.dat B mailbox/var/store/derby/seg0/c71.dat B mailbox/var/store/derby/seg0/c2d0.dat B mailbox/var/store/derby/seg0/c60.dat B mailbox/var/store/derby/seg0/c5c1.dat B mailbox/var/store/derby/seg0/c601.dat B mailbox/var/store/derby/seg0/c171.dat B mailbox/var/store/derby/seg0/c150.dat B mailbox/var/store/derby/seg0/c441.dat B mailbox/var/store/derby/seg0/c621.dat B mailbox/var/store/derby/seg0/c290.dat B mailbox/var/store/derby/seg0/c1a1.dat B mailbox/var/store/derby/seg0/c221.dat B mailbox/var/store/derby/seg0/c271.dat B mailbox/var/store/derby/seg0/c321.dat B mailbox/var/store/derby/seg0/cf0.dat B mailbox/var/store/derby/seg0/c430.dat B mailbox/var/store/derby/seg0/c5e1.dat B mailbox/var/store/derby/seg0/c411.dat B mailbox/var/store/derby/seg0/c671.dat B mailbox/var/store/derby/seg0/cb1.dat B mailbox/var/store/derby/seg0/c550.dat B mailbox/var/store/derby/seg0/c260.dat B mailbox/var/store/derby/seg0/c4c1.dat !????? mailbox/var/store/lucene/write.lock AL mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml AL mailbox/jpa/src/main/resources/james-database.properties AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAId.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAnnotationMapper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/MessageUtils.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailboxAnnotation.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAUserFlag.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAProperty.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailboxAnnotationId.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessageWithAttachmentStorage.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAAttachment.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPATransactionalMapper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAAttachmentContentLoader.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDomainMessageCount.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserStorage.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/JpaCurrentQuota.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxGlobalMessageCount.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDomainStorage.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxGlobalStorage.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserMessageCount.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java AL mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java AL mailbox/jpa/src/test/resources/persistence.xml AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalAttachmentMapper.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAAttachmentMapperTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMapperTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/MessageUtilsTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalAnnotationMapper.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessageTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaAnnotationMapperTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMessageWithAttachmentMapperTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMoveTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMailboxMapperTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxFixture.java AL mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java AL mailbox/jpa/src/reporting-site/site.xml AL mailbox/jpa/pom.xml AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchivesLoader.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/Zipper.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/LongExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/StringExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/UidExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipArchivesLoader.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/WithZipHeader.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/EntryTypeExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZippedMailAccountIterator.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ExtraFieldExtractor.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/SizeExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/InternalDateExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipEntryType.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/MessageIdExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/package-info.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/ZipEntryIterator.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/MailboxIdExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/UidValidityExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/zip/FlagsExtraField.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMessageId.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/UnknownArchiveEntry.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ArchiveService.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/SerializedMailboxId.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxWithAnnotations.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MessageArchiveEntry.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveRestorer.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveEntry.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxWithAnnotationsArchiveEntry.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveIterator.java AL mailbox/backup/src/main/java/org/apache/james/mailbox/backup/Directory.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/WithZipHeaderTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssert.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipEntryTypeExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipperTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MessageIdExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipEntryTypeContract.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxIdExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/FlagExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/SizeExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidValidityExtraFieldTest.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchiveEntryAssert.java AL mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java AL mailbox/backup/pom.xml B mailbox/scanning-search/src/test/resources/pdf.pdf AL mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java AL mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/PDFTextExtractor.java AL mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/PDFTextExtractorTest.java AL mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SearchThreadIdGuessingAlgorithmTest.java AL mailbox/scanning-search/pom.xml AL mailbox/store/src/main/java/org/apache/james/mailbox/store/RandomMailboxSessionIdGenerator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/LazyMimeDescriptor.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/NoMailboxPathLocker.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxSessionMapperFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxSubscriptionListener.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/event/SpamEventListener.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AnnotationMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/SearchThreadIdGuessingAlgorithm.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapperFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ThreadIdGuessingAlgorithm.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsFilter.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/StandardNames.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxIdDeserialisationException.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilder.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMessage.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/FileBufferedBodyFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/Properties.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserImpl.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Message.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Subject.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DefaultMessageId.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/FlagsFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Property.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MimeMessageId.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapperFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapperFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/MimeMessageHeadersUtil.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/NaiveThreadIdGuessingAlgorithm.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentIdAssignationStrategy.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/FlagsUpdateCalculator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/JVMMailboxPathLocker.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/BatchSizes.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxAnnotationManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProviderImpl.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoMaxQuotaManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoQuotaManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaComponents.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoQuotaUpdater.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/FixedMaxQuotaManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreQuotaManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaUpdater.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaChangeNotifier.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/streaming/FullByteContent.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/streaming/PartContentBuilder.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/streaming/InputStreamContent.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/streaming/CountingInputStream.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageComparators.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/BaseSubjectComparator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SentDateComparator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderDisplayComparator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/HeaderMailboxComparator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/AbstractHeaderComparator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SearchUtil.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/EMailer.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/MimePart.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/MimePartParser.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/Subjects.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/HeaderCollection.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/SerializableMessage.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/RootMimePartContainerBuilder.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/MimePartContainerBuilder.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/mime/EMailers.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/SystemMailboxesProviderImpl.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/transaction/TransactionalMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/transaction/Mapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/transaction/NonTransactionalMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapperFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageMovesWithMailbox.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/PreDeletionHooks.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MoveResult.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MimeDescriptorImpl.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxExpressionBackwardCompatibility.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthenticator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/AbstractMailboxSessionIdGenerator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxManagerConfiguration.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxReactorUtils.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/extractor/JsoupTextExtractor.java AL mailbox/store/src/main/java/org/apache/james/mailbox/store/extractor/DefaultTextExtractor.java !????? mailbox/store/src/test/resources/eml/pgpSignedMail.eml !????? mailbox/store/src/test/resources/eml/htmlMail.eml !????? mailbox/store/src/test/resources/eml/mail4.eml !????? mailbox/store/src/test/resources/eml/recursiveMail.eml !????? mailbox/store/src/test/resources/eml/emailWithNonIndexableAttachment.eml !????? mailbox/store/src/test/resources/eml/mailWithLongHeaders.eml !????? mailbox/store/src/test/resources/eml/calendar2.eml !????? mailbox/store/src/test/resources/eml/signedMessage.eml B mailbox/store/src/test/resources/eml/4037_014.jpg !????? mailbox/store/src/test/resources/eml/oneAttachmentWithSimpleContentType.eml B mailbox/store/src/test/resources/eml/recursiveMail.json !????? mailbox/store/src/test/resources/eml/mail5.eml !????? mailbox/store/src/test/resources/eml/multiAttachmentsWithOneWrongContentDisposition.eml !????? mailbox/store/src/test/resources/eml/spamMail.eml !????? mailbox/store/src/test/resources/eml/mail.eml !????? mailbox/store/src/test/resources/eml/mailWithManyHeaders.eml !????? mailbox/store/src/test/resources/eml/oneAttachmentWithEmptyContentType.eml B mailbox/store/src/test/resources/eml/mail.json B mailbox/store/src/test/resources/eml/attachment.pdf !????? mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithNoCid.eml !????? mailbox/store/src/test/resources/eml/invalidCharset.eml B mailbox/store/src/test/resources/eml/james-3901.json !????? mailbox/store/src/test/resources/eml/headerWithDot.eml !????? mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml !????? mailbox/store/src/test/resources/eml/inlined-mixed.eml !????? mailbox/store/src/test/resources/eml/filenameOnly.eml !????? mailbox/store/src/test/resources/eml/noContentDispositionWithCID.eml !????? mailbox/store/src/test/resources/eml/embeddedAttachmentWithAttachment.eml !????? mailbox/store/src/test/resources/eml/oneInlinedAttachment.eml !????? mailbox/store/src/test/resources/eml/james-3901.eml !????? mailbox/store/src/test/resources/eml/messageWithNonASCIIFilenameAttachment.eml B mailbox/store/src/test/resources/eml/4037_015.jpg B mailbox/store/src/test/resources/eml/pgpSignedMail.json B mailbox/store/src/test/resources/eml/spamMail.json !????? mailbox/store/src/test/resources/eml/filenameAndName.eml !????? mailbox/store/src/test/resources/eml/invitationEmailFromOP.eml !????? mailbox/store/src/test/resources/eml/mail3.eml B mailbox/store/src/test/resources/eml/recursiveMailWithoutAttachments.json !????? mailbox/store/src/test/resources/eml/frnog.eml !????? mailbox/store/src/test/resources/eml/twoAttachments.eml B mailbox/store/src/test/resources/eml/nonTextualWithoutAttachmentTextContent.json !????? mailbox/store/src/test/resources/eml/oneAttachmentAndSomeTextInlined.eml B mailbox/store/src/test/resources/eml/emailWithNonIndexableAttachmentWithoutAttachment.json !????? mailbox/store/src/test/resources/eml/oneHtmlAttachmentAndSomeTextInlined.eml !????? mailbox/store/src/test/resources/eml/unknownDisposition.eml !????? mailbox/store/src/test/resources/eml/mail2.eml B mailbox/store/src/test/resources/eml/nonTextual.json !????? mailbox/store/src/test/resources/eml/mail1.eml B mailbox/store/src/test/resources/eml/invalidCharset.json !????? mailbox/store/src/test/resources/eml/noAttachment.eml !????? mailbox/store/src/test/resources/eml/charset.eml B mailbox/store/src/test/resources/eml/gimp.png B mailbox/store/src/test/resources/eml/spamMailNoHeaders.json !????? mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithBlankCid.eml B mailbox/store/src/test/resources/eml/htmlMail.json !????? mailbox/store/src/test/resources/eml/embeddedAttachmentWithInline.eml !????? mailbox/store/src/test/resources/eml/oneAttachmentWithoutContentType.eml !????? mailbox/store/src/test/resources/eml/emailWithTextAttachment.eml A mailbox/store/src/test/resources/eml/ديناصور.odt !????? mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml !????? mailbox/store/src/test/resources/eml/calendar.eml !????? mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithEmptyCid.eml !????? mailbox/store/src/test/resources/eml/charset2.eml !????? mailbox/store/src/test/resources/eml/nonTextual.eml AL mailbox/store/src/test/resources/documents/html-iso-8859-1.html !????? mailbox/store/src/test/resources/documents/writter.docx B mailbox/store/src/test/resources/documents/simple-text-iso-8859-1.txt !????? mailbox/store/src/test/resources/documents/Text.txt AL mailbox/store/src/test/resources/documents/html.txt AL mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxReactorUtilsTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageManagerTestSystem.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxMessageResultImplTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/CombinationManagerTestSystem.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java !????? mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/FetchGroupConverterTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProviderTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssert.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageAssert.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/PropertyBuilderTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/MessageParserImplTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/FlagsFactoryTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssertTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DefaultMessageIdTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/PropertyTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssert.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/FlagsFilterTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageUidProvider.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssert.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/SubjectTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MimeMessageIdTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessagePropertiesAssert.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMessageAssertTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/ThreadIdGuessingAlgorithmContract.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/PreDeletionHooksTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/SystemMailboxesProviderImplTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/ResultUtilsTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/BatchSizesTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/PartContentBuilderComplexMultipartTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/streaming/CountingInputStreamTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/comparator/SentDateComparatorTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilsMultipartMixedTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilsTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndexContract.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/mime/HeaderCollectionTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/mime/FieldImpl.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/mime/EMailerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/mime/EMailersTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/mime/SubjectsTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/mime/MimePartTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/SearchUtilsRFC822Test.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndexTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/PartContentBuilderMultipartAlternativeTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/FlagsUpdateCalculatorTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreRightManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/JVMMailboxPathLockerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreAttachmentManagerTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/extractor/JsoupTextExtractorTest.java AL mailbox/store/src/test/java/org/apache/james/mailbox/store/extractor/DefaultTextExtractorTest.java AL mailbox/store/src/reporting-site/site.xml AL mailbox/store/pom.xml AL mailbox/lucene/src/main/resources/META-INF/spring/mailbox-index-lucene.xml AL mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/DocumentFieldConstants.java AL mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java AL mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneSearchHighlighter.java AL mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/UpperCaseFilter.java AL mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneIndexableDocument.java AL mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LenientImapSearchAnalyzer.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageFlagSearchTest.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMemorySearchHighLighterTest.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneTestsUtils.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneFSSearchHighLighterTest.java AL mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneGenericTests.java AL mailbox/lucene/src/reporting-site/site.xml AL mailbox/lucene/pom.xml AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMailboxAggregateModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMessageManager.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresThreadIdGuessingAlgorithm.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/UnsupportAttachmentContentLoader.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxMemberDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/MessageRepresentation.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAOUtils.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxAnnotationDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresAttachmentDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresThreadModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMessageDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresThreadDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageFetchStrategy.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMailbox.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresUidProvider.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageRetriever.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/eventsourcing/acl/ACLModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresModSeqProvider.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/MailboxDeleteDuringUpdateException.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresACLUpsertException.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentBlobReferenceSource.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/dto/AttachmentsDTO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageIdMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMessageBlobReferenceSource.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxMemberModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/PostgresCurrentQuotaManager.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManager.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMailboxManager.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/search/UidSearchOverride.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/search/UnseenSearchOverride.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/search/AllSearchOverride.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/search/DeletedSearchOverride.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/search/DeletedWithRangeSearchOverride.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/search/NotDeletedWithRangeSearchOverride.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMailboxSessionMapperFactory.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/user/PostgresSubscriptionMapper.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/user/PostgresSubscriptionModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/user/PostgresSubscriptionDAO.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMailboxId.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMailboxAnnotationModule.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/PostgresMessageId.java AL mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/DeleteMessageListener.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerProvider.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresSubscriptionManagerTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresCombinationManagerTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/RLSSupportPostgresMailboxMapperACLTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapperRowLevelSecurityTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapperRowLevelSecurityTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxMapperTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresUidProviderTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/dao/PostgresMailboxMessageDAOTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/task/PostgresRecomputeCurrentQuotasServiceTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxMapperRowLevelSecurityTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentBlobReferenceSourceTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMapperProvider.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresModSeqProviderTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMapperTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMailboxMapperACLTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageBlobReferenceSourceTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageIdMapperTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresMessageMoveTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAttachmentMapperTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/mail/PostgresAnnotationMapperTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMessageIdManagerQuotaTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresCombinationManagerTestSystem.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresThreadIdGuessingAlgorithmTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMessageIdManagerTestSystem.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/PostgresCurrentQuotaManagerTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManagerTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMessageIdManagerSideEffectTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/DeletedSearchOverrideTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/DeletedWithRangeSearchOverrideTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/UnseenSearchOverrideTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/UidSearchOverrideTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/NotDeletedWithRangeSearchOverrideTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/SearchOverrideFixture.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/search/AllSearchOverrideTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresTestSystemFixture.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMessageIdManagerStorageTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/user/PostgresSubscriptionMapperTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/user/PostgresSubscriptionMapperRowLevelSecurityTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerContract.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerAttachmentTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/DeleteMessageListenerWithRLSTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerTest.java AL mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/PostgresMailboxManagerStressTest.java AL mailbox/postgres/pom.xml B mailbox/cassandra/doc/table_structure.png !????? mailbox/cassandra/doc/README.md !????? mailbox/cassandra/doc/table_structure.drawio AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/json/MailboxACLJsonConverter.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentation.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTask.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxFlagInconsistencyTask.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesService.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTask.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTask.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RunningOptionsDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesService.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxFlagInconsistenciesService.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersService.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskAdditionalInformationDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskAdditionalInformationDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/ConflictingEntry.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskAdditionalInformationDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxFlagInconsistenciesTaskDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxFlagInconsistenciesTaskAdditionalInformationDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskDTO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MessageInconsistenciesEntry.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/AttachmentBlobReferenceSource.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageBlobReferenceSource.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/ACLMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/FlagsExtractor.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoader.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/SetACLCommand.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/ACLModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/AclV2DAOSubscriber.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/DeleteMailboxCommand.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/UserRightsDAOSubscriber.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/MailboxACLAggregate.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/UpdateACLCommand.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MailboxDeleteDuringUpdateException.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentsDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/ThreadTablePartitionKey.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV3DAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMetadata.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResult.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIdAndPath.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLDAOV2.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadLookupDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAO.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageId.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/ids/CassandraId.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxRecentsTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraThreadLookupTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/MessageIdToImapUid.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageModseqTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLV2Table.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageUidTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIds.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxCountersTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAnnotationTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMaxQuota.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMailboxPathV3Table.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/Flag.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageV3Table.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDomainMaxQuota.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentV2Table.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraFirstUnseenTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraDeletedMessageTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraACLTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraUserMailboxRightsTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraGlobalMaxQuota.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraApplicableFlagTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraSubscriptionTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraMessageIdTable.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraApplicableFlagsModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraFirstUnseenModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxCounterModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraDeletedMessageModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraUidModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraModSeqModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraSubscriptionModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAnnotationModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAclModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxRecentsModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMessageModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraThreadModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraThreadIdGuessingAlgorithm.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigration.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraPerUserMaxQuotaManagerMigration.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeMaxQuotaManager.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV1.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/search/UidSearchOverride.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/search/UnseenSearchOverride.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/search/AllSearchOverride.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/search/DeletedSearchOverride.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/search/DeletedWithRangeSearchOverride.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/search/NotDeletedWithRangeSearchOverride.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/GhostMailbox.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListener.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java AL mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java B mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.json B mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.additionalInformation.legacy.json B mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.legacy.json B mailbox/cassandra/src/test/resources/json/solveMessageInconsistencies.task.json B mailbox/cassandra/src/test/resources/shattered-2.pdf !????? mailbox/cassandra/src/test/resources/cassandra-driver.conf B mailbox/cassandra/src/test/resources/shattered-1.pdf AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/json/MailboxACLJsonConverterTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraThreadLookupDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV3DAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxInconsistenciesPOJOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesServiceTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxFlagInconsistencyTaskSerializationTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesServiceTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxInconsistenciesTaskSerializationTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersTaskSerializationTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMailboxFlagInconsistenciesServiceTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/RecomputeMailboxCountersServiceTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/SolveMessageInconsistenciesTaskSerializationTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperRelaxedConsistencyTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperRelaxedConsistencyTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperContract.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/ACLUpdatedDTOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperV2Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxFixture.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperGenericTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/GuiceUtils.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperNoACLTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraThreadIdGuessingAlgorithmTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTestSystem.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageIdTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraIdTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerMigrationTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV1Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2Test.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/search/DeletedSearchOverrideTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/search/DeletedWithRangeSearchOverrideTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/search/UnseenSearchOverrideTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/search/UidSearchOverrideTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/search/NotDeletedWithRangeSearchOverrideTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/search/AllSearchOverrideTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/TestCassandraMailboxSessionMapperFactory.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/MailboxOperationLoggingListenerTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java AL mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerWithoutAclTest.java AL mailbox/cassandra/src/reporting-site/site.xml AL mailbox/cassandra/pom.xml N mailbox/cassandra/README.txt !????? docs/Dockerfile !????? docs/ui-overrides/partials/header-content.hbs !????? docs/ui-overrides/img/james.svg !????? docs/modules/customization/nav.adoc !????? docs/modules/customization/pages/mail-processing.adoc !????? docs/modules/customization/pages/smtp-hooks.adoc !????? docs/modules/customization/pages/imap.adoc !????? docs/modules/customization/pages/webadmin-routes.adoc !????? docs/modules/customization/pages/mailbox-listeners.adoc !????? docs/modules/customization/pages/index.adoc B docs/modules/customization/assets/images/james-hexagons-extensions.png !????? docs/modules/servers/nav.adoc !????? docs/modules/servers/pages/distributed/architecture/mailqueue_combined_extend.adoc !????? docs/modules/servers/pages/distributed/architecture/consistency_model_data_replication_extend.adoc !????? docs/modules/servers/pages/distributed/architecture/implemented-standards.adoc !????? docs/modules/servers/pages/distributed/architecture/specialized-instances.adoc !????? docs/modules/servers/pages/distributed/architecture/index.adoc !????? docs/modules/servers/pages/distributed/architecture/consistency-model.adoc !????? docs/modules/servers/pages/distributed/extending.adoc !????? docs/modules/servers/pages/distributed/objectives.adoc !????? docs/modules/servers/pages/distributed/operate/metrics.adoc !????? docs/modules/servers/pages/distributed/operate/security.adoc !????? docs/modules/servers/pages/distributed/operate/webadmin/admin-messages-extend.adoc !????? docs/modules/servers/pages/distributed/operate/webadmin/admin-mailboxes-extend.adoc !????? docs/modules/servers/pages/distributed/operate/webadmin/admin-mail-queues-extend.adoc !????? docs/modules/servers/pages/distributed/operate/migrating.adoc !????? docs/modules/servers/pages/distributed/operate/logging/docker-compose-block.adoc !????? docs/modules/servers/pages/distributed/operate/guide.adoc !????? docs/modules/servers/pages/distributed/operate/performanceChecklist.adoc !????? docs/modules/servers/pages/distributed/operate/webadmin.adoc !????? docs/modules/servers/pages/distributed/operate/logging.adoc !????? docs/modules/servers/pages/distributed/operate/index.adoc !????? docs/modules/servers/pages/distributed/operate/cassandra-migration.adoc !????? docs/modules/servers/pages/distributed/operate/cli.adoc !????? docs/modules/servers/pages/distributed/benchmark/benchmark_prepare.adoc !????? docs/modules/servers/pages/distributed/benchmark/db-benchmark.adoc !????? docs/modules/servers/pages/distributed/benchmark/james-benchmark.adoc !????? docs/modules/servers/pages/distributed/benchmark/provision.sh !????? docs/modules/servers/pages/distributed/benchmark/index.adoc !????? docs/modules/servers/pages/distributed/index.adoc !????? docs/modules/servers/pages/distributed/run/k8s-secrets.adoc !????? docs/modules/servers/pages/distributed/run/k8s-logsMetrics.adoc !????? docs/modules/servers/pages/distributed/run/run-docker.adoc !????? docs/modules/servers/pages/distributed/run/run-kubernetes.adoc !????? docs/modules/servers/pages/distributed/run/k8s-values.adoc !????? docs/modules/servers/pages/distributed/run/index.adoc !????? docs/modules/servers/pages/distributed/run/run-java.adoc !????? docs/modules/servers/pages/distributed/run/k8s-checklist.adoc !????? docs/modules/servers/pages/distributed/configure/collecting-events.adoc !????? docs/modules/servers/pages/distributed/configure/matchers.adoc !????? docs/modules/servers/pages/distributed/configure/mailets.adoc !????? docs/modules/servers/pages/distributed/configure/batchsizes.adoc !????? docs/modules/servers/pages/distributed/configure/smtp-hooks.adoc !????? docs/modules/servers/pages/distributed/configure/domainlist.adoc !????? docs/modules/servers/pages/distributed/configure/queue.adoc !????? docs/modules/servers/pages/distributed/configure/dsn.adoc !????? docs/modules/servers/pages/distributed/configure/jmx.adoc !????? docs/modules/servers/pages/distributed/configure/cassandra.adoc !????? docs/modules/servers/pages/distributed/configure/tika.adoc !????? docs/modules/servers/pages/distributed/configure/jvm.adoc !????? docs/modules/servers/pages/distributed/configure/jmap.adoc !????? docs/modules/servers/pages/distributed/configure/mailrepositorystore.adoc !????? docs/modules/servers/pages/distributed/configure/collecting-contacts.adoc !????? docs/modules/servers/pages/distributed/configure/droplists.adoc !????? docs/modules/servers/pages/distributed/configure/search.adoc !????? docs/modules/servers/pages/distributed/configure/blobstore.adoc !????? docs/modules/servers/pages/distributed/configure/extensions.adoc !????? docs/modules/servers/pages/distributed/configure/sieve.adoc !????? docs/modules/servers/pages/distributed/configure/listeners.adoc !????? docs/modules/servers/pages/distributed/configure/vault.adoc !????? docs/modules/servers/pages/distributed/configure/imap.adoc !????? docs/modules/servers/pages/distributed/configure/ssl.adoc !????? docs/modules/servers/pages/distributed/configure/smtp.adoc !????? docs/modules/servers/pages/distributed/configure/mailetcontainer.adoc !????? docs/modules/servers/pages/distributed/configure/webadmin.adoc !????? docs/modules/servers/pages/distributed/configure/recipientrewritetable.adoc !????? docs/modules/servers/pages/distributed/configure/rabbitmq.adoc !????? docs/modules/servers/pages/distributed/configure/spam.adoc !????? docs/modules/servers/pages/distributed/configure/remote-delivery-error-handling.adoc !????? docs/modules/servers/pages/distributed/configure/index.adoc !????? docs/modules/servers/pages/distributed/configure/dns.adoc !????? docs/modules/servers/pages/distributed/configure/redis.adoc !????? docs/modules/servers/pages/distributed/configure/healthcheck.adoc !????? docs/modules/servers/pages/distributed/configure/usersrepository.adoc !????? docs/modules/servers/pages/distributed/configure/opensearch.adoc !????? docs/modules/servers/pages/distributed/configure/pop3.adoc !????? docs/modules/servers/pages/5-minute-demo.adoc !????? docs/modules/servers/pages/15-minute-demo.adoc !????? docs/modules/servers/pages/test.adoc !????? docs/modules/servers/pages/demo.adoc !????? docs/modules/servers/pages/basic/context.adoc !????? docs/modules/servers/pages/basic/objectives.adoc !????? docs/modules/servers/pages/basic/conf/index.adoc !????? docs/modules/servers/pages/basic/help.adoc !????? docs/modules/servers/pages/basic/concepts.adoc !????? docs/modules/servers/pages/basic/architecture.adoc !????? docs/modules/servers/pages/basic/index.adoc !????? docs/modules/servers/pages/basic/self-hosting.notes !????? docs/modules/servers/pages/run.adoc !????? docs/modules/servers/pages/index.adoc !????? docs/modules/servers/pages/postgres/architecture/mailqueue_combined_extend.adoc !????? docs/modules/servers/pages/postgres/architecture/consistency_model_data_replication_extend.adoc !????? docs/modules/servers/pages/postgres/architecture/implemented-standards.adoc !????? docs/modules/servers/pages/postgres/architecture/specialized-instances.adoc !????? docs/modules/servers/pages/postgres/architecture/index.adoc !????? docs/modules/servers/pages/postgres/architecture/consistency-model.adoc !????? docs/modules/servers/pages/postgres/extending.adoc !????? docs/modules/servers/pages/postgres/objectives.adoc !????? docs/modules/servers/pages/postgres/operate/metrics.adoc !????? docs/modules/servers/pages/postgres/operate/security.adoc !????? docs/modules/servers/pages/postgres/operate/webadmin/admin-messages-extend.adoc !????? docs/modules/servers/pages/postgres/operate/webadmin/admin-mailboxes-extend.adoc !????? docs/modules/servers/pages/postgres/operate/webadmin/admin-mail-queues-extend.adoc !????? docs/modules/servers/pages/postgres/operate/migrating.adoc !????? docs/modules/servers/pages/postgres/operate/logging/docker-compose-block.adoc !????? docs/modules/servers/pages/postgres/operate/guide.adoc !????? docs/modules/servers/pages/postgres/operate/performanceChecklist.adoc !????? docs/modules/servers/pages/postgres/operate/webadmin.adoc !????? docs/modules/servers/pages/postgres/operate/logging.adoc !????? docs/modules/servers/pages/postgres/operate/index.adoc !????? docs/modules/servers/pages/postgres/operate/cli.adoc !????? docs/modules/servers/pages/postgres/benchmark/benchmark_prepare.adoc !????? docs/modules/servers/pages/postgres/benchmark/db-benchmark.adoc !????? docs/modules/servers/pages/postgres/benchmark/james-benchmark.adoc !????? docs/modules/servers/pages/postgres/benchmark/index.adoc !????? docs/modules/servers/pages/postgres/index.adoc !????? docs/modules/servers/pages/postgres/extending/index.adoc !????? docs/modules/servers/pages/postgres/run/run-docker.adoc !????? docs/modules/servers/pages/postgres/run/index.adoc !????? docs/modules/servers/pages/postgres/run/run-java.adoc !????? docs/modules/servers/pages/postgres/configure/collecting-events.adoc !????? docs/modules/servers/pages/postgres/configure/matchers.adoc !????? docs/modules/servers/pages/postgres/configure/mailets.adoc !????? docs/modules/servers/pages/postgres/configure/batchsizes.adoc !????? docs/modules/servers/pages/postgres/configure/smtp-hooks.adoc !????? docs/modules/servers/pages/postgres/configure/domainlist.adoc !????? docs/modules/servers/pages/postgres/configure/queue.adoc !????? docs/modules/servers/pages/postgres/configure/dsn.adoc !????? docs/modules/servers/pages/postgres/configure/jmx.adoc !????? docs/modules/servers/pages/postgres/configure/tika.adoc !????? docs/modules/servers/pages/postgres/configure/jvm.adoc !????? docs/modules/servers/pages/postgres/configure/jmap.adoc !????? docs/modules/servers/pages/postgres/configure/mailrepositorystore.adoc !????? docs/modules/servers/pages/postgres/configure/collecting-contacts.adoc !????? docs/modules/servers/pages/postgres/configure/droplists.adoc !????? docs/modules/servers/pages/postgres/configure/search.adoc !????? docs/modules/servers/pages/postgres/configure/blobstore.adoc !????? docs/modules/servers/pages/postgres/configure/extensions.adoc !????? docs/modules/servers/pages/postgres/configure/sieve.adoc !????? docs/modules/servers/pages/postgres/configure/listeners.adoc !????? docs/modules/servers/pages/postgres/configure/vault.adoc !????? docs/modules/servers/pages/postgres/configure/imap.adoc !????? docs/modules/servers/pages/postgres/configure/ssl.adoc !????? docs/modules/servers/pages/postgres/configure/smtp.adoc !????? docs/modules/servers/pages/postgres/configure/mailetcontainer.adoc !????? docs/modules/servers/pages/postgres/configure/webadmin.adoc !????? docs/modules/servers/pages/postgres/configure/recipientrewritetable.adoc !????? docs/modules/servers/pages/postgres/configure/rabbitmq.adoc !????? docs/modules/servers/pages/postgres/configure/spam.adoc !????? docs/modules/servers/pages/postgres/configure/remote-delivery-error-handling.adoc !????? docs/modules/servers/pages/postgres/configure/index.adoc !????? docs/modules/servers/pages/postgres/configure/dns.adoc !????? docs/modules/servers/pages/postgres/configure/redis.adoc !????? docs/modules/servers/pages/postgres/configure/healthcheck.adoc !????? docs/modules/servers/pages/postgres/configure/usersrepository.adoc !????? docs/modules/servers/pages/postgres/configure/opensearch.adoc !????? docs/modules/servers/pages/postgres/configure/pop3.adoc !????? docs/modules/servers/partials/architecture/implemented-standards.adoc !????? docs/modules/servers/partials/architecture/specialized-instances.adoc !????? docs/modules/servers/partials/architecture/index.adoc !????? docs/modules/servers/partials/architecture/consistency-model.adoc !????? docs/modules/servers/partials/IsOverQuota.adoc !????? docs/modules/servers/partials/HasHeaderWithPrefix.adoc !????? docs/modules/servers/partials/ManageSieveMailet.adoc !????? docs/modules/servers/partials/AddFooter.adoc !????? docs/modules/servers/partials/FileRegexMatcher.adoc !????? docs/modules/servers/partials/AtMostPriority.adoc !????? docs/modules/servers/partials/RecipientToLowerCase.adoc !????? docs/modules/servers/partials/MailToAllUsers.adoc !????? docs/modules/servers/partials/Expires.adoc !????? docs/modules/servers/partials/AmqpForwardAttribute.adoc !????? docs/modules/servers/partials/LogMessage.adoc !????? docs/modules/servers/partials/ClamAVScan.adoc !????? docs/modules/servers/partials/MailAttributesToMimeHeaders.adoc !????? docs/modules/servers/partials/RemoveMimeHeader.adoc !????? docs/modules/servers/partials/SenderIsNull.adoc !????? docs/modules/servers/partials/SerialiseToHTTP.adoc !????? docs/modules/servers/partials/ClassifyBounce.adoc !????? docs/modules/servers/partials/IsSMIMESigned.adoc !????? docs/modules/servers/partials/SubjectIs.adoc !????? docs/modules/servers/partials/ToPlainText.adoc !????? docs/modules/servers/partials/WithStorageDirective.adoc !????? docs/modules/servers/partials/IsSMIMEEncrypted.adoc !????? docs/modules/servers/partials/AtMost.adoc !????? docs/modules/servers/partials/ExtractMDNOriginalJMAPMessageId.adoc !????? docs/modules/servers/partials/RecipientRewriteTable.adoc !????? docs/modules/servers/partials/RecipientIsLocal.adoc !????? docs/modules/servers/partials/RemoveMimeHeaderByPrefix.adoc !????? docs/modules/servers/partials/ConvertTo7Bit.adoc !????? docs/modules/servers/partials/HostIs.adoc !????? docs/modules/servers/partials/UserIs.adoc !????? docs/modules/servers/partials/XOriginatingIpInNetwork.adoc !????? docs/modules/servers/partials/ICalendarParser.adoc !????? docs/modules/servers/partials/HasPriority.adoc !????? docs/modules/servers/partials/LocalDelivery.adoc !????? docs/modules/servers/partials/NESSpamCheck.adoc !????? docs/modules/servers/partials/SPF.adoc !????? docs/modules/servers/partials/TextCalendarBodyToAttachment.adoc !????? docs/modules/servers/partials/WithPriority.adoc !????? docs/modules/servers/partials/SpamAssassin.adoc !????? docs/modules/servers/partials/Forward.adoc !????? docs/modules/servers/partials/RecipientDomainIs.adoc !????? docs/modules/servers/partials/SMTPIsAuthNetwork.adoc !????? docs/modules/servers/partials/HasMailAttributeWithValueRegex.adoc !????? docs/modules/servers/partials/ReplaceContent.adoc !????? docs/modules/servers/partials/RemoteAddrInNetwork.adoc !????? docs/modules/servers/partials/NotifyPostmaster.adoc !????? docs/modules/servers/partials/HeadersToHTTP.adoc !????? docs/modules/servers/partials/CommandForListserv.adoc !????? docs/modules/servers/partials/RandomStoring.adoc !????? docs/modules/servers/partials/PostmasterAlias.adoc !????? docs/modules/servers/partials/SMIMECheckSignature.adoc !????? docs/modules/servers/partials/RecoverAttachment.adoc !????? docs/modules/servers/partials/StripAttachment.adoc !????? docs/modules/servers/partials/SubAddressing.adoc !????? docs/modules/servers/partials/DKIMSign.adoc !????? docs/modules/servers/partials/TooManyRecipients.adoc !????? docs/modules/servers/partials/SplitMail.adoc !????? docs/modules/servers/partials/RemoveAllMailAttributes.adoc !????? docs/modules/servers/partials/ICALToHeader.adoc !????? docs/modules/servers/partials/HasMimeTypeAnySubPart.adoc !????? docs/modules/servers/partials/AttachmentFileNameIs.adoc !????? docs/modules/servers/partials/MimeDecodingMailet.adoc !????? docs/modules/servers/partials/IsX509CertificateSubject.adoc !????? docs/modules/servers/partials/Bounce.adoc !????? docs/modules/servers/partials/RecipientCountExceeds.adoc !????? docs/modules/servers/partials/WrapText.adoc !????? docs/modules/servers/partials/DKIMVerify.adoc !????? docs/modules/servers/partials/IsSenderInRRTLoop.adoc !????? docs/modules/servers/partials/SetMimeHeader.adoc !????? docs/modules/servers/partials/Redirect.adoc !????? docs/modules/servers/partials/RelayLimit.adoc !????? docs/modules/servers/partials/DeconnectionRight.adoc !????? docs/modules/servers/partials/ICALToJsonAttribute.adoc !????? docs/modules/servers/partials/SenderIs.adoc !????? docs/modules/servers/partials/TooManyLines.adoc !????? docs/modules/servers/partials/IsSingleRecipient.adoc !????? docs/modules/servers/partials/ToRepository.adoc !????? docs/modules/servers/partials/SenderInFakeDomain.adoc !????? docs/modules/servers/partials/Null.adoc !????? docs/modules/servers/partials/IsRemoteDeliveryPermanentError.adoc !????? docs/modules/servers/partials/RemoteDelivery.adoc !????? docs/modules/servers/partials/ServerTime.adoc !????? docs/modules/servers/partials/AddSubjectPrefix.adoc !????? docs/modules/servers/partials/RemoveMailAttribute.adoc !????? docs/modules/servers/partials/Resend.adoc !????? docs/modules/servers/partials/HasException.adoc !????? docs/modules/servers/partials/UnwrapText.adoc !????? docs/modules/servers/partials/ToSenderDomainRepository.adoc !????? docs/modules/servers/partials/VacationMailet.adoc !????? docs/modules/servers/partials/HasAttachment.adoc !????? docs/modules/servers/partials/operate/metrics.adoc !????? docs/modules/servers/partials/operate/security.adoc !????? docs/modules/servers/partials/operate/migrating.adoc !????? docs/modules/servers/partials/operate/guide.adoc !????? docs/modules/servers/partials/operate/performanceChecklist.adoc !????? docs/modules/servers/partials/operate/webadmin.adoc !????? docs/modules/servers/partials/operate/logging.adoc !????? docs/modules/servers/partials/operate/index.adoc !????? docs/modules/servers/partials/operate/cli.adoc !????? docs/modules/servers/partials/All.adoc !????? docs/modules/servers/partials/benchmark/db-benchmark.adoc !????? docs/modules/servers/partials/benchmark/james-benchmark.adoc !????? docs/modules/servers/partials/benchmark/index.adoc !????? docs/modules/servers/partials/CommandListservMatcher.adoc !????? docs/modules/servers/partials/Sieve.adoc !????? docs/modules/servers/partials/ToProcessor.adoc !????? docs/modules/servers/partials/MailAttributesListToMimeHeaders.adoc !????? docs/modules/servers/partials/FetchedFrom.adoc !????? docs/modules/servers/partials/HostIsLocal.adoc !????? docs/modules/servers/partials/SetMailAttribute.adoc !????? docs/modules/servers/partials/HasMimeTypeParameter.adoc !????? docs/modules/servers/partials/RemoteAddrNotInNetwork.adoc !????? docs/modules/servers/partials/AtLeastPriority.adoc !????? docs/modules/servers/partials/ContactExtractor.adoc !????? docs/modules/servers/partials/Sign.adoc !????? docs/modules/servers/partials/HasMailAttributeWithValue.adoc !????? docs/modules/servers/partials/DSNBounce.adoc !????? docs/modules/servers/partials/RemoteDeliveryFailedWithSMTPCode.adoc !????? docs/modules/servers/partials/FoldLongLines.adoc !????? docs/modules/servers/partials/HasMailAttribute.adoc !????? docs/modules/servers/partials/ToSenderFolder.adoc !????? docs/modules/servers/partials/SenderHostIsLocal.adoc !????? docs/modules/servers/partials/CompareNumericHeaderValue.adoc !????? docs/modules/servers/partials/RecipientIsRegex.adoc !????? docs/modules/servers/partials/NotifySender.adoc !????? docs/modules/servers/partials/LDAPMatchers.adoc !????? docs/modules/servers/partials/SMIMESign.adoc !????? docs/modules/servers/partials/SubjectStartsWith.adoc !????? docs/modules/servers/partials/SenderDomainIs.adoc !????? docs/modules/servers/partials/IsRemoteDeliveryTemporaryError.adoc !????? docs/modules/servers/partials/SentByMailet.adoc !????? docs/modules/servers/partials/DLP.adoc !????? docs/modules/servers/partials/SenderIsLocal.adoc !????? docs/modules/servers/partials/RecipientIs.adoc !????? docs/modules/servers/partials/FromRepository.adoc !????? docs/modules/servers/partials/InSpammerBlacklist.adoc !????? docs/modules/servers/partials/SenderHostIs.adoc !????? docs/modules/servers/partials/IsMarkedAsSpam.adoc !????? docs/modules/servers/partials/SMTPAuthSuccessful.adoc !????? docs/modules/servers/partials/HasHeader.adoc !????? docs/modules/servers/partials/HasMimeType.adoc !????? docs/modules/servers/partials/OnlyText.adoc !????? docs/modules/servers/partials/UseHeaderRecipients.adoc !????? docs/modules/servers/partials/SentByJmap.adoc !????? docs/modules/servers/partials/ICSSanitizer.adoc !????? docs/modules/servers/partials/SenderIsRegex.adoc !????? docs/modules/servers/partials/configure/forProtocolsPartial.adoc !????? docs/modules/servers/partials/configure/collecting-events.adoc !????? docs/modules/servers/partials/configure/matchers.adoc !????? docs/modules/servers/partials/configure/mailets.adoc !????? docs/modules/servers/partials/configure/batchsizes.adoc !????? docs/modules/servers/partials/configure/forStorageDependenciesPartial.adoc !????? docs/modules/servers/partials/configure/smtp-hooks.adoc !????? docs/modules/servers/partials/configure/domainlist.adoc !????? docs/modules/servers/partials/configure/queue.adoc !????? docs/modules/servers/partials/configure/dsn.adoc !????? docs/modules/servers/partials/configure/jmx.adoc !????? docs/modules/servers/partials/configure/tika.adoc !????? docs/modules/servers/partials/configure/jvm.adoc !????? docs/modules/servers/partials/configure/jmap.adoc !????? docs/modules/servers/partials/configure/mailrepositorystore.adoc !????? docs/modules/servers/partials/configure/collecting-contacts.adoc !????? docs/modules/servers/partials/configure/droplists.adoc !????? docs/modules/servers/partials/configure/search.adoc !????? docs/modules/servers/partials/configure/blobstore.adoc !????? docs/modules/servers/partials/configure/forCoreComponentsPartial.adoc !????? docs/modules/servers/partials/configure/extensions.adoc !????? docs/modules/servers/partials/configure/sieve.adoc !????? docs/modules/servers/partials/configure/listeners.adoc !????? docs/modules/servers/partials/configure/vault.adoc !????? docs/modules/servers/partials/configure/imap.adoc !????? docs/modules/servers/partials/configure/ssl.adoc !????? docs/modules/servers/partials/configure/systemPropertiesPartial.adoc !????? docs/modules/servers/partials/configure/smtp.adoc !????? docs/modules/servers/partials/configure/mailetcontainer.adoc !????? docs/modules/servers/partials/configure/webadmin.adoc !????? docs/modules/servers/partials/configure/recipientrewritetable.adoc !????? docs/modules/servers/partials/configure/rabbitmq.adoc !????? docs/modules/servers/partials/configure/spam.adoc !????? docs/modules/servers/partials/configure/remote-delivery-error-handling.adoc !????? docs/modules/servers/partials/configure/forExtensionsPartial.adoc !????? docs/modules/servers/partials/configure/dns.adoc !????? docs/modules/servers/partials/configure/redis.adoc !????? docs/modules/servers/partials/configure/healthcheck.adoc !????? docs/modules/servers/partials/configure/usersrepository.adoc !????? docs/modules/servers/partials/configure/opensearch.adoc !????? docs/modules/servers/partials/configure/pop3.adoc !????? docs/modules/servers/partials/MetricsMailet.adoc !????? docs/modules/servers/partials/PartHasContentType.adoc !????? docs/modules/servers/partials/SMTPAuthUserIs.adoc !????? docs/modules/servers/partials/AddDeliveredToHeader.adoc !????? docs/modules/servers/partials/SMIMEDecrypt.adoc !????? docs/modules/servers/partials/SizeGreaterThan.adoc !????? docs/modules/servers/assets/images/storage_james_postgres.svg B docs/modules/servers/assets/images/server-components.png B docs/modules/servers/assets/images/specialized-instances-postgres.png B docs/modules/servers/assets/images/james-imap-base-performance-postgres.png B docs/modules/servers/assets/images/IMAP_board.png B docs/modules/servers/assets/images/cassandra_stress_test_result_2.png B docs/modules/servers/assets/images/postgres_pg_stat_statements.png B docs/modules/servers/assets/images/apache-james-lens.png B docs/modules/servers/assets/images/webAdmin.png B docs/modules/servers/assets/images/cassandra_stress_test_result_1.png B docs/modules/servers/assets/images/BlobStore.png B docs/modules/servers/assets/images/storage_james_distributed.png B docs/modules/servers/assets/images/remote-delivery-error-handling.png B docs/modules/servers/assets/images/specialized-instances-distributed.png B docs/modules/servers/assets/images/MATCHER.png B docs/modules/servers/assets/images/storage_james_postgres.png B docs/modules/servers/assets/images/JMAP_board.png B docs/modules/servers/assets/images/james-imap-base-performance-distributed.png B docs/modules/servers/assets/images/preload-dashboards.png B docs/modules/servers/assets/images/JVM_board.png !????? docs/modules/concepts/nav.adoc !????? docs/modules/concepts/pages/configuration.adoc !????? docs/modules/concepts/pages/mail/index.adoc !????? docs/modules/concepts/pages/storage/mailbox.adoc !????? docs/modules/concepts/pages/storage/users.adoc !????? docs/modules/concepts/pages/storage/index.adoc !????? docs/modules/concepts/pages/messages/mime.adoc !????? docs/modules/concepts/pages/messages/imf.adoc !????? docs/modules/concepts/pages/messages/index.adoc !????? docs/modules/concepts/pages/protocols/jmap.adoc !????? docs/modules/concepts/pages/protocols/imap.adoc !????? docs/modules/concepts/pages/protocols/smtp.adoc !????? docs/modules/concepts/pages/protocols/index.adoc !????? docs/modules/concepts/pages/protocols/pop.adoc !????? docs/modules/concepts/pages/protocols/esmtp.adoc !????? docs/modules/concepts/pages/protocols/lmtp.adoc !????? docs/modules/concepts/pages/user/index.adoc !????? docs/modules/concepts/pages/processing/index.adoc !????? docs/modules/concepts/pages/glossary.adoc !????? docs/modules/concepts/pages/index.adoc !????? docs/modules/ROOT/nav.adoc !????? docs/modules/ROOT/pages/index.adoc !????? docs/modules/development/nav.adoc !????? docs/modules/development/pages/deployment-tests.adoc !????? docs/modules/development/pages/logging.adoc !????? docs/modules/development/pages/index.adoc !????? docs/modules/community/nav.adoc !????? docs/modules/community/pages/support.adoc !????? docs/modules/community/pages/website.adoc !????? docs/modules/community/pages/guidelines.adoc !????? docs/modules/community/pages/download.adoc !????? docs/modules/community/pages/mailing-lists.adoc !????? docs/modules/community/pages/release.adoc !????? docs/modules/community/pages/index.adoc !????? docs/modules/community/pages/contributing.adoc B docs/modules/community/images/linagora.png !????? docs/README.md !????? docs/antora-playbook-local.yml !????? docs/antora.yml N LICENSE AL checkstyle-suppressions.xml !????? testing/base/src/main/resources/logback-test.xml !????? testing/base/src/main/resources/testcontainers.properties AL testing/base/src/main/java/org/apache/james/junit/categories/Unstable.java AL testing/base/pom.xml AL Jenkinsfile ***************************************************** Printing headers for text files without a valid license header... ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_session_fixation.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com S: 250.* S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250-8BITMIME S: 250 STARTTLS C: AUTH LOGIN S: 334 VXNlcm5hbWU6 C: Ym9iQG15ZG9tYWluLnRsZA== S: 334 UGFzc3dvcmQ6 C: c2VjcmV0 S: 235 Authentication Successful C: mail from:<bob@mydomain.tld> C: rcpt to:<matthieu@yopmail.com> S: 250 2.1.0 Sender <bob@mydomain.tld> OK S: 250 2.1.5 Recipient <matthieu@yopmail.com> OK C: starttls S: 501 .* ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/rcpt_with_starttls.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com C: mail from:<matthieu@yopmail.com> C: rcpt to:<starttls@mydomain.tld> C: data S: 250.* S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250-8BITMIME S: 250 STARTTLS S: 250 2.1.0 Sender <matthieu@yopmail.com> OK S: 250 2.1.5 Recipient <starttls@mydomain.tld> OK S: 354 Ok Send data ending with <CRLF>.<CRLF> C: subject: test C: C: content content C: . S: 250 2.6.0 Message received ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/authplain.test ===================================================== S: 220 mydomain.tld smtp C: AUTH LOGIN S: 334 VXNlcm5hbWU6 C: Ym9iQG15ZG9tYWluLnRsZA== S: 334 UGFzc3dvcmQ6 C: c2VjcmV0 S: 235 Authentication Successful ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/data_with_starttls.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com C: mail from:<matthieu@yopmail.com> C: rcpt to:<bob@mydomain.tld> C: data S: 250.* S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250-8BITMIME S: 250 STARTTLS S: 250 2.1.0 Sender <matthieu@yopmail.com> OK S: 250 2.1.5 Recipient <bob@mydomain.tld> OK S: 354 Ok Send data ending with <CRLF>.<CRLF> C: subject: test C: C: content starttls content C: . S: 250 2.6.0 Message received ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls_with_injection.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com S: 250.* S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250-8BITMIME S: 250 STARTTLS C: starttls\r\nmail from:<matthieu@yopmail.com>\r\n S: 451 Unable to process request ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/helo.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com C: mail from:<matthieu@yopmail.com> C: rcpt to:<bob@mydomain.tld> C: data S: 250.* S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250 8BITMIME S: 250 2.1.0 Sender <matthieu@yopmail.com> OK S: 250 2.1.5 Recipient <bob@mydomain.tld> OK S: 354 Ok Send data ending with <CRLF>.<CRLF> C: subject: test C: C: content C: . S: 250 2.6.0 Message received ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/data_starts_with_starttls.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com C: mail from:<matthieu@yopmail.com> C: rcpt to:<bob@mydomain.tld> C: data S: 250.* S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250-8BITMIME S: 250 STARTTLS S: 250 2.1.0 Sender <matthieu@yopmail.com> OK S: 250 2.1.5 Recipient <bob@mydomain.tld> OK S: 354 Ok Send data ending with <CRLF>.<CRLF> C: subject: test C: C: starttls content C: . S: 250 2.6.0 Message received ===================================================== == File: mpt/impl/smtp/core/src/main/resources/org/apache/james/smtp/scripts/starttls.test ===================================================== S: 220 mydomain.tld smtp C: ehlo yopmail.com S: 250.* S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250-PIPELINING S: 250-ENHANCEDSTATUSCODES S: 250-8BITMIME S: 250 STARTTLS C: starttls S: 220 2.0.0 Ready to start TLS ===================================================== == File: mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/ListWithPercentWildcardInMailboxName.test ===================================================== # Test creating and searching mailboxes with literal '*' and '%' characters in their names C: B01 CREATE "star*mailbox" S: B01 OK \[MAILBOXID \(.+\)\] CREATE completed. C: B011 CREATE "starmailbox" S: B011 OK \[MAILBOXID \(.+\)\] CREATE completed. C: B02 CREATE "percent%mailbox" S: B02 OK \[MAILBOXID \(.+\)\] CREATE completed. C: B021 CREATE "percentmailbox" S: B021 OK \[MAILBOXID \(.+\)\] CREATE completed. C: B03 LIST "" "star*mailbox" SUB { S: \* LIST \(\\HasNoChildren\) \"\.\" \"star\*mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"starmailbox\" } S: B03 OK LIST completed. C: B04 LIST "" "percent%mailbox" SUB { S: \* LIST \(\\HasNoChildren\) \"\.\" \"percent%mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"percentmailbox\" } S: B04 OK LIST completed. C: B05 LIST "" % SUB { S: \* LIST \(\\HasNoChildren\) \"\.\" \"star\*mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"starmailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"percent%mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"percentmailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"INBOX\" } S: B05 OK LIST completed. C: B06 LIST "" * SUB { S: \* LIST \(\\HasNoChildren\) \"\.\" \"star\*mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"starmailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"percent%mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"percentmailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"INBOX\" } S: B06 OK LIST completed. C: B07 LIST "" "star*mail%" SUB { S: \* LIST \(\\HasNoChildren\) \"\.\" \"star\*mailbox\" S: \* LIST \(\\HasNoChildren\) \"\.\" \"starmailbox\" } S: B07 OK LIST completed. ===================================================== == File: mpt/impl/imap-mailbox/core/src/main/resources/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="WARN"> <appender-ref ref="CONSOLE" /> </logger> </configuration> ===================================================== == File: mpt/impl/imap-mailbox/cassandra/src/test/resources/cassandra-driver.conf ===================================================== datastax-java-driver { basic.request { timeout = 5 seconds } } ===================================================== == File: upgrade-instructions.md ===================================================== # Upgrade instructions This document covers every changes an Ops needs to be aware of when running James. The following procedures are to take as it, and the Apache Software Foundation, nor its contributors, can not be responsible for any damages generated by following the below procedures. Before performing these operations, you should ensure to have the skills to conduct the operations, and you should read other software documentation. Do not follow this guide blindly! ## Unreleased Note: this section is in progress. It will be updated during all the development process until the release. No changes yet. Changes to apply between 3.8.x and 3.9.0 will be reported here. Change list: - [JAMES-4046 Refactor and update apache-james-mailbox-lucene](#james-4046-refactor-and-update-apache-james-mailbox-lucene) - [Imap Packages](#imap-packages) - [Jmap uploads](#jmap-uploads) - [Mutualize quota table](#mutualize-quota-table) - [Drop Legacy Cassandra migrations](#drop-legacy-cassandra-migrations) - [Improve CassandraThreadIdGuessingAlgorithm](#improve-cassandrathreadidguessingalgorithm) - [Set up TTL on the mailbox_change and email_change tables](#set-up-ttl-on-the-mailboxchange-and-emailchange-tables) - [Change compaction strategy of blob_cache table](#change-compaction-strategy-of-blobcache-table) - [RRT forwards now rewrite senders](#rrt-forwards-now-rewrite-senders) - [Increase RabbitMQ consumer timeout on the task queue](#increase-rabbitmq-consumer-timeout-on-the-task-queue) - [JMX authentication for Spring](#jmx-authentication-for-spring) - [Java 21](#java-21) - [javax -> jakarta](#javax---jakarta) - [Make all queues on RabbitMQ quorum queue when `quorum.queues.enable=true`](#make-all-queues-on-rabbitmq-quorum-queue-when-quorumqueuesenabletrue) - [Migrate RabbitMQ classic queues to version 2](#migrate-rabbitmq-classic-queues-to-version-2) - [JAMES-3946 White list removals](#james-3946-white-list-removals) - [JAMES-4052 Details in quota index](#james-4052-details-in-quota-index) - [JAMES-1409 Change JPARecipientRewriteTable to store separate record per target address](#james-1409-change-jparecipientrewritetable-to-store-separate-record-per-target-address) ### JAMES-1409 Change JPARecipientRewriteTable to store separate record per target address Date: 09/10/2024 JIRA: https://issues.apache.org/jira/browse/JAMES-1409 The JPARecipientRewriteTable was modified to store multiple mappings of a single source as separate database rows, each with a single target address, instead of a single row with a long semicolon-delimited multi-value target address. This solves both the limitation on the number of mappings (imposed by the column maximum length), and the broken query by target address. For JPA users, the database schema update and data migration can be performed as follows: ===================================================== == File: code-coverage-report/pom.xml ===================================================== <?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.james</groupId> <artifactId>james-project</artifactId> <version>3.9.0-SNAPSHOT</version> </parent> <artifactId>code-coverage-report</artifactId> <name>Apache James :: Code Coverage Report</name> <description>Generate code coverage report for Apache James</description> <packaging>pom</packaging> <dependencies> <!-- Parent dependencies are in pom package type, can not directly declare as jar--> <!-- 1. apache-james-mailbox--> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-api</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-cassandra</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-deleted-messages-vault</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-deleted-messages-vault-cassandra</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-event-json</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-jpa</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-lucene</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-memory</artifactId> </dependency> <dependency> ===================================================== == File: CHANGELOG.md ===================================================== # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) ## [unreleased] ### Important changes - Upgrade javax -> jakarta. See releated upgrade instructions. - Upgrade Java 11 -> 21. See related upgrade instructions. ### Removals - JAMES-3946 WhiteList manager removals (#2299) This had been repleaced by the Guice DropList extension. - JAMES-4025 Drop Jmap draft Please use RFC-8621 implementation rather than this outdated draft. - JAMES-4065 drop habeas warrant mark mailet ### Security - [FIX] JMX password auto-detection - [FIX] Enforce CRLF as part of SMTP DATA transaction (#1876) - [FIX] Set up JMX auth for Spring - [FIX] Set up JMX auth filter for Guice - Bump org.apache.commons:commons-configuration2 from 2.9.0 to 2.10.1 (#2147) - [Fix] BouncyCastle 1.70 -> 1.77 (fixes multiple minor CVEs) - [FIX] SMTP stack should recompute relaying rights upon PROXY message (#1933) - JAMES-4032 DKIM SMTP hook (#2264) - JAMES-4034 SMTP submission: validate FROM header (#2246) - JAMES-4041 Fix OOM upon IMAP COPY (#2265) - [UPGRADE] Logback 1.5.12 -> 1.5.15 (#2581) - Bump commons-io to 2.17.0 - [S3 Metrics] Allow to customize S3 metrics prefix ### New Features - JAMES-3942 Audit trail - JAMES-3897 Crowdsec integration for SMTP, IMAP - JAMES-3964 Implement and test disabledCaps for SMTP - JAMES-3962 JMAP Email/set: specific headers for body parts (#1801) - JAMES-3960 Hints to ensure UID/ModSeq consistency in case of disaster - JAMES-3959 Starting distributed James without OpenSearch (#1784) - JAMES-3954 Implement RFC-9394 PARTIAL for IMAP FETCH/SEARCH - JAMES-3944 JMAP FILTER: More features: forward, flag, discard, etc... ===================================================== == File: third-party/rspamd/docker-compose.yml ===================================================== version: '3' services: james: depends_on: rspamd: condition: service_healthy image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - $PWD/target/apache-james-rspamd-jar-with-dependencies.jar:/root/extensions-jars/james-server-rspamd.jar - $PWD/sample-configuration/extensions.properties:/root/conf/extensions.properties - $PWD/sample-configuration/mailetcontainer_memory.xml:/root/conf/mailetcontainer.xml - $PWD/sample-configuration/listeners.xml:/root/conf/listeners.xml - $PWD/sample-configuration/rspamd.properties:/root/conf/rspamd.properties - $PWD/sample-configuration/webadmin.properties:/root/conf/webadmin.properties - $PWD/sample-configuration/healthcheck.properties:/root/conf/healthcheck.properties ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" redis: image: redis:7.2.5 command: - "--loglevel" - "debug" clamav: image: clamav/clamav:1.3 rspamd: depends_on: clamav: condition: service_healthy redis: condition: service_started container_name: rspamd image: rspamd/rspamd:3.9.1 environment: - RSPAMD_PASSWORD=admin ===================================================== == File: third-party/rspamd/src/test/resources/rspamd-config/actions.conf ===================================================== reject = 13.5; # Reject when reaching this score add_header = 6; # Add header when reaching this score greylist = 4; # Apply greylisting when reaching this score (will emit `soft reject action`) ===================================================== == File: third-party/rspamd/src/test/resources/rspamd-config/worker-controller.inc ===================================================== password = "{= env.PASSWORD =}" ===================================================== == File: third-party/rspamd/src/test/resources/rspamd-config/antivirus.conf ===================================================== clamav { # Scan mime_parts seperately - otherwise the complete mail will be transfered to AV Scanner #attachments_only = true; # Before 1.8.1 scan_mime_parts = true; # After 1.8.1 # Scanning Text is suitable for some av scanner databases (e.g. Sanesecurity) scan_text_mime = true; # 1.8.1 + scan_image_mime = true; # 1.8.1 + # If set force this action if any virus is found (default unset: no action is forced) # action = "reject"; message = '${SCANNER}: virus found: "${VIRUS}"'; # If set true, log message is emitted for clean messages log_clean = false; # symbol to add (add it to metric if you want non-zero weight) symbol = CLAM_VIRUS; # type of scanner: "clamav", "fprot", "sophos" or "savapi" type = clamav; servers = "{= env.CLAMAV_SERVERS =}"; patterns { JUST_EICAR = '^Eicar-Test-Signature$'; } } ===================================================== == File: third-party/rspamd/src/test/resources/rspamd-config/redis.conf ===================================================== servers = "{= env.REDIS_SERVERS =}"; ===================================================== == File: third-party/rspamd/src/test/resources/rspamd-config/statistic.conf ===================================================== classifier "bayes" { tokenizer { name = "osb"; } cache { } new_schema = true; # Always use new schema store_tokens = false; # Redefine if storing of tokens is desired signatures = false; # Store learn signatures per_user = true; # Enable per user classifier users_enabled = true; min_tokens = 11; backend = "redis"; min_learns = 2; statfile { symbol = "BAYES_HAM"; spam = false; } statfile { symbol = "BAYES_SPAM"; spam = true; } learn_condition = 'return require("lua_bayes_learn").can_learn'; # Autolearn sample # autolearn { # spam_threshold = 6.0; # When to learn spam (score >= threshold) # ham_threshold = -0.5; # When to learn ham (score <= threshold) # check_balance = true; # Check spam and ham balance # min_balance = 0.9; # Keep diff for spam/ham learns for at least this value #} .include(try=true; priority=1) "$LOCAL_CONFDIR/local.d/classifier-bayes.conf" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/classifier-bayes.conf" } ===================================================== == File: third-party/rspamd/src/test/resources/mail/ham/ham1.eml ===================================================== From Steve_Burt@cursor-system.com Thu Aug 22 12:46:39 2002 Return-Path: <Steve_Burt@cursor-system.com> Delivered-To: zzzz@localhost.netnoteinc.com Received: from localhost (localhost [127.0.0.1]) by phobos.labs.netnoteinc.com (Postfix) with ESMTP id BE12E43C34 for <zzzz@localhost>; Thu, 22 Aug 2002 07:46:38 -0400 (EDT) Received: from phobos [127.0.0.1] by localhost with IMAP (fetchmail-5.9.0) for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:46:38 +0100 (IST) Received: from n20.grp.scd.yahoo.com (n20.grp.scd.yahoo.com [66.218.66.76]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id g7MBkTZ05087 for <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 12:46:29 +0100 X-Egroups-Return: sentto-2242572-52726-1030016790-zzzz=spamassassin.taint.org@returns.groups.yahoo.com Received: from [66.218.67.196] by n20.grp.scd.yahoo.com with NNFMP; 22 Aug 2002 11:46:30 -0000 X-Sender: steve.burt@cursor-system.com X-Apparently-To: zzzzteana@yahoogroups.com Received: (EGP: mail-8_1_0_1); 22 Aug 2002 11:46:29 -0000 Received: (qmail 11764 invoked from network); 22 Aug 2002 11:46:29 -0000 Received: from unknown (66.218.66.217) by m3.grp.scd.yahoo.com with QMQP; 22 Aug 2002 11:46:29 -0000 Received: from unknown (HELO mailgateway.cursor-system.com) (62.189.7.27) by mta2.grp.scd.yahoo.com with SMTP; 22 Aug 2002 11:46:29 -0000 Received: from exchange1.cps.local (unverified) by mailgateway.cursor-system.com (Content Technologies SMTPRS 4.2.10) with ESMTP id <T5cde81f695ac1d100407d@mailgateway.cursor-system.com> for <forteana@yahoogroups.com>; Thu, 22 Aug 2002 13:14:10 +0100 Received: by exchange1.cps.local with Internet Mail Service (5.5.2653.19) id <PXX6AT23>; Thu, 22 Aug 2002 12:46:27 +0100 Message-Id: <5EC2AD6D2314D14FB64BDA287D25D9EF12B4F6@exchange1.cps.local> To: "'zzzzteana@yahoogroups.com'" <zzzzteana@yahoogroups.com> X-Mailer: Internet Mail Service (5.5.2653.19) X-Egroups-From: Steve Burt <steve.burt@cursor-system.com> From: Steve Burt <Steve_Burt@cursor-system.com> X-Yahoo-Profile: pyruse MIME-Version: 1.0 Mailing-List: list zzzzteana@yahoogroups.com; contact forteana-owner@yahoogroups.com Delivered-To: mailing list zzzzteana@yahoogroups.com Precedence: bulk List-Unsubscribe: <mailto:zzzzteana-unsubscribe@yahoogroups.com> Date: Thu, 22 Aug 2002 12:46:18 +0100 Subject: [zzzzteana] RE: Alexander Reply-To: zzzzteana@yahoogroups.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Martin A posted: Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the ===================================================== == File: third-party/rspamd/src/test/resources/mail/attachment/inlineVirusTextAttachment.eml ===================================================== To: me@linagora.com From: Benoit Tellier <me@linagora.com> Subject: Mail with text attachment Message-ID: <befd8cab-9c9c-5537-4e77-937f32326087@any.com> Date: Thu, 13 Oct 2016 10:26:20 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------4FD2D252DB453546C22C25B2" This is a multi-part message in MIME format. --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I'm the body! --------------4FD2D252DB453546C22C25B2 Content-Disposition: inline Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-ID: <id> X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* --------------4FD2D252DB453546C22C25B2-- ===================================================== == File: third-party/rspamd/src/test/resources/mail/attachment/inlineNonVirusTextAttachment.eml ===================================================== To: me@linagora.com From: Benoit Tellier <me@linagora.com> Subject: Mail with text attachment Message-ID: <befd8cab-9c9c-5537-4e77-937f32326087@any.com> Date: Thu, 13 Oct 2016 10:26:20 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------4FD2D252DB453546C22C25B2" This is a multi-part message in MIME format. --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I'm the body! --------------4FD2D252DB453546C22C25B2 Content-Disposition: inline Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-ID: <id> Non virus text --------------4FD2D252DB453546C22C25B2-- ===================================================== == File: third-party/rspamd/src/test/resources/mail/spam/phishing.eml ===================================================== From: support@yourbank.com To: victim@example.com Subject: Urgent: Verify Your Account Date: Thu, 04 Jul 2024 10:00:00 +0000 Message-ID: <0000000000000000000@yourbank.com> MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8 <html> <body> <p>Dear Valued Customer,</p> <p>We regret to inform you that your account has been temporarily suspended due to suspicious activity. To restore your account access, please verify your identity by clicking on the link below:</p> <p><a href="http://evil.yourbankk.com">yourbank.com</a></p> <p>Failure to verify your account within 24 hours will result in permanent suspension. We apologize for any inconvenience this may cause and appreciate your prompt attention to this matter.</p> <p>Thank you for your cooperation.</p> <p>Sincerely,<br>Customer Support Team<br>Your Bank</p> </body> </html> ===================================================== == File: third-party/rspamd/src/test/resources/mail/spam/spam8.eml ===================================================== From ormlh@imail.ru Sun Jul 15 04:56:31 2001 Return-Path: <ormlh@imail.ru> Delivered-To: yyyy@netnoteinc.com Received: from cccp.co.kr (unknown [211.218.149.105]) by mail.netnoteinc.com (Postfix) with SMTP id 789D51140BA for <jm@netnoteinc.com>; Sun, 15 Jul 2001 03:56:28 +0000 (Eire) Received: from imail.ru [210.14.5.95] by cccp.co.kr running [nMail 1.04 (Windows NT/2000) SMTP Server]; Wed, 11 Jul 2001 02:41:35 +0900 Message-Id: <00000e0836ec$00006b26$0000082f@imail.ru> To: <67@163.net> From: ormlh@imail.ru Subject: FW: Date: Fri, 02 Jan 1998 04:30:44 -0400 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Priority: 3 X-Msmail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2910.0) <HTML> <BODY bgColor=3D#C0C0C0> <FONT face=3D"Arial"> <FONT size=3D4> <FONT color=3D"#800040"> Thank you for your interest!</FONT> <FONT size=3D3> <FONT color=3D"#800040"> </FONT> <FONT color=3D"#000000"> <BR> <BR> Judgment Courses offers an extensive Audio training<BR> course in </FONT> <FONT color=3D"#0000A0"> "How to Collect Money Judgments"</FONT> <FONT color=3D"#000000"> . </FONT> <FONT size=3D2> <FONT color=3D"#000000"> S6</FONT> <FONT size=3D3> <FONT color=3D"#000000"> <BR> <BR> If you are like many people, you are not even sure what a<BR> Money Judgment is and </FONT> <FONT color=3D"#0000A0"> why processing Money Judgments<BR> can earn you very substantial income</FONT> <FONT color=3D"#000000"> .<BR> <BR> If you ever sue a company or a person and you win then you<BR> will have a Money Judgment against them.<BR> <BR> You are happy you won but you will soon find out the<BR> shocking fact: "Its now up to you to collect on the<BR> ===================================================== == File: third-party/rspamd/README.md ===================================================== # James' extensions for Rspamd This module is for developing and delivering extensions to James for the [Rspamd](https://rspamd.com/) (the spam filtering system) and [ClamAV](https://www.clamav.net/) (the antivirus engine). ## How to run - The Rspamd extension requires an extra configuration file `rspamd.properties` to configure Rspamd connection Configuration parameters: - `rSpamdUrl` : URL defining the Rspamd's server. Eg: http://rspamd:11334 - `rSpamdPassword` : Password for pass authentication when request to Rspamd's server. Eg: admin - `rspamdTimeout` : Timeout for HTTP requests called to Rspamd. Default to 15 seconds. - `perUserBayes` : Use per-user Bayes for mail scanning/feedback. Default to false. - Declare the `extensions.properties` for this module. ``` guice.extension.module=org.apache.james.rspamd.module.RspamdModule guice.extension.task=org.apache.james.rspamd.module.RspamdTaskExtensionModule ``` - Declare the Rspamd mailbox listeners in `listeners.xml`. Eg: ``` <listener> <class>org.apache.james.rspamd.RspamdListener</class> </listener> ``` This listener can report mails to per-user Bayes by configure `perUserBayes` in `rspamd.properties`. - Declare the Rspamd mailet for custom mail processing. You can specify the `virusProcessor` if you want to enable virus scanning for mail. Upon configurable `virusProcessor` you can specify how James process mail virus. We provide a sample Rspamd mailet and `virusProcessor` configuration: You can specify the `rejectSpamProcessor`. Emails marked as `rejected` by Rspamd will be redirected to this processor. This corresponds to emails with the highest spam score, thus delivering them to users as marked as spam might not even be desirable. The `rewriteSubject` option allows to rewritte subjects when asked by Rspamd. This mailet can scan mails against per-user Bayes by configure `perUserBayes` in `rspamd.properties`. This is achieved through the use of Rspamd `Deliver-To` HTTP header. If true, Rspamd will be called for each recipient of the mail, which comes at a performance cost. If true, subjects are not rewritten. If true `virusProcessor` and `rejectSpamProcessor` are honnered per user, at the cost of email copies. Default to false. ```xml <processor state="local-delivery" enableJmx="true"> <mailet match="All" class="org.apache.james.rspamd.RspamdScanner"> <rewriteSubject>true</rewriteSubject> ===================================================== == File: third-party/rspamd/sample-configuration/extensions.properties ===================================================== guice.extension.module=org.apache.james.rspamd.module.RspamdModule guice.extension.task=org.apache.james.rspamd.module.RspamdTaskExtensionModule ===================================================== == File: third-party/rspamd/sample-configuration/worker-controller.inc ===================================================== password = "{= env.PASSWORD =}" ===================================================== == File: third-party/rspamd/sample-configuration/antivirus.conf ===================================================== clamav { # Scan mime_parts seperately - otherwise the complete mail will be transfered to AV Scanner #attachments_only = true; # Before 1.8.1 scan_mime_parts = true; # After 1.8.1 # Scanning Text is suitable for some av scanner databases (e.g. Sanesecurity) scan_text_mime = true; # 1.8.1 + scan_image_mime = true; # 1.8.1 + # If set force this action if any virus is found (default unset: no action is forced) # action = "reject"; message = '${SCANNER}: virus found: "${VIRUS}"'; # If set true, log message is emitted for clean messages log_clean = false; # symbol to add (add it to metric if you want non-zero weight) symbol = CLAM_VIRUS; # type of scanner: "clamav", "fprot", "sophos" or "savapi" type = clamav; servers = "clamav:3310"; patterns { JUST_EICAR = '^Eicar-Test-Signature$'; } } ===================================================== == File: third-party/rspamd/sample-configuration/redis.conf ===================================================== servers = "redis:6379"; ===================================================== == File: third-party/rspamd/sample-configuration/statistic.conf ===================================================== classifier "bayes" { tokenizer { name = "osb"; } cache { } new_schema = true; # Always use new schema store_tokens = false; # Redefine if storing of tokens is desired signatures = false; # Store learn signatures per_user = true; # Enable per user classifier users_enabled = true; min_tokens = 11; backend = "redis"; min_learns = 50; // Should not be bias by too small learning set statfile { symbol = "BAYES_HAM"; spam = false; } statfile { symbol = "BAYES_SPAM"; spam = true; } learn_condition = 'return require("lua_bayes_learn").can_learn'; # Autolearn sample # autolearn { # spam_threshold = 6.0; # When to learn spam (score >= threshold) # ham_threshold = -0.5; # When to learn ham (score <= threshold) # check_balance = true; # Check spam and ham balance # min_balance = 0.9; # Keep diff for spam/ham learns for at least this value #} .include(try=true; priority=1) "$LOCAL_CONFDIR/local.d/classifier-bayes.conf" .include(try=true; priority=10) "$LOCAL_CONFDIR/override.d/classifier-bayes.conf" } ===================================================== == File: third-party/rspamd/sample-configuration/rspamd.properties ===================================================== rspamdUrl=http://rspamd:11334 rspamdPassword=admin # Whether to scan/learn mails using per-user Bayes. Default to false. perUserBayes=false ===================================================== == File: third-party/rspamd/docker-compose-distributed.yml ===================================================== version: '3' services: james: depends_on: cassandra: condition: service_healthy opensearch: condition: service_started tika: condition: service_started rabbitmq: condition: service_started s3: condition: service_started rspamd: condition: service_healthy image: apache/james:distributed-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - $PWD/target/apache-james-rspamd-jar-with-dependencies.jar:/root/extensions-jars/james-server-rspamd.jar - $PWD/sample-configuration/extensions.properties:/root/conf/extensions.properties - $PWD/sample-configuration/mailetcontainer_distributed.xml:/root/conf/mailetcontainer.xml - $PWD/sample-configuration/listeners.xml:/root/conf/listeners.xml - $PWD/sample-configuration/rspamd.properties:/root/conf/rspamd.properties - $PWD/sample-configuration/webadmin.properties:/root/conf/webadmin.properties - $PWD/sample-configuration/healthcheck.properties:/root/conf/healthcheck.properties ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" networks: - james opensearch: image: opensearchproject/opensearch:2.14.0 environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true networks: ===================================================== == File: third-party/elasticsearch/docker-compose.yml ===================================================== version: '3' services: james: depends_on: - elasticsearch image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - ./target/apache-james-elasticsearch-jar-with-dependencies.jar:/root/extensions-jars/apache-james-elasticsearch.jar - ./conf/extensions.properties:/root/conf/extensions.properties - ./conf/elasticsearch.properties:/root/conf/elasticsearch.properties elasticsearch: image: elasticsearch:6.4.0 environment: - discovery.type=single-node ===================================================== == File: third-party/elasticsearch/conf/extensions.properties ===================================================== guice.extension.module=org.apache.james.metrics.es.v7.ESMetricReporterModule guice.extension.startable=org.apache.james.metrics.es.v7.ESMetricReporter ===================================================== == File: third-party/elasticsearch/conf/elasticsearch.properties ===================================================== # Reports for metrics into ElasticSearch # Defaults to elasticsearch.masterHost : on which server to publish metrics # WARNING: Supported ElasticSearch versions for metrics differs from the James one. Only ElasticSearch version 2 to 6 are supported. This requires a distinct ElasticSearch isntalation for metrics. # This component is furthermore unmaintained an use is discouraged.#elasticsearch.http.host=elasticsearch elasticsearch.masterHost=elasticsearch elasticsearch.http.port=9200 elasticsearch.metrics.reports.enabled=true elasticsearch.metrics.reports.period=30 elasticsearch.metrics.reports.index=james-metrics ===================================================== == File: third-party/elasticsearch/README.md ===================================================== # ElasticSearch metric extension for Apache James Exports Apache James metrics directly to ElasticSearch that can later be queried using [Grafana](https://grafana.com/). **WARNING**: A separate ElasticSearch server is required, as an ElasticSearch 6.3 is needed, which is not compatible with ElasticSearch 7.10 release line, and not compatible with **OpenSearch** currently used by Apache James. To run this metric exporter register it in `extensions.properties`: ``` guice.extension.module=org.apache.james.metrics.es.v7.ESMetricReporterModule guice.extension.startable=org.apache.james.metrics.es.v7.ESMetricReporter ``` For configuring the metric reporting on ElasticSearch edit `elasticsearch.properties` content: | Property name | explanation | |---|---| | elasticsearch.http.host | Optional. Host to report metrics on. Defaults to master host. Must be specified if metric export to ElasticSearch is enabled. | | elasticsearch.http.port | Optional. Http port to use for publishing metrics. Must be specified if metric export to ElasticSearch is enabled.| | elasticsearch.metrics.reports.enabled | Optional. Boolean value. Enables metrics reporting. Defaults to false. | | elasticsearch.metrics.reports.period | Optional. Seconds between metric reports. Defaults to 60 seconds. | | elasticsearch.metrics.reports.index | Optional. Index to publish metrics on. Defaults to james-metrics.| We provide a docker-compose of this set up. In order to run it... - 1. Compile this project: `mvn clean install -DskipTests --pl org.apache.james:apache-james-elasticsearch --am` - 2. Then start James: ``` docker-compose up ``` ===================================================== == File: third-party/clamav/docker-compose.yml ===================================================== version: '3' services: james: depends_on: cassandra: condition: service_healthy opensearch: condition: service_started tika: condition: service_started rabbitmq: condition: service_started s3: condition: service_started clamav: condition: service_started image: apache/james:distributed-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - $PWD/target/apache-james-clamav-jar-with-dependencies.jar:/root/extensions-jars/james-server-clamav.jar - $PWD/sample-configuration/mailetcontainer.xml:/root/conf/mailetcontainer.xml ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" networks: - james opensearch: image: opensearchproject/opensearch:2.14.0 environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true networks: james: aliases: - elasticsearch cassandra: ===================================================== == File: third-party/clamav/src/test/resources/attachment/inlineVirusTextAttachment.eml ===================================================== To: me@linagora.com From: Benoit Tellier <me@linagora.com> Subject: Mail with text attachment Message-ID: <befd8cab-9c9c-5537-4e77-937f32326087@any.com> Date: Thu, 13 Oct 2016 10:26:20 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------4FD2D252DB453546C22C25B2" This is a multi-part message in MIME format. --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I'm the body! --------------4FD2D252DB453546C22C25B2 Content-Disposition: inline Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-ID: <id> X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* --------------4FD2D252DB453546C22C25B2-- ===================================================== == File: third-party/clamav/src/test/resources/attachment/inlineNonVirusTextAttachment.eml ===================================================== To: me@linagora.com From: Benoit Tellier <me@linagora.com> Subject: Mail with text attachment Message-ID: <befd8cab-9c9c-5537-4e77-937f32326087@any.com> Date: Thu, 13 Oct 2016 10:26:20 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------4FD2D252DB453546C22C25B2" This is a multi-part message in MIME format. --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I'm the body! --------------4FD2D252DB453546C22C25B2 Content-Disposition: inline Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-ID: <id> Non virus text --------------4FD2D252DB453546C22C25B2-- ===================================================== == File: third-party/clamav/README.md ===================================================== # James' extensions for ClamAV This module is for developing and delivering extensions to James for the [ClamAV](https://www.clamav.net/) (the antivirus engine) integration. Currently, this module provides `ClamAVScan` mailet that talks directly with ClamAV via unix socket to scan virus for every incoming mail. Upon having virus, mail will be redirected to `virus` processor with configurable behavior for further processing. E.g: ```xml <processor state="local-delivery" enableJmx="true"> <mailet match="All" class="org.apache.james.clamav.ClamAVScan"> <host>clamav</host> <port>3310</port> <onMailetException>ignore</onMailetException> </mailet> <!-- If infected go to virus processor --> <mailet match="HasMailAttributeWithValue=org.apache.james.infected, true" class="ToProcessor"> <processor>virus</processor> </mailet> </processor> <processor state="virus" enableJmx="false"> <mailet match="All" class="ToRepository"> <repositoryPath>cassandra://var/mail/virus/</repositoryPath> </mailet> </processor> ``` To run James with this ClamAV integration, please use James's jar extension mechanism. We also provide a sample [docker-compose.yml](docker-compose.yml) on how to setup the James <-> ClamAV integration. ===================================================== == File: third-party/crowdsec/Dockerfile ===================================================== FROM apache/james:memory-latest RUN echo ":/root/libs/logback-jackson-0.1.5.jar:/root/libs/logback-json-core-0.1.5.jar" >> /root/jib-classpath-file ===================================================== == File: third-party/crowdsec/docker-compose.yml ===================================================== version: '3' services: james: image: apache/james:memory-crowdsec container_name: james hostname: james.local command: - --generate-keystore volumes: - ./logback-jackson-0.1.5.jar:/root/libs/logback-jackson-0.1.5.jar - ./logback-json-core-0.1.5.jar:/root/libs/logback-json-core-0.1.5.jar - ./sample-configuration/logback.xml:/root/conf/logback.xml - ./target/apache-james-crowdsec-jar-with-dependencies.jar:/root/extensions-jars/james-server-crowdsec.jar - ./sample-configuration/extensions.properties:/root/conf/extensions.properties - ./sample-configuration/smtpserver.xml:/root/conf/smtpserver.xml - ./sample-configuration/crowdsec.properties:/root/conf/crowdsec.properties - ./sample-configuration/imapserver.xml:/root/conf/imapserver.xml - ./sample-configuration/pop3server.xml:/root/conf/pop3server.xml networks: - james ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" crowdsec: image: crowdsecurity/crowdsec:v1.5.4 container_name: crowdsec restart: always volumes: - ./sample-configuration/acquis.yaml:/etc/crowdsec/acquis.yaml - ./sample-configuration/parsers/syslog-logs.yaml:/etc/crowdsec/parsers/s00-raw/syslog-logs.yaml - ./sample-configuration/parsers/james-auth.yaml:/etc/crowdsec/parsers/s01-parse/james-auth.yaml - ./sample-configuration/scenarios:/etc/crowdsec/scenarios - ./sample-configuration/collections:/etc/crowdsec/collections - /var/run/docker.sock:/var/run/docker.sock ports: - "8080:8080" - "6060:6060" networks: - james networks: james: ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/collections/james.yaml ===================================================== parsers: - crowdsecurity/syslog-logs - linagora/james-auth - linagora/james-dictionary-attack scenarios: - apache-james/bf-auth author: linagora ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/parsers/james-dictionary-attack.yaml ===================================================== onsuccess: next_stage debug: true filter: "evt.Parsed.program == 'james'" name: linagora/james-dictionary-attack description: "Parser for James dictionary attack" pattern_syntax: DICTIONARY_ATTACK: 'Rejected message. Unknown user: %{EMAILADDRESS:rcpt}' nodes: - grok: name: "DICTIONARY_ATTACK" apply_on: message statics: - meta: log_type value: dictionary-attack - meta: timestamp expression: evt.Parsed.timestamp - meta: level expression: evt.Parsed.level - meta: source_ip expression: evt.Parsed.mdc_ip - meta: user expression: evt.Parsed.mdc_user - meta: rcpt expression: evt.Parsed.rcpt ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml ===================================================== #If it's syslog, we are going to extract progname from it filter: "evt.Line.Labels.type == 'syslog'" onsuccess: next_stage pattern_syntax: RAW_SYSLOG_PREFIX: '^<%{NUMBER:stuff1}>%{NUMBER:stuff2} %{SYSLOGBASE2} %{DATA:program} %{NUMBER:pid}' RAW_SYSLOG_META: '\[meta sequenceId="%{NOTDQUOTE:seq_id}"\]' name: crowdsecurity/syslog-logs nodes: - grok: #this is a named regular expression. grok patterns can be kept into separate files for readability pattern: "^%{SYSLOGLINE}" #This is the field of the `Event` to which the regexp should be applied apply_on: Line.Raw - grok: #a second pattern for unparsed syslog lines, as saw in opnsense pattern: '%{RAW_SYSLOG_PREFIX} - %{RAW_SYSLOG_META} %{GREEDYDATA:message}' apply_on: Line.Raw #if the node was successfull, statics will be applied. statics: - meta: machine expression: evt.Parsed.logsource - parsed: "logsource" value: "syslog" # syslog date can be in two different fields (one of hte assignment will fail) - target: evt.StrTime expression: evt.Parsed.timestamp - target: evt.StrTime expression: evt.Parsed.timestamp8601 - meta: datasource_path expression: evt.Line.Src - meta: datasource_type expression: evt.Line.Module --- #if it's not syslog, the type is the progname filter: "evt.Line.Labels.type != 'syslog'" onsuccess: next_stage name: crowdsecurity/non-syslog debug: true statics: - parsed: json_parsed expression: UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, "message") - parsed: program expression: evt.Line.Labels.type - parsed: timestamp expression: evt.Unmarshaled.message.timestamp - parsed: level expression: evt.Unmarshaled.message.level - parsed: thread expression: evt.Unmarshaled.message.thread - parsed: mdc_protocol ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/parsers/james-auth.yaml ===================================================== onsuccess: next_stage debug: true filter: "evt.Parsed.program == 'james'" name: linagora/james-auth description: "Parser for James IMAP and SMTP authentication " pattern_syntax: IMAP_AUTH_FAIL_BAD_CREDENTIALS: 'IMAP Authentication failed%{DATA:data}because of bad credentials.' IMAP_AUTH_FAIL_DELEGATION_BAD_CREDENTIALS: 'IMAP Authentication with delegation failed%{DATA:data}because of bad credentials.' IMAP_AUTH_FAIL_NO_EXISTING_DELEGATION: 'IMAP Authentication with delegation failed%{DATA:data}because of non existing delegation.' SMTP_AUTH_FAIL: 'SMTP Authentication%{DATA:data}failed.' POP3_AUTH_FAIL: 'Bad credential supplied for %{DATA:user} with remote address %{IP:source_ip}' nodes: - grok: name: "IMAP_AUTH_FAIL_BAD_CREDENTIALS" apply_on: message statics: - meta: log_type value: imap-auth-fail - meta: timestamp expression: evt.Parsed.timestamp - meta: level expression: evt.Parsed.level - meta: source_ip expression: evt.Parsed.mdc_ip - meta: host expression: evt.Parsed.mdc_host - meta: user expression: evt.Parsed.user - grok: name: "IMAP_AUTH_FAIL_DELEGATION_BAD_CREDENTIALS" apply_on: message statics: - meta: log_type value: imap-auth-fail - meta: timestamp expression: evt.Parsed.timestamp - meta: level expression: evt.Parsed.level - meta: source_ip expression: evt.Parsed.mdc_ip - meta: host expression: evt.Parsed.mdc_host - meta: user expression: evt.Parsed.user - grok: name: "IMAP_AUTH_FAIL_NO_EXISTING_DELEGATION" apply_on: message statics: - meta: log_type ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/acquis.yaml ===================================================== source: file filenames: - /var/log/james.log labels: type: james ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/scenarios/james-bf-auth.yaml ===================================================== type: leaky name: apache-james/bf-auth debug: true description: "Detect login james bruteforce" filter: "evt.Meta.log_type == 'imap-auth-fail' || evt.Meta.log_type == 'smtp-auth-fail' || evt.Meta.log_type == 'pop3-auth-fail'" leakspeed: "5m" capacity: 2 # 3rd failed authentication would trigger the ban decision groupby: evt.Meta.source_ip blackhole: 0m # to enable rapidly trigger new ban decision across tests. cf https://docs.crowdsec.net/docs/scenarios/format/#blackhole reprocess: true labels: service: ssh type: bruteforce remediation: true ===================================================== == File: third-party/crowdsec/src/test/resources/crowdsec/scenarios/james-dictionary-attack.yaml ===================================================== type: leaky name: linagora/james-dictionary-attack debug: true description: "Detect login james bruteforce" filter: "evt.Meta.log_type == 'dictionary-attack'" leakspeed: "1m" capacity: 5 groupby: evt.Meta.source_ip blackhole: 1m reprocess: true labels: service: ssh type: bruteforce remediation: true ===================================================== == File: third-party/crowdsec/src/test/resources/haproxy.cfg ===================================================== global log stdout format raw local0 info defaults mode tcp timeout client 1800s timeout connect 5s timeout server 1800s log global option tcplog frontend imap1-frontend bind :143 default_backend james-servers-imaps frontend imaps-frontend bind :993 default_backend james-servers-imaps backend james-servers-imap server james1 172.17.0.1:39847 send-proxy backend james-servers-imaps server james1 172.17.0.1:39347 send-proxy ===================================================== == File: third-party/crowdsec/src/test/resources/log/james.log ===================================================== ===================================================== == File: third-party/crowdsec/README.md ===================================================== # James' extensions for Crowdsec This module is for developing and delivering extensions to James for the [Crowdsec](https://www.crowdsec.net/) (IP filtering system) ## How to run - The Crowdsec extension requires an extra configuration file `crowdsec.properties` to configure Crowdsec connection Configuration parameters: - `crowdsecUrl` : String. Required. URL defining the Crowdsec's bouncer. Eg: http://crowdsec:8080/v1 - `apiKey` : String. Required. Api key for pass authentication when request to Crowdsec. - `timeout` : Duration. Optional. Default to `500ms`. Timeout questioning to CrowdSec. E.g. `500ms`, `1 second`,... - Declare the `extensions.properties` for this module. ``` guice.extension.module=org.apache.james.crowdsec.module.CrowdsecModule ``` - Mount the configuration file onto the classpath You can find a `logback.xml` configuration file in the `sample-configuration` directory. \ To use this configuration at runtime, ensure the file is available in the application's classpath by placing it in a directory accessible by the application. Use a `-Dlogback.configurationFile` JVM argument to specify the file's location when starting the application. ### CrowdSec support for SMTP - Declare the Crowdsec EhloHook in `smtpserver.xml`. Eg: ``` <handlerchain> <handler class="org.apache.james.smtpserver.fastfail.ValidRcptHandler"/> <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/> <handler class="org.apache.james.crowdsec.CrowdsecEhloHook"/> </handlerchain> ``` or ``` <handlerchain> <handler class="org.apache.james.smtpserver.fastfail.ValidRcptHandler"/> <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/> <handler class="org.apache.james.crowdsec.CrowdsecSMTPConnectHandler"/> </handlerchain> ``` The EHLO hook will block banned clients with `554 Email rejected` whereas the connect handler will terminate the connection even before the SMTP greeting. ### CrowdSec support for IMAP - Declare the `CrowdsecImapConnectionCheck` in `imapserver.xml`. Eg: ``` ===================================================== == File: third-party/crowdsec/sample-configuration/collections/james.yaml ===================================================== parsers: - crowdsecurity/syslog-logs - linagora/james-auth - linagora/james-dictionary-attack scenarios: - apache-james/bf-auth author: linagora ===================================================== == File: third-party/crowdsec/sample-configuration/parsers/james-dictionary-attack.yaml ===================================================== onsuccess: next_stage debug: true filter: "evt.Parsed.program == 'james'" name: linagora/james-dictionary-attack description: "Parser for James dictionary attack" pattern_syntax: DICTIONARY_ATTACK: 'Rejected message. Unknown user: %{EMAILADDRESS:rcpt}' nodes: - grok: name: "DICTIONARY_ATTACK" apply_on: message statics: - meta: log_type value: dictionary-attack - meta: timestamp expression: evt.Parsed.timestamp - meta: level expression: evt.Parsed.level - meta: source_ip expression: evt.Parsed.mdc_ip - meta: user expression: evt.Parsed.mdc_user - meta: rcpt expression: evt.Parsed.rcpt ===================================================== == File: third-party/crowdsec/sample-configuration/parsers/syslog-logs.yaml ===================================================== #If it's syslog, we are going to extract progname from it filter: "evt.Line.Labels.type == 'syslog'" onsuccess: next_stage pattern_syntax: RAW_SYSLOG_PREFIX: '^<%{NUMBER:stuff1}>%{NUMBER:stuff2} %{SYSLOGBASE2} %{DATA:program} %{NUMBER:pid}' RAW_SYSLOG_META: '\[meta sequenceId="%{NOTDQUOTE:seq_id}"\]' name: crowdsecurity/syslog-logs nodes: - grok: #this is a named regular expression. grok patterns can be kept into separate files for readability pattern: "^%{SYSLOGLINE}" #This is the field of the `Event` to which the regexp should be applied apply_on: Line.Raw - grok: #a second pattern for unparsed syslog lines, as saw in opnsense pattern: '%{RAW_SYSLOG_PREFIX} - %{RAW_SYSLOG_META} %{GREEDYDATA:message}' apply_on: Line.Raw #if the node was successfull, statics will be applied. statics: - meta: machine expression: evt.Parsed.logsource - parsed: "logsource" value: "syslog" # syslog date can be in two different fields (one of hte assignment will fail) - target: evt.StrTime expression: evt.Parsed.timestamp - target: evt.StrTime expression: evt.Parsed.timestamp8601 - meta: datasource_path expression: evt.Line.Src - meta: datasource_type expression: evt.Line.Module --- #if it's not syslog, the type is the progname filter: "evt.Line.Labels.type != 'syslog'" onsuccess: next_stage name: crowdsecurity/non-syslog debug: true statics: - parsed: json_parsed expression: UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, "message") - parsed: program expression: evt.Line.Labels.type - parsed: timestamp expression: evt.Unmarshaled.message.timestamp - parsed: level expression: evt.Unmarshaled.message.level - parsed: thread expression: evt.Unmarshaled.message.thread - parsed: mdc_protocol ===================================================== == File: third-party/crowdsec/sample-configuration/parsers/james-auth.yaml ===================================================== onsuccess: next_stage debug: true filter: "evt.Parsed.program == 'james'" name: linagora/james-auth description: "Parser for James IMAP and SMTP authentication " pattern_syntax: IMAP_AUTH_FAIL_BAD_CREDENTIALS: 'IMAP Authentication failed%{DATA:data}because of bad credentials.' IMAP_AUTH_FAIL_DELEGATION_BAD_CREDENTIALS: 'IMAP Authentication with delegation failed%{DATA:data}because of bad credentials.' IMAP_AUTH_FAIL_NO_EXISTING_DELEGATION: 'IMAP Authentication with delegation failed%{DATA:data}because of non existing delegation.' SMTP_AUTH_FAIL: 'SMTP Authentication%{DATA:data}failed.' POP3_AUTH_FAIL: 'Bad credential supplied for %{DATA:user} with remote address %{IP:source_ip}' nodes: - grok: name: "IMAP_AUTH_FAIL_BAD_CREDENTIALS" apply_on: message statics: - meta: log_type value: imap-auth-fail - meta: timestamp expression: evt.Parsed.timestamp - meta: level expression: evt.Parsed.level - meta: source_ip expression: evt.Parsed.mdc_ip - meta: host expression: evt.Parsed.mdc_host - meta: user expression: evt.Parsed.user - grok: name: "IMAP_AUTH_FAIL_DELEGATION_BAD_CREDENTIALS" apply_on: message statics: - meta: log_type value: imap-auth-fail - meta: timestamp expression: evt.Parsed.timestamp - meta: level expression: evt.Parsed.level - meta: source_ip expression: evt.Parsed.mdc_ip - meta: host expression: evt.Parsed.mdc_host - meta: user expression: evt.Parsed.user - grok: name: "IMAP_AUTH_FAIL_NO_EXISTING_DELEGATION" apply_on: message statics: - meta: log_type ===================================================== == File: third-party/crowdsec/sample-configuration/extensions.properties ===================================================== guice.extension.module=org.apache.james.crowdsec.module.CrowdsecModule ===================================================== == File: third-party/crowdsec/sample-configuration/acquis.yaml ===================================================== source: docker container_name: - james labels: type: james ===================================================== == File: third-party/crowdsec/sample-configuration/scenarios/james-bf-auth.yaml ===================================================== type: leaky name: apache-james/bf-auth debug: true description: "Detect login james bruteforce" filter: "evt.Meta.log_type == 'imap-auth-fail' || evt.Meta.log_type == 'smtp-auth-fail' || evt.Meta.log_type == 'pop3-auth-fail'" leakspeed: "1m" capacity: 5 groupby: evt.Meta.source_ip blackhole: 1m reprocess: true labels: service: ssh type: bruteforce remediation: true ===================================================== == File: third-party/crowdsec/sample-configuration/scenarios/james-dictionary-attack.yaml ===================================================== type: leaky name: linagora/james-dictionary-attack debug: true description: "Detect login james bruteforce" filter: "evt.Meta.log_type == 'dictionary-attack'" leakspeed: "1m" capacity: 5 groupby: evt.Meta.source_ip blackhole: 1m reprocess: true labels: service: ssh type: bruteforce remediation: true ===================================================== == File: third-party/crowdsec/sample-configuration/crowdsec.properties ===================================================== crowdsecUrl=http://crowdsec:8080/v1 apiKey=default_api_key ===================================================== == File: third-party/spamassassin/docker-compose.yml ===================================================== version: '3' services: james: depends_on: - spamassassin image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - $PWD/target/apache-james-spamassassin-jar-with-dependencies.jar:/root/extensions-jars/james-server-spamassassin.jar - $PWD/sample-configuration/extensions.properties:/root/conf/extensions.properties - $PWD/sample-configuration/spamassassin.properties:/root/conf/spamassassin.properties - $PWD/sample-configuration/mailetcontainer.xml:/root/conf/mailetcontainer.xml - $PWD/sample-configuration/listeners.xml:/root/conf/listeners.xml - $PWD/sample-configuration/smtpserver.xml:/root/conf/smtpserver.xml ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" spamassassin: image: instantlinux/spamassassin:4.0.0-6 ports: - "783:783" ===================================================== == File: third-party/spamassassin/src/test/resources/eml/spam.eml ===================================================== Return-Path: <user@james.org> Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (user@james.org) To: <user@james.org> From: user <user@james.org> Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8a6b@james.org> Date: Thu, 19 Jan 2017 20:36:37 +0100 MIME-Version: 1.0 In-Reply-To: <001a114380a6a260d105467765ab@google.com> Content-Type: multipart/mixed; boundary="------------17D96D411CBD55D8239A8C1F" This is a multi-part message in MIME format. --------------17D96D411CBD55D8239A8C1F Content-Type: multipart/alternative; boundary="------------64D716A3DDAEC185D3E67448" --------------64D716A3DDAEC185D3E67448 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit -------- Message transéré -------- Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (user@james.org) Date : Thu, 19 Jan 2017 19:18:23 +0000 De : <user@james.org> Répondre à : user@james.org Pour : user@james.org --------------64D716A3DDAEC185D3E67448 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <p><br> </p> <div class="moz-forward-container"><br> <br> ===================================================== == File: third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham1 ===================================================== From exmh-workers-admin@redhat.com Thu Aug 22 12:36:23 2002 Return-Path: <exmh-workers-admin@spamassassin.taint.org> Delivered-To: zzzz@localhost.netnoteinc.com Received: from localhost (localhost [127.0.0.1]) by phobos.labs.netnoteinc.com (Postfix) with ESMTP id D03E543C36 for <zzzz@localhost>; Thu, 22 Aug 2002 07:36:16 -0400 (EDT) Received: from phobos [127.0.0.1] by localhost with IMAP (fetchmail-5.9.0) for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:36:16 +0100 (IST) Received: from listman.spamassassin.taint.org (listman.spamassassin.taint.org [66.187.233.211]) by dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id g7MBYrZ04811 for <zzzz-exmh@spamassassin.taint.org>; Thu, 22 Aug 2002 12:34:53 +0100 Received: from listman.spamassassin.taint.org (localhost.localdomain [127.0.0.1]) by listman.redhat.com (Postfix) with ESMTP id 8386540858; Thu, 22 Aug 2002 07:35:02 -0400 (EDT) Delivered-To: exmh-workers@listman.spamassassin.taint.org Received: from int-mx1.corp.spamassassin.taint.org (int-mx1.corp.spamassassin.taint.org [172.16.52.254]) by listman.redhat.com (Postfix) with ESMTP id 10CF8406D7 for <exmh-workers@listman.redhat.com>; Thu, 22 Aug 2002 07:34:10 -0400 (EDT) Received: (from mail@localhost) by int-mx1.corp.spamassassin.taint.org (8.11.6/8.11.6) id g7MBY7g11259 for exmh-workers@listman.redhat.com; Thu, 22 Aug 2002 07:34:07 -0400 Received: from mx1.spamassassin.taint.org (mx1.spamassassin.taint.org [172.16.48.31]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with SMTP id g7MBY7Y11255 for <exmh-workers@redhat.com>; Thu, 22 Aug 2002 07:34:07 -0400 Received: from ratree.psu.ac.th ([202.28.97.6]) by mx1.spamassassin.taint.org (8.11.6/8.11.6) with SMTP id g7MBIhl25223 for <exmh-workers@redhat.com>; Thu, 22 Aug 2002 07:18:55 -0400 Received: from delta.cs.mu.OZ.AU (delta.coe.psu.ac.th [172.30.0.98]) by ratree.psu.ac.th (8.11.6/8.11.6) with ESMTP id g7MBWel29762; Thu, 22 Aug 2002 18:32:40 +0700 (ICT) Received: from munnari.OZ.AU (localhost [127.0.0.1]) by delta.cs.mu.OZ.AU (8.11.6/8.11.6) with ESMTP id g7MBQPW13260; Thu, 22 Aug 2002 18:26:25 +0700 (ICT) From: Robert Elz <kre@munnari.OZ.AU> To: Chris Garrigues <cwg-dated-1030377287.06fa6d@DeepEddy.Com> Cc: exmh-workers@spamassassin.taint.org Subject: Re: New Sequences Window In-Reply-To: <1029945287.4797.TMDA@deepeddy.vircio.com> References: <1029945287.4797.TMDA@deepeddy.vircio.com> <1029882468.3116.TMDA@deepeddy.vircio.com> <9627.1029933001@munnari.OZ.AU> <1029943066.26919.TMDA@deepeddy.vircio.com> <1029944441.398.TMDA@deepeddy.vircio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Message-Id: <13258.1030015585@munnari.OZ.AU> X-Loop: exmh-workers@spamassassin.taint.org Sender: exmh-workers-admin@spamassassin.taint.org Errors-To: exmh-workers-admin@spamassassin.taint.org ===================================================== == File: third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham3 ===================================================== From timc@2ubh.com Thu Aug 22 13:52:59 2002 Return-Path: <timc@2ubh.com> Delivered-To: zzzz@localhost.netnoteinc.com Received: from localhost (localhost [127.0.0.1]) by phobos.labs.netnoteinc.com (Postfix) with ESMTP id 0314547C66 for <zzzz@localhost>; Thu, 22 Aug 2002 08:52:58 -0400 (EDT) Received: from phobos [127.0.0.1] by localhost with IMAP (fetchmail-5.9.0) for zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:52:59 +0100 (IST) Received: from n16.grp.scd.yahoo.com (n16.grp.scd.yahoo.com [66.218.66.71]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id g7MCrdZ07070 for <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 13:53:39 +0100 X-Egroups-Return: sentto-2242572-52733-1030020820-zzzz=spamassassin.taint.org@returns.groups.yahoo.com Received: from [66.218.67.198] by n16.grp.scd.yahoo.com with NNFMP; 22 Aug 2002 12:53:40 -0000 X-Sender: timc@2ubh.com X-Apparently-To: zzzzteana@yahoogroups.com Received: (EGP: mail-8_1_0_1); 22 Aug 2002 12:53:39 -0000 Received: (qmail 76099 invoked from network); 22 Aug 2002 12:53:39 -0000 Received: from unknown (66.218.66.218) by m5.grp.scd.yahoo.com with QMQP; 22 Aug 2002 12:53:39 -0000 Received: from unknown (HELO rhenium.btinternet.com) (194.73.73.93) by mta3.grp.scd.yahoo.com with SMTP; 22 Aug 2002 12:53:39 -0000 Received: from host217-36-23-185.in-addr.btopenworld.com ([217.36.23.185]) by rhenium.btinternet.com with esmtp (Exim 3.22 #8) id 17hrT0-0004gj-00 for forteana@yahoogroups.com; Thu, 22 Aug 2002 13:53:38 +0100 X-Mailer: Microsoft Outlook Express Macintosh Edition - 4.5 (0410) To: zzzzteana <zzzzteana@yahoogroups.com> X-Priority: 3 Message-Id: <E17hrT0-0004gj-00@rhenium.btinternet.com> From: "Tim Chapman" <timc@2ubh.com> X-Yahoo-Profile: tim2ubh MIME-Version: 1.0 Mailing-List: list zzzzteana@yahoogroups.com; contact forteana-owner@yahoogroups.com Delivered-To: mailing list zzzzteana@yahoogroups.com Precedence: bulk List-Unsubscribe: <mailto:zzzzteana-unsubscribe@yahoogroups.com> Date: Thu, 22 Aug 2002 13:52:38 +0100 Subject: [zzzzteana] Moscow bomber Reply-To: zzzzteana@yahoogroups.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Man Threatens Explosion In Moscow Thursday August 22, 2002 1:40 PM MOSCOW (AP) - Security officers on Thursday seized an unidentified man who said he was armed with explosives and threatened to blow up his truck in front of Russia's Federal Security Services headquarters in Moscow, NTV ===================================================== == File: third-party/spamassassin/src/test/resources/spamassassin_db/ham/ham2 ===================================================== From Steve_Burt@cursor-system.com Thu Aug 22 12:46:39 2002 Return-Path: <Steve_Burt@cursor-system.com> Delivered-To: zzzz@localhost.netnoteinc.com Received: from localhost (localhost [127.0.0.1]) by phobos.labs.netnoteinc.com (Postfix) with ESMTP id BE12E43C34 for <zzzz@localhost>; Thu, 22 Aug 2002 07:46:38 -0400 (EDT) Received: from phobos [127.0.0.1] by localhost with IMAP (fetchmail-5.9.0) for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:46:38 +0100 (IST) Received: from n20.grp.scd.yahoo.com (n20.grp.scd.yahoo.com [66.218.66.76]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id g7MBkTZ05087 for <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 12:46:29 +0100 X-Egroups-Return: sentto-2242572-52726-1030016790-zzzz=spamassassin.taint.org@returns.groups.yahoo.com Received: from [66.218.67.196] by n20.grp.scd.yahoo.com with NNFMP; 22 Aug 2002 11:46:30 -0000 X-Sender: steve.burt@cursor-system.com X-Apparently-To: zzzzteana@yahoogroups.com Received: (EGP: mail-8_1_0_1); 22 Aug 2002 11:46:29 -0000 Received: (qmail 11764 invoked from network); 22 Aug 2002 11:46:29 -0000 Received: from unknown (66.218.66.217) by m3.grp.scd.yahoo.com with QMQP; 22 Aug 2002 11:46:29 -0000 Received: from unknown (HELO mailgateway.cursor-system.com) (62.189.7.27) by mta2.grp.scd.yahoo.com with SMTP; 22 Aug 2002 11:46:29 -0000 Received: from exchange1.cps.local (unverified) by mailgateway.cursor-system.com (Content Technologies SMTPRS 4.2.10) with ESMTP id <T5cde81f695ac1d100407d@mailgateway.cursor-system.com> for <forteana@yahoogroups.com>; Thu, 22 Aug 2002 13:14:10 +0100 Received: by exchange1.cps.local with Internet Mail Service (5.5.2653.19) id <PXX6AT23>; Thu, 22 Aug 2002 12:46:27 +0100 Message-Id: <5EC2AD6D2314D14FB64BDA287D25D9EF12B4F6@exchange1.cps.local> To: "'zzzzteana@yahoogroups.com'" <zzzzteana@yahoogroups.com> X-Mailer: Internet Mail Service (5.5.2653.19) X-Egroups-From: Steve Burt <steve.burt@cursor-system.com> From: Steve Burt <Steve_Burt@cursor-system.com> X-Yahoo-Profile: pyruse MIME-Version: 1.0 Mailing-List: list zzzzteana@yahoogroups.com; contact forteana-owner@yahoogroups.com Delivered-To: mailing list zzzzteana@yahoogroups.com Precedence: bulk List-Unsubscribe: <mailto:zzzzteana-unsubscribe@yahoogroups.com> Date: Thu, 22 Aug 2002 12:46:18 +0100 Subject: [zzzzteana] RE: Alexander Reply-To: zzzzteana@yahoogroups.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Martin A posted: Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the ===================================================== == File: third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam2 ===================================================== From lmrn@mailexcite.com Mon Jun 24 17:03:24 2002 Return-Path: merchantsworld2001@juno.com Delivery-Date: Mon May 13 04:46:13 2002 Received: from mandark.labs.netnoteinc.com ([213.105.180.140]) by dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id g4D3kCe15097 for <jm@jmason.org>; Mon, 13 May 2002 04:46:12 +0100 Received: from 203.129.205.5.205.129.203.in-addr.arpa ([203.129.205.5]) by mandark.labs.netnoteinc.com (8.11.2/8.11.2) with SMTP id g4D3k2D12605 for <jm@netnoteinc.com>; Mon, 13 May 2002 04:46:04 +0100 Received: from html (unverified [207.95.174.49]) by 203.129.205.5.205.129.203.in-addr.arpa (EMWAC SMTPRS 0.83) with SMTP id <B0000178595@203.129.205.5.205.129.203.in-addr.arpa>; Mon, 13 May 2002 09:04:46 +0530 Message-Id: <B0000178595@203.129.205.5.205.129.203.in-addr.arpa> From: lmrn@mailexcite.com To: ranmoore@cybertime.net Subject: Real Protection, Stun Guns! Free Shipping! Time:2:01:35 PM Date: Mon, 28 Jul 1980 14:01:35 MIME-Version: 1.0 X-Keywords: Content-Type: text/html; charset="DEFAULT" <html> <body> <center> <h3> <font color="blue"> <b> The Need For Safety Is Real In 2002, You Might Only Get One Chance - Be Ready! <p> Free Shipping & Handling Within The (USA) If You Order Before May 25, 2002! <p> 3 Day Super Sale, Now Until May 7, 2002! Save Up To $30.00 On Some Items! </b> </font> </h3> </center> <p> IT'S GETTING TO BE SPRING AGAIN, PROTECT YOURSELF AS YOU WALK,<br> JOG AND EXERCISE OUTSIDE. ALSO PROTECT YOUR LOVED ONES AS<br> THEY RETURN HOME FROM COLLEGE!<br> <p> * LEGAL PROTECTION FOR COLLEGE STUDENTS!<br> * GREAT UP'COMING OUTDOOR PROTECTION GIFTS!<br> * THERE IS NOTHING WORTH MORE PROTECTING THAN LIFE!<br> * OUR STUN DEVICES & PEPPER PRODUCTS ARE LEGAL PROTECTION! <p> <b> <font color="red"> ===================================================== == File: third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam3 ===================================================== From amknight@mailexcite.com Mon Jun 24 17:03:49 2002 Return-Path: merchantsworld2001@juno.com Delivery-Date: Wed May 15 08:58:23 2002 Received: from mandark.labs.netnoteinc.com ([213.105.180.140]) by dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id g4F7wIe23864 for <jm@jmason.org>; Wed, 15 May 2002 08:58:18 +0100 Received: from webcust2.hightowertech.com (webcust2.hightowertech.com [216.41.166.100]) by mandark.labs.netnoteinc.com (8.11.2/8.11.2) with ESMTP id g4F7wGD24120 for <jm@netnoteinc.com>; Wed, 15 May 2002 08:58:17 +0100 Received: from html ([206.216.197.214]) by webcust2.hightowertech.com with Microsoft SMTPSVC(5.5.1877.197.19); Wed, 15 May 2002 00:55:53 -0700 From: amknight@mailexcite.com To: cbmark@cbmark.com Subject: New Improved Fat Burners, Now With TV Fat Absorbers! Time:6:25:49 PM Date: Wed, 30 Jul 1980 18:25:49 MIME-Version: 1.0 Message-Id: <0845b5355070f52WEBCUST2@webcust2.hightowertech.com> X-Keywords: Content-Type: text/html; charset="DEFAULT" <html> <body> <center> <b> <font color="blue"> *****Bonus Fat Absorbers As Seen On TV, Included Free With Purchase Of 2 Or More Bottle, $24.95 Value***** </font> <br> <br> ***TAKE $10.00 OFF 2 & 3 MONTH SUPPLY ORDERS, $5.00 OFF 1 MONTH SUPPLY! ***AND STILL GET YOUR BONUS! PRICE WILL BE DEDUCTED DURING PROCESSING. <br> <br> ***FAT ABSORBERS ARE GREAT FOR THOSE WHO WANT TO LOSE WEIGHT, BUT CAN'T STAY ON A DIET*** <br> <br> ***OFFER GOOD UNTIL MAY 27, 2002! FOREIGN ORDERS INCLUDED! <br> <br> <font color="blue"> LOSE 30 POUNDS IN 30 DAYS... GUARANTEED!!! <br> <br> All Natural Weight-Loss Program, Speeds Up The Metabolism Safely Rated #1 In Both Categories of SAFETY & EFFECTIVENESS In<br> (THE United States Today) ===================================================== == File: third-party/spamassassin/src/test/resources/spamassassin_db/spam/spam1 ===================================================== From ilug-admin@linux.ie Tue Aug 6 11:51:02 2002 Return-Path: <ilug-admin@linux.ie> Delivered-To: yyyy@localhost.netnoteinc.com Received: from localhost (localhost [127.0.0.1]) by phobos.labs.netnoteinc.com (Postfix) with ESMTP id 9E1F5441DD for <jm@localhost>; Tue, 6 Aug 2002 06:48:09 -0400 (EDT) Received: from phobos [127.0.0.1] by localhost with IMAP (fetchmail-5.9.0) for jm@localhost (single-drop); Tue, 06 Aug 2002 11:48:09 +0100 (IST) Received: from lugh.tuatha.org (root@lugh.tuatha.org [194.125.145.45]) by dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id g72LqWv13294 for <jm-ilug@jmason.org>; Fri, 2 Aug 2002 22:52:32 +0100 Received: from lugh (root@localhost [127.0.0.1]) by lugh.tuatha.org (8.9.3/8.9.3) with ESMTP id WAA31224; Fri, 2 Aug 2002 22:50:17 +0100 Received: from bettyjagessar.com (w142.z064000057.nyc-ny.dsl.cnc.net [64.0.57.142]) by lugh.tuatha.org (8.9.3/8.9.3) with ESMTP id WAA31201 for <ilug@linux.ie>; Fri, 2 Aug 2002 22:50:11 +0100 X-Authentication-Warning: lugh.tuatha.org: Host w142.z064000057.nyc-ny.dsl.cnc.net [64.0.57.142] claimed to be bettyjagessar.com Received: from 64.0.57.142 [202.63.165.34] by bettyjagessar.com (SMTPD32-7.06 EVAL) id A42A7FC01F2; Fri, 02 Aug 2002 02:18:18 -0400 Message-Id: <1028311679.886@0.57.142> Date: Fri, 02 Aug 2002 23:37:59 0530 To: ilug@linux.ie From: "Start Now" <startnow2002@hotmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII"; format=flowed Subject: [ILUG] STOP THE MLM INSANITY Sender: ilug-admin@linux.ie Errors-To: ilug-admin@linux.ie X-Mailman-Version: 1.1 Precedence: bulk List-Id: Irish Linux Users' Group <ilug.linux.ie> X-Beenthere: ilug@linux.ie Greetings! You are receiving this letter because you have expressed an interest in receiving information about online business opportunities. If this is erroneous then please accept my most sincere apology. This is a one-time mailing, so no removal is necessary. If you've been burned, betrayed, and back-stabbed by multi-level marketing, MLM, then please read this letter. It could be the most important one that has ever landed in your Inbox. MULTI-LEVEL MARKETING IS A HUGE MISTAKE FOR MOST PEOPLE MLM has failed to deliver on its promises for the past 50 years. The pursuit of the "MLM Dream" has cost hundreds of thousands of people their friends, ===================================================== == File: third-party/spamassassin/sample-configuration/extensions.properties ===================================================== guice.extension.module=org.apache.james.spamassassin.SpamAssassinModule ===================================================== == File: third-party/spamassassin/sample-configuration/spamassassin.properties ===================================================== spamassassin.host=localhost spamassassin.port=783 ===================================================== == File: event-sourcing/event-sourcing-core/event-sourcing-core.iml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <module version="4"> <component name="AdditionalModuleElements"> <content url="file://$MODULE_DIR$" dumb="true"> <sourceFolder url="file://$MODULE_DIR$/src/main/scala" isTestSource="false" /> </content> </component> </module> ===================================================== == File: backends-common/opensearch/src/test/resources/auth-es/nginx-conf/reverse_elasticsearch.conf ===================================================== server { listen 9200 ssl; ssl_certificate /etc/ssl/certs/default.crt; ssl_certificate_key /etc/ssl/private/default.key; server_name reverse_elasticsearch; auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/conf.d/passwd; location / { proxy_pass http://elasticsearch:9200; } } ===================================================== == File: backends-common/opensearch/src/test/resources/auth-es/nginx-conf/passwd ===================================================== # the default credential: elasticsearch:secret elasticsearch:$apr1$m5FvKpw7$EZ9UEUCilHyKTIqQ57nWG1 ===================================================== == File: backends-common/opensearch/src/test/resources/auth-es/NginxDockerfile ===================================================== FROM nginx:1.25 COPY conf/nginx-conf/ /etc/nginx/conf.d/ COPY conf/default.crt /etc/ssl/certs/default.crt COPY conf/default.key /etc/ssl/private/default.key ===================================================== == File: backends-common/opensearch/src/test/resources/auth-es/README.md ===================================================== ## Resources explanation ### nginx-conf Contains nginx configuration files: - reverse_elasticsearch.conf: allow nginx to be the proxy connecting to OpenSearch - passwd: Nginx credentials file store, each record follows the format: `username:encrypted-password` TODO This set up is inherited from ElasticSearch where the security plugin was proprietary and this was our only way to test things like SSL, auth. Now that we use OpenSearch we could instead rely on OpenSearch native features. ### default.crt & default.key public (.crt) and private (.key) of the self signed SSL certification. It will be loaded by nginx ### server.jks Once you use a http client connect to nginx by `https` protocol, the default behavior of the client is rejecting the connection because self signed SSL certification provided by nginx is not recognized by the client. To deal with this problem, there are two ways to configure the client: - Not recommended in production, ignore SSL Validation - Configure the client to use local TrustStore file containing the .crt, then it should trust nginx. The `server.jks` is generated by the command ``` keytool -import -v -trustcacerts -file default.crt -keystore server.jks -keypass mypass -storepass mypass ``` With: - password: `mypass` ===================================================== == File: backends-common/opensearch/src/test/resources/auth-es/default.key ===================================================== -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAwyDNIXe5OeNI/Bf2LUUSF2koINYB9Z2D9qsxYjXB02NrPmPA DRjiE9c3XgCsiQdkJv008lltTNyvJ5O/ARtnzOpDn6CGIZ8aH08VzP5ECs5jak+c gc5dVloEhbGTOUVq10mh02FuTG36CY+LnEWXAOo8yKOcA4jiAtzFA8buZbJGmgPx hTOYw0VMmvXEUBVdwlT4Uk8/3OE4VGQZecO6mnzP1Fh7D5vf1UaBrrMcUYg/6Igx UmcSZbb9NDUoTnZvkHjlt8bGUXuTTTeQh5pmwdtoiyF00wjP7DhvPLBc1fIB9lxx EZ+to1e5K/SMA9I76cX3LIChyfPdBc6yZIbPbwIDAQABAoIBAQC+DHmeyjQPDK8u UcxE5UwsnxAlgysfZY59Ntn/dKpW0DNI7fDFEOJJPsm/ddqWECvcyavDC5SoUx0J 6B4V3vJnpBe/JqLdpk/UBLwQD+qHt+MeTXH6/9rq2vwilwT0uAbKrv29mtzJ9ied HkF1MFZV3s7bAHdY/f5bmVkOR7g0NQ6QLuXYiLDSHpu/7dMVBNS9qMNL292cZbpi KJZUvyrK6jSOh9Dt3fmWVdjRp5nGd/Z0r32A8UdoWiQ3cXe9uwXVxz8+ZGkP4t44 Ob+YcgHUEz6iI2o7nqWpNtPI+hBWH1YK/Szlay3rTZSKvkNG1Sdwm1UhoJqNFucC 7ZWkH8GxAoGBAOSpP9lrB0sXCGwhD3xbAYCZsTgomSQ13X6/daKdN9fxpegK7v5r baojBoSvIKiKezHzMiL5IiEhESXEvXQigFNORdf9mFs9Z9ec4I/96dQNYM4d1QtM nz3dABt62po8ROCA4Y26ar+OmcJ2kv0RPuJCDGkrY1Is7SNTtGi+HW55AoGBANp1 MJi3VHS9oEF8dslgLkZMZWPgcwJK2Y3wYIkatmxuVkWYdRFPqWWwlXUU17KH7eqm iEONLNyI7g/duFFTbz52MkeMpX6xarXddYkS2HMDUqSTgt3T+ULHVhTtlEEBXg6m 5cx/eg8niJ6VH+vFtRcYrActLg751mjNgz8fmBMnAoGBAMwj4fHsIIXEWWuXlGi0 IsI59EKr1BTE1isLKS11aN6sSS7BXB7dr/k97drVMrXldBjjArbAbtze1Z0/aNhe 2OwGrEopiDSkvKl8z+sdh/0duHgroADHdj9Xp3nhE3qxJdi8lyHd9OFxoQpAq/es xtRenQ/jgXdizo9EcoM0f7gZAoGARw6ZSQNQyEwpxUM7zBKp2pnc3NjT7+nyy7Vl YRM8RRa6nxaQ9ZmIyxfd9WBbLKoEHDAg4IAaGH29mZGP83wFEjcV8anw5r3ErPUk 1vo3R2nMRtXoWkkpqav29wW0FFTiiDeHRbYtOKKuUI7G/ESpu6J9yjPK6HohYKOA Tlbzez8CgYAFhpoeHO2X06pEsFeI6rMtc0rS0EHuVuqfjjyEMOyQZ8BsCWzDZBDW N9rxd0yz80H1Q33dwzrkiVu15e+JMNb5I80Ou0t+LQVYpvhtM89yKoLFk2HqL+eH wQJ/Fszj8fwdwx+k2DEve8MVHSx/w9CpwM7B2yGxcUFKi/JSM1rQEw== -----END RSA PRIVATE KEY----- ===================================================== == File: backends-common/opensearch/src/test/resources/auth-es/default.crt ===================================================== -----BEGIN CERTIFICATE----- MIIDBjCCAe4CCQDbp5K1cKRJgjANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 cyBQdHkgTHRkMB4XDTE4MDcwMjEyNDkxMloXDTE5MDcwMjEyNDkxMlowRTELMAkG A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0 IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AMMgzSF3uTnjSPwX9i1FEhdpKCDWAfWdg/arMWI1wdNjaz5jwA0Y4hPXN14ArIkH ZCb9NPJZbUzcryeTvwEbZ8zqQ5+ghiGfGh9PFcz+RArOY2pPnIHOXVZaBIWxkzlF atdJodNhbkxt+gmPi5xFlwDqPMijnAOI4gLcxQPG7mWyRpoD8YUzmMNFTJr1xFAV XcJU+FJPP9zhOFRkGXnDupp8z9RYew+b39VGga6zHFGIP+iIMVJnEmW2/TQ1KE52 b5B45bfGxlF7k003kIeaZsHbaIshdNMIz+w4bzywXNXyAfZccRGfraNXuSv0jAPS O+nF9yyAocnz3QXOsmSGz28CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAFRDXedF9 hjuEmLjETBwhh5Zgg102GDJp58ZBkLE1IaT4mrbK90mhpzxsaxbuqOdu3PXJV4tc SEocxj5hk5ivVZiWk/j8YJmB8ZOUKdeOxc1tfratlonJ85AY+6m02+FhjUnWobmg HVBepFTJt1iaTgOpVf8YpbYW+L6+kWV9C2CtT3WUhxtllKjokbF+YVN7LnDlbynM 80+aGm+rdg+TUusg+T/2FeVlDyBgbqagBcCQCQacWD2+zzL28XB3PwRE6oU/tKuu rbCsGZE0WH8Pc7p6J/alRr+foQiu7KKJKJ8pO1qdy716DlmPIDN23iZROIu1GKKl ZIKfyefPUcwHyw== -----END CERTIFICATE----- ===================================================== == File: backends-common/rabbitmq/src/test/resources/empty-store ===================================================== ===================================================== == File: backends-common/redis/src/test/resources/sentinel_tls.conf ===================================================== dir /tmp sentinel resolve-hostnames yes sentinel monitor mymaster redis1 6379 2 sentinel auth-pass mymaster 123 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1 tls-replication yes tls-port 26379 port 0 tls-auth-clients yes tls-ca-cert-file /etc/redis/rootCA.crt tls-key-file /etc/redis/private.key tls-cert-file /etc/redis/certificate.crt ===================================================== == File: backends-common/redis/src/test/resources/sentinel.conf ===================================================== dir /tmp sentinel resolve-hostnames yes sentinel monitor mymaster redis1 6379 2 sentinel auth-pass mymaster 123 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1 requirepass "321" ===================================================== == File: backends-common/redis/src/test/resources/redis_cluster.conf ===================================================== # Custom config file to enable cluster mode # on all Redis instances started via Docker cluster-enabled yes # The cluster file is created and managed by Redis # We just need to declare it here cluster-node-timeout 3000 appendonly yes ===================================================== == File: backends-common/redis/src/test/resources/private.key ===================================================== -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAwtxnAa7Vc53o/+/4aqU6d5+YfZjUXQZ7WFF6bf5zv/8ZtG3F eZjIbFbqgoxbu50493RsYcJcuTdUfyXTy+tK3vvKHjglK+uO9h0ySGqhOknrcVkv v5qjWIQppR2Ritsgrx9W6YBhiHOugY4bvr2wDAwwH1Z8/+EdDJJc2nBtyrSW9I/p GrgSpwHtSXCL/lifeQWxchJmPfdvzxiTFCHkjxTBCgmuqzpCmDA0FFfm65ZbN4Wt ahx/niOtbOhGVXBLbD0zlSvkRk862yDs0YrD0a+dCivHP/st3RhTFuhRGAx5ORO6 ePyNKI21+4GVUjBgFl4efDBO/u1DGhhLZ0K4hwIDAQABAoIBAQCCyVGttH35qswf NB6E3b9fWNQNwI0QnvAcuBs3RmjEPeEv09mOIriq1q9xzekoBH+evxqbhsubWQKy kF4WaSeIgHEJVV/FmcYLdE8ygbcTG1gWbOj6bj0ihRo6g50TGL5YK+22rX9JCXPf 6tS+cix9+ZQ3BGLDj4Fi1b3Ss1FNkjnjHycnEvhIhEunJ+DGYRj18SycZL7OyDRU khksMVuimcW8jx8kxvH38sj+MDbTvaFc/ukoS46tBKz9ZDJ553I0PTSHZfMw77+a x346j1gvkQCejjlVD2J7kRlEMYdPn52wzXmJyzAE/UpragSL1mxDaE0Yhl1qkGDG asAZZh2pAoGBAOs7zTF48b+NDbgQlDR57yaIiyDaMX2o9N0t+ob+y5HQr6F9LHE/ Bjs83X7IMqFQsc25Ytd8jsYzX7qfjVuhMs+wMhRyTO8+nYAYHBTKL8UvCU+xzA5z xzcNLHOOyx2G4ZAb5aSgrX8/BZpZPxLictf8H/IPh42FNZv4b6YNezrTAoGBANQQ MVih4nM68BGncQpuX25dR/InoMchzJktlYILlHgYmeJu/FTiHqdaLZDgbIBnXdVB GGlMXIjesiC7gSGM23s8Yau047Pn8PQsC1a9Q8fS9CXmhqJmqjE3Fl793Q6vemQj cPc1Glg2wQ8iZ9mpAiRSQBRcNCMNZgnVFs7MllL9AoGBAN6NcZEA0BdeKECgztbn Fe/q91ZZmME+fIxV19Soc4i9W6z5dHagHhElgJlWZzBf3Bi68FzXJ201Zbh3A5JR bHU6Sec2TLt9Dh4GsWqp75Aq9DBGEr0JpMzc1dVun5SL7BQfkKC0s/DTe0WQcjA3 tlfJ3Z9yOdkW0qWB4n/D+XapAoGBAI3gP4Ny2xQIzHCjO6ek7EfkNKw4AwL3A/E/ ZBVbNfubSekKI9uOZL/GP1H8M9s8TLTOFkzsf8Q6aaYojF4r5PNwFFBSdzz34mcZ yIRBn8Vix2FL96tTUG4Y0ui+o1Sd5h5077EUYAnAqC098YjX38z5ElIM1fzVi/zs CZRVoATpAoGAP2UyFMYfXBAc4KmWsr8qLRegVHSsdWtuKDNxffM3kLS4AVYUF0Sl yGvit2PZG/z1FfjQTVuVjuTK/01xw7fWaVU16oqictneIQT7RS2Q5q0dNRxca9G5 f2+Cbztk8Hkqak4SEpMclq0FoIjwIiX586x0DuA2V37ApL21l1He+no= -----END RSA PRIVATE KEY----- ===================================================== == File: backends-common/redis/src/test/resources/rootCA.crt ===================================================== -----BEGIN CERTIFICATE----- MIID5TCCAs2gAwIBAgIUASoDQ2Wf0Mef+y9bfCqSMy6hFfMwDQYJKoZIhvcNAQEL BQAwgYAxCzAJBgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5vaTEOMAwGA1UEBwwFSGFu b2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVKYW1lczEOMAwGA1UEAwwF YWRtaW4xHjAcBgkqhkiG9w0BCQEWD2FkbWluQGphbWVzLm9yZzAgFw0yNDA4MTUw ODQzNDBaGA8yMjk4MDUzMTA4NDM0MFowgYAxCzAJBgNVBAYTAlZOMQ4wDAYDVQQI DAVIYW5vaTEOMAwGA1UEBwwFSGFub2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYD VQQLDAVKYW1lczEOMAwGA1UEAwwFYWRtaW4xHjAcBgkqhkiG9w0BCQEWD2FkbWlu QGphbWVzLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMShojs1 MXL0IAAjmuLTYoNzXGTjfsmdIi+M9n/I5+QGpixcQzaX5uniP6b+AgsIhRlQPN+W ixwWmpnDhZu+bV7bgJKXv0YmoKaGQGDb5N/PfuDpfGuVzQphjjtQP7jmW3wpqzNa MBT03z5nK/WBxeMJXE9bYNT5rP28YCDg0f8sSKSZkMUdlYfoUm+vYH9+bmIwzaTF 6kRc6M+n/ELzDvDS+KevtJ3q4P710qTukH7uXEVEzs/lUSVtHXg/HrJ7tld3bnrq ASDB0EmPljqjsHJB/f3n4PoT/Ansc4r4vjASQCPzr2yq6e7jHnU+QN4pXGUQv5Rd zGqThOSRnyvQSgcCAwEAAaNTMFEwHQYDVR0OBBYEFJLv8+NebeBDDJWLpb3cD+kF aIjeMB8GA1UdIwQYMBaAFJLv8+NebeBDDJWLpb3cD+kFaIjeMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFal8TpKaOBESJC9Nhb71Ivw8fV+kGdq YySdseOnuXgAorXfs6MK0ko/rbrTJjS9JImbFcxTqHim+kTTsiy3wvYBUi77DKoS XVhl5EuNkdkMG1EhR1kC7SUJv5C4o7i1OZIJwf7ATWyo/KbEezIIlvS7Jz9q7EOG 9zm57k+noY/BvbcRCh0CmOyD5MuyFGw+PitPiWzsWTK0PCBKRKwzRi0hbw/w4PHk ur+/0bhMVU4kuE7SquRn3pjoxtQqYGy55xEAl/Rkzd5a9PD7vTnf3o2RcA5/K/5N HJL1vvH3jMNLXBy/t3Uek5H/6BM8qxtAqNoJcnCfbm7zYz2GFGXThr0= -----END CERTIFICATE----- ===================================================== == File: backends-common/redis/src/test/resources/certificate.crt ===================================================== -----BEGIN CERTIFICATE----- MIIDiDCCAnACFA13culxEf5FhyuNZUycVScFz2UOMA0GCSqGSIb3DQEBCwUAMIGA MQswCQYDVQQGEwJWTjEOMAwGA1UECAwFSGFub2kxDjAMBgNVBAcMBUhhbm9pMREw DwYDVQQKDAhMaW5hZ29yYTEOMAwGA1UECwwFSmFtZXMxDjAMBgNVBAMMBWFkbWlu MR4wHAYJKoZIhvcNAQkBFg9hZG1pbkBqYW1lcy5vcmcwIBcNMjQwODE1MDkyNjQw WhgPMjI5ODA1MzEwOTI2NDBaMH4xCzAJBgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5v aTEOMAwGA1UEBwwFSGFub2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVK YW1lczENMAsGA1UEAwwEdXNlcjEdMBsGCSqGSIb3DQEJARYOdXNlckBqYW1lcy5v cmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC3GcBrtVznej/7/hq pTp3n5h9mNRdBntYUXpt/nO//xm0bcV5mMhsVuqCjFu7nTj3dGxhwly5N1R/JdPL 60re+8oeOCUr6472HTJIaqE6SetxWS+/mqNYhCmlHZGK2yCvH1bpgGGIc66Bjhu+ vbAMDDAfVnz/4R0MklzacG3KtJb0j+kauBKnAe1JcIv+WJ95BbFyEmY992/PGJMU IeSPFMEKCa6rOkKYMDQUV+brlls3ha1qHH+eI61s6EZVcEtsPTOVK+RGTzrbIOzR isPRr50KK8c/+y3dGFMW6FEYDHk5E7p4/I0ojbX7gZVSMGAWXh58ME7+7UMaGEtn QriHAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACDnWoIqpUCxUdYzbu6MABXliudg yCHRvzRkc8l1h0J7QsLnimhfmV9ujZw+u0dBy722ueToecqMRo3CQhVz/KdGOsXK mRF5uOk4A6fWEJcpxwVNfHmMz99JUOQFryZlirAAmJVKWQYHBizQX2PSRG8bBA9p S3GpLgaA9b2ltxE0B/E5GSivIEeA2CwwUjhPBFTxpgdTbEYCDwhLhQ3d68i2jL8/ NuUA+6RlYESJiJuJa6VXinbl3LEjNCGoaw8S+Jln6XMtF+KNpLfiZcY4fA92k18n YxEYYBYHDk2B457LlknIHHYlAvwVA85a2PfaRuIuEzJtfdui1QHv9JZIKL4= -----END CERTIFICATE----- ===================================================== == File: backends-common/redis/pom.xml ===================================================== <?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.james</groupId> <artifactId>james-backends-common</artifactId> <version>3.9.0-SNAPSHOT</version> </parent> <artifactId>apache-james-backends-redis</artifactId> <name>Apache James :: Backends Common :: Redis</name> <dependencies> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-core</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-filesystem-api</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-guice-common</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-testing</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-util</artifactId> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>eu.timepit</groupId> <artifactId>refined_${scala.base}</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>io.lettuce</groupId> ===================================================== == File: backends-common/README.adoc ===================================================== = backends-common This project intends to share implementation details for commonly used back-ends accross james projects. For instance, as we are implementing a cassandra storage backend for James, we need to : - Use tools to help to work with Cassandra in james-mailbox project - We need to access test helpers in james-mpt project - We need the same tools than those introduce in james-mailbox in James server data. ===================================================== == File: backends-common/cassandra/src/test/resources/cassandra-driver.conf ===================================================== datastax-java-driver { basic.request { timeout = 5 seconds } } ===================================================== == File: backends-common/cassandra/src/test/resources/configuration-reader-test/cassandra.properties ===================================================== mailbox.max.retry.acl=1 mailbox.max.retry.modseq=2 mailbox.max.retry.uid=3 mailbox.max.retry.message.flags.update=4 mailbox.max.retry.message.id.flags.update=5 fetch.advance.row.count=6 chunk.size.expunge=8 mailbox.blob.part.size=9 attachment.v2.migration.read.timeout=10 message.attachmentids.read.timeout=11 cassandra.consistency_level.regular=LOCAL_QUORUM cassandra.consistency_level.lightweight_transaction=LOCAL_SERIAL ===================================================== == File: README.adoc ===================================================== Apache James Project ==================== :latest_james_version: 3.8.0 image:https://img.shields.io/badge/Join%20us-Mailing%20lists-purple.svg[link="https://james.apache.org/mail.html"] link:https://gitter.im/apache/james-project[image:https://badges.gitter.im/apache/james-project.svg[Join the chat at link:https://gitter.im/apache/james-project]] image:https://img.shields.io/badge/CI-Jenkins-blue.svg[link="https://ci-builds.apache.org/job/james/job/ApacheJames/"] image:https://img.shields.io/badge/Documentation-green.svg[link="https://james.apache.org/documentation.html"] image:https://img.shields.io/badge/Downloads-{latest_james_version}-yellow.svg[link="https://james.apache.org/download.cgi"] image:https://img.shields.io/badge/Images-docker-blue.svg[link="https://hub.docker.com/r/apache/james"] image:https://img.shields.io/badge/License-ApacheV2-orange.svg[link="https://www.apache.org/licenses/"] image:https://img.shields.io/badge/Latests-news-red.svg[link="https://james.apache.org/index.html#posts"] image::james-logo.png[link="https://james.apache.org"] *James* stands for *Java Apache Mail Enterprise Server!* It has a modular architecture based on a rich set of *modern* and *efficient* components which provides at the end *complete, stable, secure and extendable Mail Servers running on the JVM*. Create your *own personal solution* for emails treatment by assembling the components you need thanks to the Inversion of Control mail platform offered and go further customizing filtering and routing rules using *James Mailet Container*. Supported protocols are: IMAP, SMTP, link:https://jmap.io[JMAP], POP3 and more... The link:https://james.staged.apache.org/james-distributed-app/{latest_james_version}/index.html[*Distributed server*] focuses on delivering an easy-to-operate scalable mail server based on modern technologies (Cassandra, S3, OpenSearch and RabbitMQ). Read more on https://james.apache.org/[our website]. == How to contribute? .Read more... [%collapsible] ==== James is a project that lives from the contributions of its community! Anyone can contribute! Read https://james.apache.org/index.html#third[how to contribute]. We more than welcome *articles* and *blog posts* about James. Contact us by https://james.apache.org/mail.html[email] or on https://gitter.im/apache/james-project[Gitter] to share your experiences. *Documentation* is an easy way to get started, and more than wanted! Check out the https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20documentation%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~documentation] label on JIRA. And to get started with *code contributions*, search out the https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20newbie%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~newbie], https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20easyfix%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~easyfix], https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20feature%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~feature] labels on JIRA. ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1985.txt ===================================================== Network Working Group J. De Winter Request for Comments: 1985 Wildbear Consulting, Inc. Category: Standards Track August 1996 SMTP Service Extension for Remote Message Queue Starting Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract This memo defines an extension to the SMTP service whereby an SMTP client and server may interact to give the server an opportunity to start the processing of its queues for messages to go to a given host. This extension is meant to be used in startup conditions as well as for mail nodes that have transient connections to their service providers. 1. Introduction The TURN command was a valid attempt to address the problem of having to start the processing for the mail queue on a remote machine. However, the TURN command presents a large security loophole. As there is no verification of the remote host name, the TURN command could be used by a rogue system to download the mail for a site other than itself. Therefore, this memo introduces the ETRN command. This command uses the mechanism defined in [4] to define extensions to the SMTP service whereby a client ("sender-SMTP") may request that the server ("receiver-SMTP") start the processing of its mail queues for messages that are waiting at the server for the client machine. If any messages are at the server for the client, then the server should create a new SMTP session and send the messages at that time. ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc2554.txt ===================================================== Network Working Group J. Myers Request for Comments: 2554 Netscape Communications Category: Standards Track March 1999 SMTP Service Extension for Authentication Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1999). All Rights Reserved. 1. Introduction This document defines an SMTP service extension [ESMTP] whereby an SMTP client may indicate an authentication mechanism to the server, perform an authentication protocol exchange, and optionally negotiate a security layer for subsequent protocol interactions. This extension is a profile of the Simple Authentication and Security Layer [SASL]. 2. Conventions Used in this Document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" in this document are to be interpreted as defined in "Key words for use in RFCs to Indicate Requirement Levels" [KEYWORDS]. 3. The Authentication service extension ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1652.txt ===================================================== Network Working Group J. Klensin, WG Chair Request for Comments: 1652 MCI Obsoletes: 1426 N. Freed, Editor Category: Standards Track Innosoft M. Rose Dover Beach Consulting, Inc. E. Stefferud Network Management Associates, Inc. D. Crocker Silicon Graphics, Inc. July 1994 SMTP Service Extension for 8bit-MIMEtransport Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract This memo defines an extension to the SMTP service whereby an SMTP content body consisting of text containing octets outside of the US- ASCII octet range (hex 00-7F) may be relayed using SMTP. 1. Introduction Although SMTP is widely and robustly deployed, various extensions have been requested by parts of the Internet community. In particular, a significant portion of the Internet community wishes to exchange messages in which the content body consists of a MIME message [3] containing arbitrary octet-aligned material. This memo uses the mechanism described in [5] to define an extension to the SMTP service whereby such contents may be exchanged. Note that this extension does NOT eliminate the possibility of an SMTP server limiting line length; servers are free to implement this extension but nevertheless set a line length limit no lower than 1000 octets. Given that this restriction still applies, this extension does NOT provide a means for transferring unencoded binary via SMTP. ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1830.txt ===================================================== Network Working Group G. Vaudreuil Request for Comments: 1830 Octel Network Services Category: Experimental August 1995 SMTP Service Extensions for Transmission of Large and Binary MIME Messages Status of this Memo This memo defines an Experimental Protocol for the Internet community. This memo does not specify an Internet standard of any kind. Discussion and suggestions for improvement are requested. Distribution of this memo is unlimited. 1. Abstract This memo defines two extensions to the SMTP service. The first service enables a SMTP client and server to negotiate the use of an alternate DATA command "BDAT" for efficiently sending large MIME messages. The second extension takes advantage of the BDAT command to permit the negotiated sending of unencoded binary data. 2. Introduction The MIME extensions to the Internet message protocol provides for the transmission of many kinds of data which were previously unsupported in Internet mail. Anticipating the need to more efficiently transport the new media made possible with MIME, the SMTP protocol has been extended to provide transport for new message types. RFC 1426 defines one such extension for the transmission of unencoded 8 bit MIME messages [8BIT]. This service extension permits the receiver SMTP to declare support for 8 bit body parts and the sender to request 8 bit transmission of a particular message. One expected result of the use of MIME is that the Internet mail system will be expected to carry very large mail messages. In such transactions, there is a need to eliminate the requirement that the message be scanned for "CR LF . CR LF" sequences upon sending and receiving to detect the end of message. Independent of the need to send large messages, Internet mail is increasingly multi-media there is a need to avoid the overhead of base64 and quoted-printable encoding of binary objects sent using the ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc2142.txt ===================================================== Network Working Group D. Crocker Request for Comments: 2142 Internet Mail Consortium Cateogry: Standards Track May 1997 MAILBOX NAMES FOR COMMON SERVICES, ROLES AND FUNCTIONS Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. ABSTRACT This specification enumerates and describes Internet mail addresses (mailbox name @ host reference) to be used when contacting personnel at an organization. Mailbox names are provided for both operations and business functions. Additional mailbox names and aliases are not prohibited, but organizations which support email exchanges with the Internet are encouraged to support AT LEAST each mailbox name for which the associated function exists within the organization. 1. RATIONALE AND SCOPE Various Internet documents have specified mailbox names to be used when reaching the operators of the new service; for example, [RFC822 6.3, C.6] requires the presence of a <POSTMASTER@domain> mailbox name on all hosts that have an SMTP server. Other protocols have defacto standards for well known mailbox names, such as <USENET@domain> for NNTP (see [RFC977]), and <WEBMASTER@domain> for HTTP (see [HTTP]). Defacto standards also exist for well known mailbox names which have nothing to do with a particular protocol, e.g., <ABUSE@domain> and <TROUBLE@domain>. The purpose of this memo is to aggregate and specify the basic set of mailbox names which organizations need to support. Most organizations do not need to support the full set of mailbox names defined here, since not every organization will implement the all of the associated services. However, if a given service is offerred, then the associated mailbox name(es) must be supported, resulting in delivery to a recipient appropriate for the referenced service or ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc2034.txt ===================================================== Network Working Group N. Freed Request for Comments: RFC 2034 Innosoft Category: Standards Track October 1996 SMTP Service Extension for Returning Enhanced Error Codes Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract This memo defines an extension to the SMTP service [RFC-821, RFC- 1869] whereby an SMTP server augments its responses with the enhanced mail system status codes defined in RFC 1893. These codes can then be used to provide more informative explanations of error conditions, especially in the context of the delivery status notifications format defined in RFC 1894. 2. Introduction Although SMTP is widely and robustly deployed, various extensions have been requested by parts of the Internet community. In particular, in the modern, international, and multilingual Internet a need exists to assign codes to specific error conditions that can be translated into different languages. RFC 1893 defines such a set of status codes and RFC 1894 defines a mechanism to send such coded material to users. However, in many cases the agent creating the RFC 1894 delivery status notification is doing so in response to errors it received from a remote SMTP server. As such, remote servers need a mechanism for embedding enhanced status codes in their responses as well as a way to indicate to a client when they are in fact doing this. This memo uses the SMTP extension mechanism described in RFC 1869 to define such a mechanism. ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1891.txt ===================================================== Network Working Group K. Moore Request for Comments: 1891 University of Tennessee Category: Standards Track January 1996 SMTP Service Extension for Delivery Status Notifications Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract This memo defines an extension to the SMTP service, which allows an SMTP client to specify (a) that delivery status notifications (DSNs) should be generated under certain conditions, (b) whether such notifications should return the contents of the message, and (c) additional information, to be returned with a DSN, that allows the sender to identify both the recipient(s) for which the DSN was issued, and the transaction in which the original message was sent. Any questions, comments, and reports of defects or ambiguities in this specification may be sent to the mailing list for the NOTARY working group of the IETF, using the address <notifications@cs.utk.edu>. Requests to subscribe to the mailing list should be addressed to <notifications-request@cs.utk.edu>. Implementors of this specification are encouraged to subscribe to the mailing list, so that they will quickly be informed of any problems which might hinder interoperability. NOTE: This document is a Proposed Standard. If and when this protocol is submitted for Draft Standard status, any normative text (phrases containing SHOULD, SHOULD NOT, MUST, MUST NOT, or MAY) in this document will be re-evaluated in light of implementation experience, and are thus subject to change. 2. Introduction The SMTP protocol [1] requires that an SMTP server provide notification of delivery failure, if it determines that a message ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc0974.txt ===================================================== Network Working Group Craig Partridge Request for Comments: 974 CSNET CIC BBN Laboratories Inc January 1986 MAIL ROUTING AND THE DOMAIN SYSTEM Status of this Memo This RFC presents a description of how mail systems on the Internet are expected to route messages based on information from the domain system described in RFCs 882, 883 and 973. Distribution of this memo is unlimited. Introduction The purpose of this memo is to explain how mailers are to decide how to route a message addressed to a given Internet domain name. This involves a discussion of how mailers interpret MX RRs, which are used for message routing. Note that this memo makes no statement about how mailers are to deal with MB and MG RRs, which are used for interpreting mailbox names. Under RFC-882 and RFC-883 certain assumptions about mail addresses have been changed. Up to now, one could usually assume that if a message was addressed to a mailbox, for example, at LOKI.BBN.COM, that one could just open an SMTP connection to LOKI.BBN.COM and pass the message along. This system broke down in certain situations, such as for certain UUCP and CSNET hosts which were not directly attached to the Internet, but these hosts could be handled as special cases in configuration files (for example, most mailers were set up to automatically forward mail addressed to a CSNET host to CSNET-RELAY.ARPA). Under domains, one cannot simply open a connection to LOKI.BBN.COM, but must instead ask the domain system where messages to LOKI.BBN.COM are to be delivered. And the domain system may direct a mailer to deliver messages to an entirely different host, such as SH.CS.NET. Or, in a more complicated case, the mailer may learn that it has a choice of routes to LOKI.BBN.COM. This memo is essentially a set of guidelines on how mailers should behave in this more complex world. Readers are expected to be familiar with RFCs 882, 883, and the updates to them (e.g., RFC-973). ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc2821.txt ===================================================== Network Working Group J. Klensin, Editor Request for Comments: 2821 AT&T Laboratories Obsoletes: 821, 974, 1869 April 2001 Updates: 1123 Category: Standards Track Simple Mail Transfer Protocol Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (2001). All Rights Reserved. Abstract This document is a self-contained specification of the basic protocol for the Internet electronic mail transport. It consolidates, updates and clarifies, but doesn't add new or change existing functionality of the following: - the original SMTP (Simple Mail Transfer Protocol) specification of RFC 821 [30], - domain name system requirements and implications for mail transport from RFC 1035 [22] and RFC 974 [27], - the clarifications and applicability statements in RFC 1123 [2], and - material drawn from the SMTP Extension mechanisms [19]. It obsoletes RFC 821, RFC 974, and updates RFC 1123 (replaces the mail transport materials of RFC 1123). However, RFC 821 specifies some features that were not in significant use in the Internet by the mid-1990s and (in appendices) some additional transport models. Those sections are omitted here in the interest of clarity and brevity; readers needing them should refer to RFC 821. ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1870.txt ===================================================== Network Working Group J. Klensin, WG Chair Request For Comments: 1870 MCI STD: 10 N. Freed, Editor Obsoletes: 1653 Innosoft International, Inc. Category: Standards Track K. Moore University of Tennessee November 1995 SMTP Service Extension for Message Size Declaration Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract This memo defines an extension to the SMTP service whereby an SMTP client and server may interact to give the server an opportunity to decline to accept a message (perhaps temporarily) based on the client's estimate of the message size. 2. Introduction The MIME extensions to the Internet message protocol provide for the transmission of many kinds of data which were previously unsupported in Internet mail. One expected result of the use of MIME is that SMTP will be expected to carry a much wider range of message sizes than was previously the case. This has an impact on the amount of resources (e.g. disk space) required by a system acting as a server. This memo uses the mechanism defined in [5] to define extensions to the SMTP service whereby a client ("sender-SMTP") may declare the size of a particular message to a server ("receiver-SMTP"), after which the server may indicate to the client that it is or is not willing to accept the message based on the declared message size and whereby a server ("receiver-SMTP") may declare the maximum message size it is willing to accept to a client ("sender-SMTP"). ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc2197.txt ===================================================== Network Working Group N. Freed Request for Comments: 2197 Innosoft Obsoletes: 1854 September 1997 Category: Standards Track SMTP Service Extension for Command Pipelining Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract This memo defines an extension to the SMTP service whereby a server can indicate the extent of its ability to accept multiple commands in a single TCP send operation. Using a single TCP send operation for multiple commands can improve SMTP performance significantly. The present document is an updated version of RFC 1854 [3]. Only textual and editorial changes have been made; the protocol has not changed in any way. 2. Introduction Although SMTP is widely and robustly deployed, certain extensions may nevertheless prove useful. In particular, many parts of the Internet make use of high latency network links. SMTP's intrinsic one command-one response structure is significantly penalized by high latency links, often to the point where the factors contributing to overall connection time are dominated by the time spent waiting for responses to individual commands (turnaround time). In the best of all worlds it would be possible to simply deploy SMTP client software that makes use of command pipelining: batching up multiple commands into single TCP send operations. Unfortunately, the original SMTP specification [1] did not explicitly state that SMTP servers must support this. As a result a non-trivial number of Internet SMTP servers cannot adequately handle command pipelining. Flaws known to exist in deployed servers include: ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc0821.txt ===================================================== RFC 821 SIMPLE MAIL TRANSFER PROTOCOL Jonathan B. Postel August 1982 Information Sciences Institute University of Southern California 4676 Admiralty Way Marina del Rey, California 90291 ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1869.txt ===================================================== Network Working Group J. Klensin, WG Chair Request For Comments: 1869 MCI STD: 10 N. Freed, Editor Obsoletes: 1651 Innosoft International, Inc. Category: Standards Track M. Rose Dover Beach Consulting, Inc. E. Stefferud Network Management Associates, Inc. D. Crocker Brandenburg Consulting November 1995 SMTP Service Extensions Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract This memo defines a framework for extending the SMTP service by defining a means whereby a server SMTP can inform a client SMTP as to the service extensions it supports. Extensions to the SMTP service are registered with the IANA. This framework does not require modification of existing SMTP clients or servers unless the features of the service extensions are to be requested or provided. 2. Introduction The Simple Mail Transfer Protocol (SMTP) [1] has provided a stable, effective basis for the relay function of message transfer agents. Although a decade old, SMTP has proven remarkably resilient. Nevertheless, the need for a number of protocol extensions has become evident. Rather than describing these extensions as separate and haphazard entities, this document enhances SMTP in a straightforward fashion that provides a framework in which all future extensions can be built in a single consistent way. 3. Framework for SMTP Extensions ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc1893.txt ===================================================== Network Working Group G. Vaudreuil Request for Comments: 1893 Octel Network Services Category: Standards Track January 1996 Enhanced Mail System Status Codes Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Overview There currently is not a standard mechanism for the reporting of mail system errors except for the limited set offered by SMTP and the system specific text descriptions sent in mail messages. There is a pressing need for a rich machine readable status code for use in delivery status notifications [DSN]. This document proposes a new set of status codes for this purpose. SMTP [SMTP] error codes have historically been used for reporting mail system errors. Because of limitations in the SMTP code design, these are not suitable for use in delivery status notifications. SMTP provides about 12 useful codes for delivery reports. The majority of the codes are protocol specific response codes such as the 354 response to the SMTP data command. Each of the 12 useful codes are each overloaded to indicate several error conditions each. SMTP suffers some scars from history, most notably the unfortunate damage to the reply code extension mechanism by uncontrolled use. This proposal facilitates future extensibility by requiring the client to interpret unknown error codes according to the theory of codes while requiring servers to register new response codes. The SMTP theory of reply codes partitioned in the number space such a manner that the remaining available codes will not provide the space needed. The most critical example is the existence of only 5 remaining codes for mail system errors. The mail system classification includes both host and mailbox error conditions. The remaining third digit space would be completely consumed as needed to indicate MIME and media conversion errors and security system errors. ===================================================== == File: src/site/resources/server/rfclist/smtp/rfc6710.txt ===================================================== Internet Engineering Task Force (IETF) A. Melnikov Request for Comments: 6710 Isode Ltd Category: Standards Track K. Carlberg ISSN: 2070-1721 G11 August 2012 Simple Mail Transfer Protocol Extension for Message Transfer Priorities Abstract This memo defines an extension to the SMTP (Simple Mail Transfer Protocol) service whereby messages are given a label to indicate preferential handling, to enable mail handling nodes to take this information into account for onward processing. Status of This Memo This is an Internet Standards Track document. This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 5741. Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at http://www.rfc-editor.org/info/rfc6710. Copyright Notice Copyright (c) 2012 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License. ===================================================== == File: src/site/resources/server/rfclist/lmtp/rfc2033.txt ===================================================== Network Working Group J. Myers Request for Comments: 2033 Carnegie Mellon Category: Informational October 1996 Local Mail Transfer Protocol Status of this Memo This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind. Distribution of this memo is unlimited. 1. Abstract SMTP [SMTP] [HOST-REQ] and its service extensions [ESMTP] provide a mechanism for transferring mail reliably and efficiently. The design of the SMTP protocol effectively requires the server to manage a mail delivery queue. In some limited circumstances, outside the area of mail exchange between independent hosts on public networks, it is desirable to implement a system where a mail receiver does not manage a queue. This document describes the LMTP protocol for transporting mail into such systems. Although LMTP is an alternative protocol to ESMTP, it uses (with a few changes) the syntax and semantics of ESMTP. This design permits LMTP to utilize the extensions defined for ESMTP. LMTP should be used only by specific prior arrangement and configuration, and it MUST NOT be used on TCP port 25. Table of Contents 1. Abstract ................................................ 1 2. Conventions Used in this Document ....................... 2 3. Introduction and Overview ............................... 2 4. The LMTP protocol ....................................... 3 4.1. The LHLO, HELO and EHLO commands ........................ 4 4.2. The DATA command ........................................ 4 4.3. The BDAT command ........................................ 5 5. Implementation requirements ............................. 6 6. Acknowledgments ......................................... 6 7. References .............................................. 7 ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2087.txt ===================================================== Network Working Group J. Myers Request for Comments: 2087 Carnegie Mellon Category: Standards Track January 1997 IMAP4 QUOTA extension Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract The QUOTA extension of the Internet Message Access Protocol [IMAP4] permits administrative limits on resource usage (quotas) to be manipulated through the IMAP protocol. Table of Contents 1. Abstract........................................... 1 2. Conventions Used in this Document.................. 1 3. Introduction and Overview.......................... 2 4. Commands........................................... 2 4.1. SETQUOTA Command................................... 2 4.2. GETQUOTA Command................................... 2 4.3. GETQUOTAROOT Command............................... 3 5. Responses.......................................... 3 5.1. QUOTA Response..................................... 3 5.2. QUOTAROOT Response................................. 4 6. Formal syntax...................................... 4 7. References......................................... 5 8. Security Considerations............................ 5 9. Author's Address................................... 5 2. Conventions Used in this Document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2221.txt ===================================================== Network Working Group M. Gahrns Request for Comments: 2221 Microsoft Category: Standards Track October 1997 IMAP4 Login Referrals Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. 1. Abstract When dealing with large amounts of users and many IMAP4 [RFC-2060] servers, it is often necessary to move users from one IMAP4 server to another. For example, hardware failures or organizational changes may dictate such a move. Login referrals allow clients to transparently connect to an alternate IMAP4 server, if their home IMAP4 server has changed. A referral mechanism can provide efficiencies over the alternative 'proxy method', in which the local IMAP4 server contacts the remote server on behalf of the client, and then transfers the data from the remote server to itself, and then on to the client. The referral mechanism's direct client connection to the remote server is often a more efficient use of bandwidth, and does not require the local server to impersonate the client when authenticating to the remote server. 2. Conventions used in this document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. A home server, is an IMAP4 server that contains the user's inbox. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2193.txt ===================================================== Network Working Group M. Gahrns Request for Comments: 2193 Microsoft Category: Standards Track September 1997 IMAP4 Mailbox Referrals Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract When dealing with large amounts of users, messages and geographically dispersed IMAP4 [RFC-2060] servers, it is often desirable to distribute messages amongst different servers within an organization. For example an administrator may choose to store user's personal mailboxes on a local IMAP4 server, while storing shared mailboxes remotely on another server. This type of configuration is common when it is uneconomical to store all data centrally due to limited bandwidth or disk resources. Mailbox referrals allow clients to seamlessly access mailboxes that are distributed across several IMAP4 servers. A referral mechanism can provide efficiencies over the alternative "proxy method", in which the local IMAP4 server contacts the remote server on behalf of the client, and then transfers the data from the remote server to itself, and then on to the client. The referral mechanism's direct client connection to the remote server is often a more efficient use of bandwidth, and does not require the local server to impersonate the client when authenticating to the remote server. 2. Conventions used in this document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. A home server, is an IMAP4 server that contains the user's inbox. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2192.txt ===================================================== Network Working Group C. Newman Request for Comments: 2192 Innosoft Category: Standards Track September 1997 IMAP URL Scheme Status of this memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract IMAP [IMAP4] is a rich protocol for accessing remote message stores. It provides an ideal mechanism for accessing public mailing list archives as well as private and shared message stores. This document defines a URL scheme for referencing objects on an IMAP server. 1. Conventions used in this document The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" in this document are to be interpreted as defined in "Key words for use in RFCs to Indicate Requirement Levels" [KEYWORDS]. 2. IMAP scheme The IMAP URL scheme is used to designate IMAP servers, mailboxes, messages, MIME bodies [MIME], and search programs on Internet hosts accessible using the IMAP protocol. The IMAP URL follows the common Internet scheme syntax as defined in RFC 1738 [BASIC-URL] except that clear text passwords are not permitted. If :<port> is omitted, the port defaults to 143. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2088.txt ===================================================== Network Working Group J. Myers Request for Comments: 2088 Carnegie Mellon Cateogry: Standards Track January 1997 IMAP4 non-synchronizing literals Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract The Internet Message Access Protocol [IMAP4] contains the "literal" syntactic construct for communicating strings. When sending a literal from client to server, IMAP4 requires the client to wait for the server to send a command continuation request between sending the octet count and the string data. This document specifies an alternate form of literal which does not require this network round trip. 2. Conventions Used in this Document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. 3. Specification The non-synchronizing literal is added an alternate form of literal, and may appear in communication from client to server instead of the IMAP4 form of literal. The IMAP4 form of literal, used in communication from client to server, is referred to as a synchronizing literal. Non-synchronizing literals may be used with any IMAP4 server implementation which returns "LITERAL+" as one of the supported capabilities to the CAPABILITY command. If the server does not advertise the LITERAL+ capability, the client must use synchronizing literals instead. The non-synchronizing literal is distinguished from the original ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2060.txt ===================================================== Network Working Group M. Crispin Request for Comments: 2060 University of Washington Obsoletes: 1730 December 1996 Category: Standards Track INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract The Internet Message Access Protocol, Version 4rev1 (IMAP4rev1) allows a client to access and manipulate electronic mail messages on a server. IMAP4rev1 permits manipulation of remote message folders, called "mailboxes", in a way that is functionally equivalent to local mailboxes. IMAP4rev1 also provides the capability for an offline client to resynchronize with the server (see also [IMAP-DISC]). IMAP4rev1 includes operations for creating, deleting, and renaming mailboxes; checking for new messages; permanently removing messages; setting and clearing flags; [RFC-822] and [MIME-IMB] parsing; searching; and selective fetching of message attributes, texts, and portions thereof. Messages in IMAP4rev1 are accessed by the use of numbers. These numbers are either message sequence numbers or unique identifiers. IMAP4rev1 supports a single server. A mechanism for accessing configuration information to support multiple IMAP4rev1 servers is discussed in [ACAP]. IMAP4rev1 does not specify a means of posting mail; this function is handled by a mail transfer protocol such as [SMTP]. IMAP4rev1 is designed to be upwards compatible from the [IMAP2] and unpublished IMAP2bis protocols. In the course of the evolution of IMAP4rev1, some aspects in the earlier protocol have become obsolete. Obsolete commands, responses, and data formats which an IMAP4rev1 implementation may encounter when used with an earlier implementation ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2086.txt ===================================================== Network Working Group J. Myers Request for Comments: 2086 Carnegie Mellon Category: Standards Track January 1997 IMAP4 ACL extension Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract The ACL extension of the Internet Message Access Protocol [IMAP4] permits access control lists to be manipulated through the IMAP protocol. Table of Contents 1. Abstract............................................... 1 2. Conventions Used in this Document...................... 1 3. Introduction and Overview.............................. 2 4. Commands............................................... 3 4.1. SETACL................................................. 3 4.2. DELETEACL.............................................. 4 4.3. GETACL................................................. 4 4.4. LISTRIGHTS............................................. 4 4.5. MYRIGHTS............................................... 5 5. Responses.............................................. 5 5.1. ACL.................................................... 5 5.2. LISTRIGHTS............................................. 6 5.3. MYRIGHTS............................................... 6 6. Formal Syntax.......................................... 6 7. References............................................. 7 8. Security Considerations................................ 7 9. Author's Address....................................... 8 2. Conventions Used in this Document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2342.txt ===================================================== Network Working Group M. Gahrns Request for Comments: 2342 Microsoft Category: Standards Track C. Newman Innosoft May 1998 IMAP4 Namespace Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1998). All Rights Reserved. 1. Abstract IMAP4 [RFC-2060] does not define a default server namespace. As a result, two common namespace models have evolved: The "Personal Mailbox" model, in which the default namespace that is presented consists of only the user's personal mailboxes. To access shared mailboxes, the user must use an escape mechanism to reach another namespace. The "Complete Hierarchy" model, in which the default namespace that is presented includes the user's personal mailboxes along with any other mailboxes they have access to. These two models, create difficulties for certain client operations. This document defines a NAMESPACE command that allows a client to discover the prefixes of namespaces used by a server for personal mailboxes, other users' mailboxes, and shared mailboxes. This allows a client to avoid much of the manual user configuration that is now necessary when mixing and matching IMAP4 clients and servers. 2. Conventions used in this document In examples, "C:" and "S:" indicate lines sent by the client and ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2595.txt ===================================================== Network Working Group C. Newman Request for Comments: 2595 Innosoft Category: Standards Track June 1999 Using TLS with IMAP, POP3 and ACAP Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1999). All Rights Reserved. 1. Motivation The TLS protocol (formerly known as SSL) provides a way to secure an application protocol from tampering and eavesdropping. The option of using such security is desirable for IMAP, POP and ACAP due to common connection eavesdropping and hijacking attacks [AUTH]. Although advanced SASL authentication mechanisms can provide a lightweight version of this service, TLS is complimentary to simple authentication-only SASL mechanisms or deployed clear-text password login commands. Many sites have a high investment in authentication infrastructure (e.g., a large database of a one-way-function applied to user passwords), so a privacy layer which is not tightly bound to user authentication can protect against network eavesdropping attacks without requiring a new authentication infrastructure and/or forcing all users to change their password. Recognizing that such sites will desire simple password authentication in combination with TLS encryption, this specification defines the PLAIN SASL mechanism for use with protocols which lack a simple password authentication command such as ACAP and SMTP. (Note there is a separate RFC for the STARTTLS command in SMTP [SMTPTLS].) There is a strong desire in the IETF to eliminate the transmission of ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2195.txt ===================================================== Network Working Group J. Klensin Request for Comments: 2195 R. Catoe Category: Standards Track P. Krumviede Obsoletes: 2095 MCI September 1997 IMAP/POP AUTHorize Extension for Simple Challenge/Response Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract While IMAP4 supports a number of strong authentication mechanisms as described in RFC 1731, it lacks any mechanism that neither passes cleartext, reusable passwords across the network nor requires either a significant security infrastructure or that the mail server update a mail-system-wide user authentication file on each mail access. This specification provides a simple challenge-response authentication protocol that is suitable for use with IMAP4. Since it utilizes Keyed-MD5 digests and does not require that the secret be stored in the clear on the server, it may also constitute an improvement on APOP for POP3 use as specified in RFC 1734. 1. Introduction Existing Proposed Standards specify an AUTHENTICATE mechanism for the IMAP4 protocol [IMAP, IMAP-AUTH] and a parallel AUTH mechanism for the POP3 protocol [POP3-AUTH]. The AUTHENTICATE mechanism is intended to be extensible; the four methods specified in [IMAP-AUTH] are all fairly powerful and require some security infrastructure to support. The base POP3 specification [POP3] also contains a lightweight challenge-response mechanism called APOP. APOP is associated with most of the risks associated with such protocols: in particular, it requires that both the client and server machines have access to the shared secret in cleartext form. CRAM offers a method for avoiding such cleartext storage while retaining the algorithmic simplicity of APOP in using only MD5, though in a "keyed" method. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2180.txt ===================================================== Network Working Group M. Gahrns Request for Comments: 2180 Microsoft Category: Informational July 1997 IMAP4 Multi-Accessed Mailbox Practice Status of this Memo This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind. Distribution of this memo is unlimited. 1. Abstract IMAP4[RFC-2060] is rich client/server protocol that allows a client to access and manipulate electronic mail messages on a server. Within the protocol framework, it is possible to have differing results for particular client/server interactions. If a protocol does not allow for this, it is often unduly restrictive. For example, when multiple clients are accessing a mailbox and one attempts to delete the mailbox, an IMAP4 server may choose to implement a solution based upon server architectural constraints or individual preference. With this flexibility comes greater client responsibility. It is not sufficient for a client to be written based upon the behavior of a particular IMAP server. Rather the client must be based upon the behavior allowed by the protocol. By documenting common IMAP4 server practice for the case of simultaneous client access to a mailbox, we hope to ensure the widest amount of inter-operation between IMAP4 clients and servers. The behavior described in this document reflects the practice of some existing servers or behavior that the consensus of the IMAP mailing list has deemed to be reasonable. The behavior described within this document is believed to be [RFC-2060] compliant. However, this document is not meant to define IMAP4 compliance, nor is it an exhaustive list of valid IMAP4 behavior. [RFC-2060] must always be consulted to determine IMAP4 compliance, especially for server behavior not described within this document. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc5256.txt ===================================================== Network Working Group M. Crispin Request for Comments: 5256 Panda Programming Category: Standards Track K. Murchison Carnegie Mellon University June 2008 Internet Message Access Protocol - SORT and THREAD Extensions Status of This Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract This document describes the base-level server-based sorting and threading extensions to the IMAP protocol. These extensions provide substantial performance improvements for IMAP clients that offer sorted and threaded views. 1. Introduction The SORT and THREAD extensions to the [IMAP] protocol provide a means of server-based sorting and threading of messages, without requiring that the client download the necessary data to do so itself. This is particularly useful for online clients as described in [IMAP-MODELS]. A server that supports the base-level SORT extension indicates this with a capability name which starts with "SORT". Future, upwards- compatible extensions to the SORT extension will all start with "SORT", indicating support for this base level. A server that supports the THREAD extension indicates this with one or more capability names consisting of "THREAD=" followed by a supported threading algorithm name as described in this document. This provides for future upwards-compatible extensions. A server that implements the SORT and/or THREAD extensions MUST collate strings in accordance with the requirements of I18NLEVEL=1, as described in [IMAP-I18N], and SHOULD implement and advertise the ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2177.txt ===================================================== Network Working Group B. Leiba Request for Comments: 2177 IBM T.J. Watson Research Center Category: Standards Track June 1997 IMAP4 IDLE command Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Abstract The Internet Message Access Protocol [IMAP4] requires a client to poll the server for changes to the selected mailbox (new mail, deletions). It's often more desirable to have the server transmit updates to the client in real time. This allows a user to see new mail immediately. It also helps some real-time applications based on IMAP, which might otherwise need to poll extremely often (such as every few seconds). (While the spec actually does allow a server to push EXISTS responses aysynchronously, a client can't expect this behaviour and must poll.) This document specifies the syntax of an IDLE command, which will allow a client to tell the server that it's ready to accept such real-time updates. 2. Conventions Used in this Document In examples, "C:" and "S:" indicate lines sent by the client and server respectively. The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY" in this document are to be interpreted as described in RFC 2060 [IMAP4]. 3. Specification IDLE Command Arguments: none ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2683.txt ===================================================== Network Working Group B. Leiba Request for Comments: 2683 IBM T.J. Watson Research Center Category: Informational September 1999 IMAP4 Implementation Recommendations Status of this Memo This memo provides information for the Internet community. It does not specify an Internet standard of any kind. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1999). All Rights Reserved. 1. Abstract The IMAP4 specification [RFC-2060] describes a rich protocol for use in building clients and servers for storage, retrieval, and manipulation of electronic mail. Because the protocol is so rich and has so many implementation choices, there are often trade-offs that must be made and issues that must be considered when designing such clients and servers. This document attempts to outline these issues and to make recommendations in order to make the end products as interoperable as possible. 2. Conventions used in this document In examples, "C:" indicates lines sent by a client that is connected to a server. "S:" indicates lines sent by the server to the client. The words "must", "must not", "should", "should not", and "may" are used with specific meaning in this document; since their meaning is somewhat different from that specified in RFC 2119, we do not put them in all caps here. Their meaning is as follows: must -- This word means that the action described is necessary to ensure interoperability. The recommendation should not be ignored. must not -- This phrase means that the action described will be almost certain to hurt interoperability. The recommendation should not be ignored. ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc2359.txt ===================================================== Network Working Group J. Myers Request for Comments: 2359 Netscape Communications Category: Standards Track June 1998 IMAP4 UIDPLUS extension Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1998). All Rights Reserved. IESG NOTE The IMAP extension described here assumes a particular means of using IMAP to support disconnected operation. However, this means of supporting disconnected operation is not yet documented. Also, there are multiple theories about how best to do disconnected operation in IMAP, and as yet, there is no consensus on which one should be adopted as a standard. This document is being approved as a Proposed Standard because it does not appear to have technical flaws in itelf. However, approval of this document as a Proposed Standard should not be considered an IETF endorsement of any particular means of doing disconnected operation in IMAP. Table of Contents 1. Abstract .............................................. 2 2. Conventions Used in this Document ..................... 2 3. Introduction and Overview ............................. 2 4. Features .............................................. 2 4.1. UID EXPUNGE Command ................................... 2 4.2. APPENDUID response code ............................... 3 4.3. COPYUID response code ................................. 4 5. Formal Syntax ......................................... 4 6. References ............................................ 4 ===================================================== == File: src/site/resources/server/rfclist/imap4/rfc1731.txt ===================================================== Network Working Group J. Myers Request for Comments: 1731 Carnegie Mellon Category: Standards Track December 1994 IMAP4 Authentication Mechanisms Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Introduction The Internet Message Access Protocol, Version 4 [IMAP4] contains the AUTHENTICATE command, for identifying and authenticating a user to an IMAP4 server and for optionally negotiating a protection mechanism for subsequent protocol interactions. This document describes several authentication mechanisms for use by the IMAP4 AUTHENTICATE command. 2. Kerberos version 4 authentication mechanism The authentication type associated with Kerberos version 4 is "KERBEROS_V4". The data encoded in the first ready response contains a random 32-bit number in network byte order. The client should respond with a Kerberos ticket and an authenticator for the principal "imap.hostname@realm", where "hostname" is the first component of the host name of the server with all letters in lower case and where "realm" is the Kerberos realm of the server. The encrypted checksum field included within the Kerberos authenticator should contain the server provided 32-bit number in network byte order. Upon decrypting and verifying the ticket and authenticator, the server should verify that the contained checksum field equals the original server provided random 32-bit number. Should the verification be successful, the server must add one to the checksum and construct 8 octets of data, with the first four octets containing ===================================================== == File: src/site/resources/server/rfclist/pop3/rfc1725.txt ===================================================== Network Working Group J. Myers Request for Comments: 1725 Carnegie Mellon Obsoletes: 1460 M. Rose Category: Standards Track Dover Beach Consulting, Inc. November 1994 Post Office Protocol - Version 3 Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Overview This memo is a revision to RFC 1460, a Draft Standard. It makes the following changes from that document: - removed text regarding "split-UA model", which didn't add anything to the understanding of POP - clarified syntax of commands, keywords, and arguments - clarified behavior on broken connection - explicitly permitted an inactivity autologout timer - clarified the requirements of the "exclusive-access lock" - removed implementation-specific wording regarding the parsing of the maildrop - allowed servers to close the connection after a failed authentication command - removed the LAST command - fixed typo in example of TOP command - clarified that the second argument to the TOP command is non- negative ===================================================== == File: src/site/resources/server/rfclist/pop3/rfc1939.txt ===================================================== Network Working Group J. Myers Request for Comments: 1939 Carnegie Mellon STD: 53 M. Rose Obsoletes: 1725 Dover Beach Consulting, Inc. Category: Standards Track May 1996 Post Office Protocol - Version 3 Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Table of Contents 1. Introduction ................................................ 2 2. A Short Digression .......................................... 2 3. Basic Operation ............................................. 3 4. The AUTHORIZATION State ..................................... 4 QUIT Command ................................................ 5 5. The TRANSACTION State ....................................... 5 STAT Command ................................................ 6 LIST Command ................................................ 6 RETR Command ................................................ 8 DELE Command ................................................ 8 NOOP Command ................................................ 9 RSET Command ................................................ 9 6. The UPDATE State ............................................ 10 QUIT Command ................................................ 10 7. Optional POP3 Commands ...................................... 11 TOP Command ................................................. 11 UIDL Command ................................................ 12 USER Command ................................................ 13 PASS Command ................................................ 14 APOP Command ................................................ 15 8. Scaling and Operational Considerations ...................... 16 9. POP3 Command Summary ........................................ 18 10. Example POP3 Session ....................................... 19 11. Message Format ............................................. 19 12. References ................................................. 20 13. Security Considerations .................................... 20 ===================================================== == File: src/site/resources/server/rfclist/pop3/rfc1734.txt ===================================================== Network Working Group J. Myers Request for Comments: 1734 Carnegie Mellon Category: Standards Track December 1994 POP3 AUTHentication command Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. 1. Introduction This document describes the optional AUTH command, for indicating an authentication mechanism to the server, performing an authentication protocol exchange, and optionally negotiating a protection mechanism for subsequent protocol interactions. The authentication and protection mechanisms used by the POP3 AUTH command are those used by IMAP4. 2. The AUTH command AUTH mechanism Arguments: a string identifying an IMAP4 authentication mechanism, such as defined by [IMAP4-AUTH]. Any use of the string "imap" used in a server authentication identity in the definition of an authentication mechanism is replaced with the string "pop". Restrictions: may only be given in the AUTHORIZATION state Discussion: The AUTH command indicates an authentication mechanism to the server. If the server supports the requested authentication mechanism, it performs an authentication protocol exchange to authenticate and identify the user. ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2830.txt ===================================================== Network Working Group J. Hodges Request for Comments: 2830 Oblix Inc. Category: Standards Track R. Morgan Univ of Washington M. Wahl Sun Microsystems, Inc. May 2000 Lightweight Directory Access Protocol (v3): Extension for Transport Layer Security Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (2000). All Rights Reserved. Abstract This document defines the "Start Transport Layer Security (TLS) Operation" for LDAP [LDAPv3, TLS]. This operation provides for TLS establishment in an LDAP association and is defined in terms of an LDAP extended request. 1. Conventions Used in this Document The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [ReqsKeywords]. 2. The Start TLS Request This section describes the Start TLS extended request and extended response themselves: how to form the request, the form of the response, and enumerates the various result codes the client MUST be prepared to handle. ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2255.txt ===================================================== Network Working Group T. Howes Request for Comments: 2255 M. Smith Category: Standards Track Netscape Communications Corp. December 1997 The LDAP URL Format 1. Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. IESG NOTE This document describes a directory access protocol that provides both read and update access. Update access requires secure authentication, but this document does not mandate implementation of any satisfactory authentication mechanisms. In accordance with RFC 2026, section 4.4.1, this specification is being approved by IESG as a Proposed Standard despite this limitation, for the following reasons: a. to encourage implementation and interoperability testing of these protocols (with or without update access) before they are deployed, and b. to encourage deployment and use of these protocols in read-only applications. (e.g. applications where LDAPv3 is used as a query language for directories which are updated by some secure mechanism other than LDAP), and c. to avoid delaying the advancement and deployment of other Internet standards-track protocols which require the ability to query, but not update, LDAPv3 directory servers. ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2252.txt ===================================================== Network Working Group M. Wahl Request for Comments: 2252 Critical Angle Inc. Category: Standards Track A. Coulbeck Isode Inc. T. Howes Netscape Communications Corp. S. Kille Isode Limited December 1997 Lightweight Directory Access Protocol (v3): Attribute Syntax Definitions 1. Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. IESG Note This document describes a directory access protocol that provides both read and update access. Update access requires secure authentication, but this document does not mandate implementation of any satisfactory authentication mechanisms. In accordance with RFC 2026, section 4.4.1, this specification is being approved by IESG as a Proposed Standard despite this limitation, for the following reasons: a. to encourage implementation and interoperability testing of these protocols (with or without update access) before they are deployed, and b. to encourage deployment and use of these protocols in read-only applications. (e.g. applications where LDAPv3 is used as a query language for directories which are updated by some ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc3377.txt ===================================================== Network Working Group J. Hodges Request for Comments: 3377 Sun Microsystems Inc. Category: Standards Track R. Morgan University of Washington September 2002 Lightweight Directory Access Protocol (v3): Technical Specification Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (2002). All Rights Reserved. Abstract This document specifies the set of RFCs comprising the Lightweight Directory Access Protocol Version 3 (LDAPv3), and addresses the "IESG Note" attached to RFCs 2251 through 2256. 1. Background and Motivation The specification for the Lightweight Directory Access Protocol version 3 (LDAPv3) nominally comprises eight RFCs which were issued in two distinct subsets at separate times -- RFCs 2251 through 2256 first, then RFCs 2829 and 2830 following later. RFC 2251 through 2256 do not mandate the implementation of any satisfactory authentication mechanisms and hence were published with an "IESG Note" discouraging implementation and deployment of LDAPv3 clients or servers implementing update functionality until a Proposed Standard for mandatory authentication in LDAPv3 is published. RFC 2829 was subsequently published in answer to the IESG Note. The purpose of this document is to explicitly specify the set of RFCs ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2256.txt ===================================================== Network Working Group M. Wahl Request for Comments: 2256 Critical Angle Inc. Category: Standards Track December 1997 A Summary of the X.500(96) User Schema for use with LDAPv3 1. Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. IESG Note This document describes a directory access protocol that provides both read and update access. Update access requires secure authentication, but this document does not mandate implementation of any satisfactory authentication mechanisms. In accordance with RFC 2026, section 4.4.1, this specification is being approved by IESG as a Proposed Standard despite this limitation, for the following reasons: a. to encourage implementation and interoperability testing of these protocols (with or without update access) before they are deployed, and b. to encourage deployment and use of these protocols in read-only applications. (e.g. applications where LDAPv3 is used as a query language for directories which are updated by some secure mechanism other than LDAP), and c. to avoid delaying the advancement and deployment of other Internet standards-track protocols which require the ability to query, but not update, LDAPv3 directory servers. Readers are hereby warned that until mandatory authentication ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2253.txt ===================================================== Network Working Group M. Wahl Request for Comments: 2253 Critical Angle Inc. Obsoletes: 1779 S. Kille Category: Standards Track Isode Ltd. T. Howes Netscape Communications Corp. December 1997 Lightweight Directory Access Protocol (v3): UTF-8 String Representation of Distinguished Names Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. IESG Note This document describes a directory access protocol that provides both read and update access. Update access requires secure authentication, but this document does not mandate implementation of any satisfactory authentication mechanisms. In accordance with RFC 2026, section 4.4.1, this specification is being approved by IESG as a Proposed Standard despite this limitation, for the following reasons: a. to encourage implementation and interoperability testing of these protocols (with or without update access) before they are deployed, and b. to encourage deployment and use of these protocols in read-only applications. (e.g. applications where LDAPv3 is used as a query language for directories which are updated by some secure mechanism other than LDAP), and ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2829.txt ===================================================== Network Working Group M. Wahl Request for Comments: 2829 Sun Microsystems, Inc. Category: Standards Track H. Alvestrand EDB Maxware J. Hodges Oblix, Inc. R. Morgan University of Washington May 2000 Authentication Methods for LDAP Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (2000). All Rights Reserved. Abstract This document specifies particular combinations of security mechanisms which are required and recommended in LDAP [1] implementations. 1. Introduction LDAP version 3 is a powerful access protocol for directories. It offers means of searching, fetching and manipulating directory content, and ways to access a rich set of security functions. In order to function for the best of the Internet, it is vital that these security functions be interoperable; therefore there has to be a minimum subset of security functions that is common to all implementations that claim LDAPv3 conformance. Basic threats to an LDAP directory service include: ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2254.txt ===================================================== Network Working Group T. Howes Request for Comments: 2254 Netscape Communications Corp. Category: Standards Track December 1997 The String Representation of LDAP Search Filters 1. Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. IESG Note This document describes a directory access protocol that provides both read and update access. Update access requires secure authentication, but this document does not mandate implementation of any satisfactory authentication mechanisms. In accordance with RFC 2026, section 4.4.1, this specification is being approved by IESG as a Proposed Standard despite this limitation, for the following reasons: a. to encourage implementation and interoperability testing of these protocols (with or without update access) before they are deployed, and b. to encourage deployment and use of these protocols in read-only applications. (e.g. applications where LDAPv3 is used as a query language for directories which are updated by some secure mechanism other than LDAP), and c. to avoid delaying the advancement and deployment of other Internet standards-track protocols which require the ability to query, but not update, LDAPv3 directory servers. ===================================================== == File: src/site/resources/server/rfclist/ldap/rfc2251.txt ===================================================== Network Working Group M. Wahl Request for Comments: 2251 Critical Angle Inc. Category: Standards Track T. Howes Netscape Communications Corp. S. Kille Isode Limited December 1997 Lightweight Directory Access Protocol (v3) 1. Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (1997). All Rights Reserved. IESG Note This document describes a directory access protocol that provides both read and update access. Update access requires secure authentication, but this document does not mandate implementation of any satisfactory authentication mechanisms. In accordance with RFC 2026, section 4.4.1, this specification is being approved by IESG as a Proposed Standard despite this limitation, for the following reasons: a. to encourage implementation and interoperability testing of these protocols (with or without update access) before they are deployed, and b. to encourage deployment and use of these protocols in read-only applications. (e.g. applications where LDAPv3 is used as a query language for directories which are updated by some secure mechanism other than LDAP), and c. to avoid delaying the advancement and deployment of other Internet ===================================================== == File: src/site/resources/server/rfclist/basic/rfc0822.txt ===================================================== RFC # 822 Obsoletes: RFC #733 (NIC #41952) STANDARD FOR THE FORMAT OF ARPA INTERNET TEXT MESSAGES August 13, 1982 Revised by David H. Crocker Dept. of Electrical Engineering University of Delaware, Newark, DE 19711 Network: DCrocker @ UDel-Relay ===================================================== == File: src/site/resources/server/rfclist/basic/rfc2046.txt ===================================================== Network Working Group N. Freed Request for Comments: 2046 Innosoft Obsoletes: 1521, 1522, 1590 N. Borenstein Category: Standards Track First Virtual November 1996 Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract STD 11, RFC 822 defines a message representation protocol specifying considerable detail about US-ASCII message headers, but which leaves the message content, or message body, as flat US-ASCII text. This set of documents, collectively called the Multipurpose Internet Mail Extensions, or MIME, redefines the format of messages to allow for (1) textual message bodies in character sets other than US-ASCII, (2) an extensible set of different formats for non-textual message bodies, (3) multi-part message bodies, and (4) textual header information in character sets other than US-ASCII. These documents are based on earlier work documented in RFC 934, STD 11, and RFC 1049, but extends and revises them. Because RFC 822 said so little about message bodies, these documents are largely orthogonal to (rather than a revision of) RFC 822. The initial document in this set, RFC 2045, specifies the various headers used to describe the structure of MIME messages. This second ===================================================== == File: src/site/resources/server/rfclist/basic/rfc2822.txt ===================================================== Network Working Group P. Resnick, Editor Request for Comments: 2822 QUALCOMM Incorporated Obsoletes: 822 April 2001 Category: Standards Track Internet Message Format Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Copyright Notice Copyright (C) The Internet Society (2001). All Rights Reserved. Abstract This standard specifies a syntax for text messages that are sent between computer users, within the framework of "electronic mail" messages. This standard supersedes the one specified in Request For Comments (RFC) 822, "Standard for the Format of ARPA Internet Text Messages", updating it to reflect current practice and incorporating incremental changes that were specified in other RFCs. Table of Contents 1. Introduction ............................................... 3 1.1. Scope .................................................... 3 1.2. Notational conventions ................................... 4 1.2.1. Requirements notation .................................. 4 1.2.2. Syntactic notation ..................................... 4 1.3. Structure of this document ............................... 4 2. Lexical Analysis of Messages ............................... 5 2.1. General Description ...................................... 5 2.1.1. Line Length Limits ..................................... 6 2.2. Header Fields ............................................ 7 2.2.1. Unstructured Header Field Bodies ....................... 7 2.2.2. Structured Header Field Bodies ......................... 7 2.2.3. Long Header Fields ..................................... 7 2.3. Body ..................................................... 8 ===================================================== == File: src/site/resources/server/rfclist/basic/rfc1123.txt ===================================================== Network Working Group Internet Engineering Task Force Request for Comments: 1123 R. Braden, Editor October 1989 Requirements for Internet Hosts -- Application and Support Status of This Memo This RFC is an official specification for the Internet community. It incorporates by reference, amends, corrects, and supplements the primary protocol standards documents relating to hosts. Distribution of this document is unlimited. Summary This RFC is one of a pair that defines and discusses the requirements for Internet host software. This RFC covers the application and support protocols; its companion RFC-1122 covers the communication protocol layers: link layer, IP layer, and transport layer. Table of Contents 1. INTRODUCTION ............................................... 5 1.1 The Internet Architecture .............................. 6 1.2 General Considerations ................................. 6 1.2.1 Continuing Internet Evolution ..................... 6 1.2.2 Robustness Principle .............................. 7 1.2.3 Error Logging ..................................... 8 1.2.4 Configuration ..................................... 8 1.3 Reading this Document .................................. 10 1.3.1 Organization ...................................... 10 1.3.2 Requirements ...................................... 10 1.3.3 Terminology ....................................... 11 1.4 Acknowledgments ........................................ 12 2. GENERAL ISSUES ............................................. 13 2.1 Host Names and Numbers ................................. 13 2.2 Using Domain Name Service .............................. 13 2.3 Applications on Multihomed hosts ....................... 14 ===================================================== == File: src/site/resources/server/rfclist/basic/rfc2045.txt ===================================================== Network Working Group N. Freed Request for Comments: 2045 Innosoft Obsoletes: 1521, 1522, 1590 N. Borenstein Category: Standards Track First Virtual November 1996 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies Status of this Memo This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. Abstract STD 11, RFC 822, defines a message representation protocol specifying considerable detail about US-ASCII message headers, and leaves the message content, or message body, as flat US-ASCII text. This set of documents, collectively called the Multipurpose Internet Mail Extensions, or MIME, redefines the format of messages to allow for (1) textual message bodies in character sets other than US-ASCII, (2) an extensible set of different formats for non-textual message bodies, (3) multi-part message bodies, and (4) textual header information in character sets other than US-ASCII. These documents are based on earlier work documented in RFC 934, STD 11, and RFC 1049, but extends and revises them. Because RFC 822 said so little about message bodies, these documents are largely orthogonal to (rather than a revision of) RFC 822. This initial document specifies the various headers used to describe the structure of MIME messages. The second document, RFC 2046, ===================================================== == File: src/site/markdown/server/manage-guice-distributed-james.md ===================================================== # Managing Guice distributed James This guide aims to be an entry-point to the James documentation for user managing a distributed Guice James server. It includes: - Simple architecture explanations - Propose some diagnostics for some common issues - Present procedures that can be set up to address these issues In order to not duplicate information, existing documentation will be linked. Please note that this product is under active development, should be considered experimental and thus targets advanced users. ## Table of content - [Overall architecture](#Overall_architecture) - [Basic Monitoring](#Basic_Monitoring) - [Cassandra table level configuration](#Cassandra_table_level_configuration) - [Deleted Messages Vault](#Deleted_Messages_Vault) - [OpenSearch Indexing](#Opensearch_Indexing) - [Mailbox Event Bus](#Mailbox_Event_Bus) - [Mail Processing](#Mail_Processing) - [Mail Queue](#Mail_Queue) - [Setting Cassandra user permissions](#Setting_Cassandra_user_permissions) - [Solving cassandra inconsistencies](#Solving_cassandra_inconsistencies) - [Updating Cassandra schema version](#Updating_Cassandra_schema_version) ## Overall architecture Guice distributed James server intends to provide a horizontally scalable email server. In order to achieve this goal, this product leverages the following technologies: - **Cassandra** for meta-data storage - **ObjectStorage** (S3) for binary content storage - **OpenSearch** for search - **RabbitMQ** for messaging A [docker-compose](https://github.com/apache/james-project/blob/master/server/apps/distributed-app/docker-compose.yml) file is available to allow you to quickly deploy locally this product. ## Basic Monitoring A toolbox is available to help an administrator diagnose issues: - [Structured logging into Kibana](#Structured_logging_into_Kibana) - [Metrics graphs into Grafana](#Metrics_graphs_into_Grafana) - [WebAdmin HealthChecks](#Webadmin_Healthchecks) ===================================================== == File: src/site/markdown/server/manage-cli.md ===================================================== Manage James via the Command Line ================================= With any wiring, James is packed with a command line client. To use it enter, for Spring distrubution: ``` ./bin/james-cli.sh -h 127.0.0.1 -p 9999 COMMAND ``` And for Guice distributions: ``` java -jar /root/james-cli.jar -h 127.0.0.1 -p 9999 COMMAND ``` Guice in docker embeds a script helper: ``` docker exec -ti james james-cli COMMAND ``` The following document will explain you which are the available options for **COMMAND**. Note: the command line before **COMMAND** will be documente as *{cli}*. ## Navigation menu - [Manage Domains](#Manage-Domains) - [Managing users](#Managing-users) - [Managing mailboxes](#Managing-mailboxes) - [Adding a message in a mailbox](#Adding-a-message-in-a-mailbox) - [Managing mappings](#Managing-mappings) - [Manage quotas](#Manage-quotas) - [Manage DropList](#Manage-Droplist) - [Re-indexing](#Re-indexing) - [Sieve scripts quota](#Sieve-scripts-quota) - [Switching of mailbox implementation](#Switching-of-mailbox-implementation) ## Manage Domains Domains represent the domain names handled by your server. You can add a domain: ``` {cli} AddDomain domain.tld ``` ===================================================== == File: src/site/markdown/server/install/guice-cassandra-rabbitmq-s3.md ===================================================== # Guice-Cassandra-Rabbitmq-S3 installation guide ## Building ### Requirements - Java 11 SDK - Docker ∕ OpenSearch 2.1.0, RabbitMQ Management 3.8.18, compatible S3 ObjectStorage and Cassandra 4.0 - Maven 3 ### Building the artifacts An usual compilation using maven will produce two artifacts into server/apps/distributed-app/target directory: * james-server-distributed-app.jar * james-server-distributed-app.lib You can for example run in the base of [this git repository](https://github.com/apache/james-project): ``` mvn clean install ``` ## Running ### Requirements * Cassandra 4.0 * OpenSearch 2.1.0 * RabbitMQ-Management 3.8.18 * Zenko Cloudserver or AWS S3 compatible API ### James Launch To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. You can get a sample directory for configuration from [server/apps/distributed-app/sample-configuration](https://github.com/apache/james-project/tree/master/server/apps/distributed-app/sample-configuration). You might need to adapt it to your needs. You also need to generate a keystore in your conf folder with the following command: ```bash $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ``` You need to have a Cassandra, OpenSearch, S3 and RabbitMQ instance running. You can either install the servers or launch them via docker: ```bash $ docker run -d -p 9042:9042 --name=cassandra cassandra:4.1.5 ===================================================== == File: src/site/markdown/server/install/guice-cassandra.md ===================================================== # Guice-Cassandra installation guide ## Building ### Requirements - Java 11 SDK - Docker ∕ OpenSearch 2.1.0 and Cassandra 4.0 - Maven 3 *WARNING*: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) ### Building the artifacts An usual compilation using maven will produce two artifacts into server/container/guice/cassandra-guice/target directory: * james-server-cassandra-guice.jar * james-server-cassandra-guice.lib You can for example run in the base of [this git repository](https://github.com/apache/james-project): ``` mvn clean install ``` ## Running ### Requirements * Cassandra 4.0 * OpenSearch 2.1.0 ### James Launch To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. You can get a sample directory for configuration from [server/apps/cassandra-app/sample-configuration](https://github.com/apache/james-project/tree/master/server/apps/cassandra-app/sample-configuration). You might need to adapt it to your needs. You also need to generate a keystore in your conf folder with the following command: ```bash $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ``` You need to have a Cassandra and an OpenSearch instance running. You can either install the servers or launch them via docker: ```bash ===================================================== == File: src/site/markdown/server/install/guice-jpa.md ===================================================== # Guice-JPA installation guide ## Building ### Requirements - Java 11 SDK - Maven 3 (optional) ### Download the artifacts Download james-jpa-guice-3.8.2.zip from [the download page](http://james.apache.org/download.cgi#Apache_James_Server) and deflate it. ### (alternative) Building the artifacts An usual compilation using maven of this [Git repository content](https://github.com/apache/james-project) will produce two artifacts into server/container/guice/jpa-guice/target directory: - james-server-jpa-guice.jar - james-server-jpa-guice.lib You can for example run in the base of this git repository: ``` mvn clean install ``` To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. You can get a sample directory for configuration from [server/apps/jpa-app/sample-configuration](https://github.com/apache/james-project/tree/master/server/apps/jpa-app/sample-configuration). You might need to adapt it to your needs. ## Running ### James Launch Edit the configuration to match your needs. You also need to generate a keystore in your conf folder with the following command: ```bash $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ``` Once everything is set up, you just have to run the jar with: ```bash $ java -javaagent:james-server-jpa-guice.lib/openjpa-3.2.0.jar \ -Dlogback.configurationFile=conf/logback.xml \ ===================================================== == File: src/site/markdown/server/install/guice-jpa-smtp.md ===================================================== # Guice-JPA-SMTP installation guide ## Building ### Requirements - Java 11 SDK - Docker - Maven (optional) ### Download the artifacts Download james-jpa-smtp-guice-3.8.2.zip from [the download page](http://james.apache.org/download.cgi#Apache_James_Server) and deflate it. ### (alternative) Building the artifacts An usual compilation using maven of this [Git repository content](https://github.com/apache/james-project) will produce two artifacts into server/container/guice/jpa-smtp/target directory : - james-server-jpa-smtp-${version}.jar - james-server-jpa-smtp-${version}.lib To run james, you have to create a directory containing required configuration files names **conf**. A [sample directory](https://github.com/apache/james-project/tree/master/server/apps/jpa-smtp-app/sample-configuration) is provided with some default value you may need to replace. ## Running ### James Launch Edit the configuration to match your needs. You also need to generate a keystore with the following command : ```bash $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ``` Once everything is set up, you just have to run the jar with : ```bash $ java -javaagent:james-server-jpa-smtp-app.lib/openjpa-3.2.0.jar \ -Dworking.directory=. \ -Djdk.tls.ephemeralDHKeySize=2048 \ -Dlogback.configurationFile=conf/logback.xml \ -jar james-server-jpa-smtp-app.jar ``` ===================================================== == File: src/site/markdown/server/manage-webadmin.md ===================================================== Web administration for JAMES ============================ The web administration supports for now the CRUD operations on the domains, the users, their mailboxes and their quotas, managing mail repositories, performing cassandra migrations, and much more, as described in the following sections. **WARNING**: This API allow authentication only via the use of JWT. If not configured with JWT, an administrator should ensure an attacker can not use this API. By the way, some endpoints are not filtered by authentication. Those endpoints are not related to data stored in James, for example: Swagger documentation & James health checks. Please also note **webadmin** is only enabled with **Guice**. You can not use it when using James with **Spring**, as the required injections are not implemented. In case of any error, the system will return an error message which is json format like this: ``` { statusCode: <error_code>, type: <error_type>, message: <the_error_message> cause: <the_detail_message_from_throwable> } ``` Also be aware that, in case things go wrong, all endpoints might return a 500 internal error (with a JSON body formatted as exposed above). To avoid information duplication, this is ommited on endpoint specific documentation. Finally, please note that in case of a malformed URL the 400 bad request response will contain an HTML body. ## Navigation menu - [HealthCheck](#HealthCheck) - [Administrating domains](#Administrating_domains) - [Administrating users](#Administrating_users) - [Administrating mailboxes](#Administrating_mailboxes) - [Administrating messages](#Administrating_Messages) - [Administrating user mailboxes](#Administrating_user_mailboxes) - [Administrating quotas by users](#Administrating_quotas_by_users) - [Administrating quotas by domains](#Administrating_quotas_by_domains) - [Administrating global quotas](#Administrating_global_quotas) - [Administrating DropLists](#Administrating_DropLists) - [Cassandra Schema upgrades](#Cassandra_Schema_upgrades) - [Correcting ghost mailbox](#Correcting_ghost_mailbox) - [Creating address aliases](#Creating_address_aliases) - [Creating domain mappings](#Creating_domain_mappings) - [Creating address forwards](#Creating_address_forwards) - [Creating address group](#Creating_address_group) - [Creating regex mapping](#Creating_regex_mapping) - [Address Mappings](#Address_Mappings) - [User Mappings](#User_Mappings) - [Administrating mail repositories](#Administrating_mail_repositories) ===================================================== == File: src/site/markdown/mailet/release-notes.md ===================================================== #Release Notes Apache JamesProject Team (2012/12/28) ##Release Notes 2.5.0 Release 2.5.0 marks a new milestone in Apache Mailet life. All Apache James mailet related sub-projects (Api, Base, Crypto, Standard) have been merged as a multi-module maven project. They share the same version number, a common naming scheme and will be released together.Apart from bug fixing, one notable release characteristic is that 2.5.0 jars are OSGi bundles. ##Earlier Releases For information regarding the **Release notes** of earlier releases, please visit <a href="release-notes-old.html">Old releases</a> page. ===================================================== == File: src/site/markdown/mailet/quickstart.md ===================================================== Mailets for developers ====================== ## Artifact names All binary (and source) artifacts are available via [Maven Central](http://repo.maven.apache.org/maven2). The project **groupId** is *org.apache.james* and the artifact names are: * **apache-mailet-api** - for the Mailet API * **apache-mailet-base** - for base Mailets * **apache-mailet-standard** - for Standard Mailets * **apache-mailet-crypto** - for Crypto Mailets * **mailetdocs-maven-plugin** if you wish to extract documentation from sources Just include something like this in your *pom.xml* ~~~ <dependencies> <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-mailet-api</artifactId> <version>3.8.2</version> </dependency> <!-- other dependencies --> </dependencies> ~~~ ### Write your own mailets To learn how to write your own mailets please have a look at <a href="https://github.com/apache/james-project/blob/master/mailet/base/src/main/java/org/apache/mailet/base/GenericMatcher.java">Generic Matcher</a> and <a href="https://github.com/apache/james-project/blob/master/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java">Generic Mailet</a>. Another good learning source are the unit tests from <a href="https://github.com/apache/james-project/tree/master/mailet/standard/src/main/java/org/apache/james/transport">Standard Mailets</a> ===================================================== == File: src/homepage/about.md ===================================================== This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/) You can find the source code for the Jekyll new theme at: {% include icon-github.html username="jekyll" %} / [minima](https://github.com/jekyll/minima) You can find the source code for Jekyll at {% include icon-github.html username="jekyll" %} / [jekyll](https://github.com/jekyll/jekyll) ## How to post new articles on Jekyll #### The Posts Folder As explained on the [directory structure](https://jekyllrb.com/docs/structure/) page, the _posts folder is where your blog posts will live: ``` . ├── _drafts ├── _includes ├── _layouts ├── _posts | ├── 2007-10-29-why-every-programmer-should-play-nethack.md | └── 2009-04-26-barcamp-boston-4-roundup.md ├── _data ├── _site ├── .jekyll-metadata └── index.html ``` The files extension is Markdown. #### Front Matter The front matter is where Jekyll starts to get really cool. Any file that contains a YAML front matter block will be processed by Jekyll as a special file. The front matter must be the first thing in the file and must take the form of valid YAML set between triple-dashed lines. Here is a basic example: ``` --- layout: post title: "Welcome to Jekyll" date: 2016-08-29 16:13:22 +0200 tags: --- ``` * ```Layout``` attribute must be always Post to load the good HTM-CSS template of the page ===================================================== == File: src/homepage/Gemfile.lock ===================================================== GEM remote: https://rubygems.org/ specs: addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) colorator (1.1.0) concurrent-ruby (1.2.3) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) ffi (1.16.3) forwardable-extended (2.6.0) google-protobuf (3.25.3-x86_64-linux) http_parser.rb (0.8.0) i18n (1.14.4) concurrent-ruby (~> 1.0) jekyll (4.3.3) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) i18n (~> 1.0) jekyll-sass-converter (>= 2.0, < 4.0) jekyll-watch (~> 2.0) kramdown (~> 2.3, >= 2.3.1) kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) mercenary (>= 0.3.6, < 0.5) pathutil (~> 0.9) rouge (>= 3.0, < 5.0) safe_yaml (~> 1.0) terminal-table (>= 1.8, < 4.0) webrick (~> 1.7) jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) jekyll-sass-converter (3.0.0) sass-embedded (~> 1.54) jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.4) listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) ===================================================== == File: src/homepage/images/james-alt.svg ===================================================== <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="37px" height="31px" viewBox="0 0 37 31" enable-background="new 0 0 37 31" xml:space="preserve"> <g> <path fill="#FFFFFF" d="M37.001,4.407c-1.435-0.966-2.92-1.75-4.473-2.153c-1.552-0.412-3.151-0.315-4.63,0.3l-0.277,0.117 l-0.139,0.062l-0.064,0.032l-0.036,0.016l-0.018,0.008l-0.008,0.004c0.008-0.007-0.028,0.016,0.02-0.012L27.37,2.783 c-0.2,0.127-0.391,0.232-0.589,0.337c-0.392,0.207-0.796,0.391-1.216,0.543c-0.836,0.295-1.737,0.503-2.664,0.389 c-0.458-0.061-0.913-0.222-1.3-0.489c-0.382-0.268-0.689-0.629-0.899-1.026C20.28,1.737,20.15,0.857,20.124,0 c0.156,0.842,0.393,1.686,0.857,2.363c0.234,0.336,0.523,0.622,0.864,0.811c0.339,0.19,0.723,0.284,1.111,0.301 c0.782,0.038,1.582-0.201,2.325-0.532c0.376-0.165,0.741-0.353,1.092-0.563c0.176-0.105,0.354-0.219,0.509-0.33l0.307-0.201 c0.1-0.057,0.194-0.122,0.293-0.173c0.801-0.433,1.702-0.731,2.627-0.793c0.925-0.069,1.856,0.063,2.716,0.357 c0.863,0.29,1.655,0.731,2.359,1.267C35.888,3.047,36.52,3.676,37.001,4.407z"/> <path fill="#FFFFFF" d="M13.25,20.418c-5.733-4.373-9.554-8.973-9.418-9.078c0.147-0.145,4.153,4.212,9.83,8.536 c1.665,1.28,3.28,2.412,4.733,3.381c0.02-0.036,0.041-0.069,0.062-0.105c0.237-0.456,0.42-0.948,0.562-1.462 c-1.018-2.053-3.554-4.892-6.501-7.496c-0.656-0.572-1.338-1.078-2.028-1.536c-0.151,1.223-0.452,2.098-0.453,2.096 c0,0-0.335-1.163-0.306-2.579C9.266,11.892,8.8,11.63,8.336,11.389c-0.004,1.395-0.414,2.439-0.417,2.439 c0,0.002-0.833-1.414-0.922-3.071c-0.002-0.01-0.002-0.021-0.002-0.031c-2.767-1.279-5.1-1.896-5.104-1.89 C1.867,8.774,2.064,14.75,6.431,19.305c0.147-0.008,0.296-0.016,0.449-0.016c1.588,0.004,2.944,0.577,2.947,0.577 c0-0.002-0.835,0.501-2.054,0.671c0.444,0.355,0.899,0.682,1.364,0.973c1.148-0.416,2.102-0.557,2.102-0.557 c0-0.002-0.503,0.495-1.334,1.017c3.035,1.685,5.787,2.542,7.53,2.624c0.236-0.26,0.452-0.532,0.645-0.821 C16.586,22.84,14.938,21.717,13.25,20.418z"/> <path fill="#FFFFFF" d="M33.7,4.335c-1.103,0.092-2.21,0.292-3.3,0.605c-2.173,0.623-4.31,1.725-6.062,3.396 c-0.883,0.824-1.64,1.798-2.271,2.846c-0.614,1.059-1.109,2.191-1.43,3.363c-0.327,1.168-0.529,2.363-0.595,3.548 c-0.02,0.291-0.031,0.596-0.039,0.9L19.995,19.4l-0.008,0.35c-0.012,0.462-0.051,0.918-0.122,1.358 c-0.056,0.337-0.131,0.665-0.223,0.984c-0.141,0.514-0.324,1.006-0.562,1.466c-0.02,0.036-0.043,0.066-0.062,0.102 c-0.099,0.178-0.204,0.353-0.317,0.52c-0.191,0.286-0.407,0.559-0.643,0.819c-0.17,0.186-0.348,0.366-0.544,0.541 c-1.304,1.152-3.097,1.944-5.021,2.453c-1.931,0.518-3.995,0.788-6.091,0.934c-2.1,0.145-4.234,0.166-6.404,0.112 c2.023,0.815,4.157,1.338,6.333,1.664c2.179,0.313,4.422,0.415,6.701,0.127c1.137-0.149,2.287-0.394,3.418-0.802 c1.129-0.405,2.252-0.959,3.265-1.745c1.019-0.771,1.92-1.77,2.571-2.913c0.331-0.568,0.601-1.167,0.82-1.775 c0.21-0.611,0.364-1.236,0.47-1.859c0.11-0.619,0.17-1.24,0.193-1.852c0.008-0.154,0.008-0.307,0.008-0.461v-0.398 c0.005-0.234,0.011-0.468,0.022-0.716c0.052-0.967,0.166-1.914,0.376-2.832c0.418-1.832,1.213-3.537,2.405-5.009 c1.192-1.472,2.767-2.711,4.552-3.706c1.79-0.994,3.765-1.774,5.862-2.355C35.917,4.247,34.808,4.238,33.7,4.335z"/> </g> </svg> ===================================================== == File: src/homepage/images/james.svg ===================================================== <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-223 283 164 228" style="enable-background:new -223 283 164 228;" xml:space="preserve"> <style type="text/css"> .st0{display:none;} .st1{display:inline;} .st2{fill:#FFFFFF;} .st3{fill:#E74A24;} .st4{fill:none;} .st5{fill:url(#SVGID_1_);} .st6{fill:#E4262A;} .st7{font-family:'Poppins-Regular';} .st8{font-size:28px;} </style> <g id="Calque_2" class="st0"> <rect x="-233.5" y="269.3" class="st1" width="186" height="258"/> </g> <g id="Calque_1"> <g> <circle class="st2" cx="-141.1" cy="342.3" r="59.3"/> <path class="st3" d="M-100.2,317.9c-3.2-2.1-6.5-3.9-9.9-4.7c-3.4-0.9-7-0.7-10.2,0.7l-0.6,0.3l-0.3,0.1l-0.2,0.1l-0.1,0l0,0l0,0 c0,0-0.1,0,0,0l0,0c-0.4,0.3-0.9,0.5-1.3,0.7c-0.9,0.5-1.8,0.9-2.7,1.2c-1.9,0.6-3.8,1.1-5.9,0.9c-1-0.1-2-0.5-2.9-1.1 c-0.9-0.6-1.5-1.4-2-2.3c-0.9-1.8-1.2-3.7-1.3-5.6c0.3,1.9,0.9,3.7,1.9,5.2c0.5,0.7,1.2,1.4,1.9,1.8c0.8,0.4,1.6,0.6,2.5,0.7 c1.7,0.1,3.5-0.4,5.2-1.2c0.8-0.4,1.6-0.8,2.4-1.2c0.4-0.2,0.8-0.5,1.1-0.7l0.7-0.4c0.2-0.1,0.4-0.3,0.7-0.4 c1.8-1,3.8-1.6,5.8-1.7c2-0.1,4.1,0.1,6,0.8c1.9,0.6,3.7,1.6,5.2,2.8C-102.6,314.9-101.2,316.3-100.2,317.9z"/> <path class="st4" d="M-172.3,334c-0.3,0.2,8.2,10.4,20.9,20c3.7,2.9,7.4,5.3,10.7,7.4c0.3-0.4,0.5-0.8,0.7-1.1 c-3.2-2.1-6.8-4.6-10.5-7.4C-163.1,343.3-171.9,333.7-172.3,334z"/> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.0298" y1="783.6619" x2="46.1336" y2="783.6619" gradientTransform="matrix(-0.1008 -0.9949 -0.9949 0.1008 623.7179 292.7814)"> <stop offset="0" style="stop-color:#FBC315"/> <stop offset="0.4969" style="stop-color:#E74A24"/> <stop offset="1" style="stop-color:#E4262A"/> </linearGradient> <path class="st5" d="M-152.8,353.1c-12.7-9.6-21.2-19.7-20.9-20c0.3-0.3,9.2,9.3,21.8,18.8c3.7,2.8,7.3,5.3,10.5,7.4 c0-0.1,0.1-0.1,0.1-0.2c0.5-1,0.9-2.1,1.2-3.2c-2.3-4.5-7.9-10.8-14.4-16.5c-1.5-1.3-3-2.4-4.5-3.4c-0.3,2.7-1,4.6-1,4.6 c0,0-0.7-2.6-0.7-5.7c-1-0.6-2.1-1.2-3.1-1.7c0,3.1-0.9,5.4-0.9,5.4c0,0-1.8-3.1-2-6.8c0,0,0,0,0-0.1c-6.1-2.8-11.3-4.2-11.3-4.2 c-0.1-0.1,0.4,13,10.1,23c0.3,0,0.7,0,1,0c3.5,0,6.5,1.3,6.5,1.3c0,0-1.8,1.1-4.6,1.5c1,0.8,2,1.5,3,2.1c2.5-0.9,4.7-1.2,4.7-1.2 c0,0-1.1,1.1-3,2.2c6.7,3.7,12.8,5.6,16.7,5.8c0.5-0.6,1-1.2,1.4-1.8C-145.4,358.4-149,356-152.8,353.1z"/> <path class="st6" d="M-107.5,317.7c-2.4,0.2-4.9,0.6-7.3,1.3c-4.8,1.4-9.5,3.8-13.4,7.5c-2,1.8-3.6,4-5,6.3 c-1.4,2.3-2.5,4.8-3.2,7.4c-0.7,2.6-1.2,5.2-1.3,7.8c0,0.6-0.1,1.3-0.1,2l0,0.9l0,0.8c0,1-0.1,2-0.3,3c-0.1,0.7-0.3,1.5-0.5,2.2 c-0.3,1.1-0.7,2.2-1.2,3.2c0,0.1-0.1,0.1-0.1,0.2c-0.2,0.4-0.5,0.8-0.7,1.1c-0.4,0.6-0.9,1.2-1.4,1.8c-0.4,0.4-0.8,0.8-1.2,1.2 c-2.9,2.5-6.9,4.3-11.1,5.4c-4.3,1.1-8.9,1.7-13.5,2.1c-4.7,0.3-9.4,0.4-14.2,0.2c4.5,1.8,9.2,2.9,14,3.7 c4.8,0.7,9.8,0.9,14.8,0.3c2.5-0.3,5.1-0.9,7.6-1.8c2.5-0.9,5-2.1,7.2-3.8c2.3-1.7,4.2-3.9,5.7-6.4c0.7-1.3,1.3-2.6,1.8-3.9 c0.5-1.3,0.8-2.7,1-4.1c0.2-1.4,0.4-2.7,0.4-4.1c0-0.3,0-0.7,0-1l0-0.9c0-0.5,0-1,0-1.6c0.1-2.1,0.4-4.2,0.8-6.2 c0.9-4,2.7-7.8,5.3-11c2.6-3.2,6.1-6,10.1-8.2c4-2.2,8.3-3.9,13-5.2C-102.6,317.5-105,317.5-107.5,317.7z"/> </g> <g> <path class="st2" d="M-217.7,479.8c-1.9,0-3.4-0.2-4.7-0.7v-5.7c1.6,0.4,3,0.6,4.2,0.6c3.7,0,5.6-2.4,5.6-7.1v-40.3h6.8v40.1 c0,4.3-1,7.5-3,9.8C-210.8,478.7-213.8,479.8-217.7,479.8z"/> ===================================================== == File: src/homepage/_posts/2007-09-16-jspf-0.9.5.markdown ===================================================== --- layout: post title: "jSPF-0.9.5 released" date: 2007-09-16 16:13:22 +0200 categories: james update --- We are proud to announce the [availability][availability] of APACHE jSPF-0.9.5. This release brings initial support for asynchronous processing and is fully RFC4408 compliant. [availability]: /download.cgi ===================================================== == File: src/homepage/_posts/2019-03-26-james-3.3.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.3.0" date: 2019-03-26 09:09:47 +0100 categories: james update --- The Apache James developers are pleased to announce James server 3.3.0 release. Here are some points we worked on: ### Added - Metrics for BlobStore - New Guice product using Cassandra RabbitMQ ElasticSearch, OpenStack Swift and optional LDAP dependency (experimental) - JPA SMTP dockerFile contributed by [matzepan](https://github.com/matzepan) - Listing healthchecks, thanks to [Madhu Bhat](https://github.com/kratostaine) - Configuring the ElasticSearch clusterName - Logging and Metrics now supports Elasticsearch 6 (previously only Elasticsearch 2 was supported) - Implementation of the RabbitMQ EventBus - DeadLetter APIs and memory implementation for storing events that failed delivery - RecipientRewriteTable Aliases and associated WebAdmin routes ### Fixed - MAILBOX-350 Potential invalid UID <-> MSN mapping upon IMAP COPY - Possibility to better zoom in Grafana boards - default ElasticSearch shards & replica configured values - Move & copy batch sizes are now loaded from configuration ### Changed - WebAdmin ReIndexing API had been reworked - MailboxListener and mailbox event system were reworked. Custom listeners will need to be adapted. Please see Upgrade instuctions. - Docker images are now using a JRE instead of a JDK - Replacement of the old mailbox event system with the EventBus ### Removed - Drop HBase and JCR components (mailbox and server/data). ### Third party softwares - Tika prior 1.20 is subject to multiple CVEs. We recommend the upgrade Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2022-01-26-james-3.6.2.markdown ===================================================== --- layout: post title: "Apache James Server 3.6.2" date: 2022-01-26 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.6.2 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. ## Announcements [More announcements to follow this release] ## Release changelog This is a maintenance release addressing the following issues: - JAMES-3646 Rely on strong typing for file paths operations - Upgrade Log4J to 2.17.1 (CVE-2021-44832 + CVE-2021-45105) - Upgrade Logback to 1.2.9 (CVE-2021-42550) [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2011-12-07-protocols-1.6.0-RC1.markdown ===================================================== --- layout: post title: "Apache James Protocols 1.6.0-RC1 released" date: 2011-10-07 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 1.6.0-RC1 of Apache James Protocols library. ===================================================== == File: src/homepage/_posts/2009-07-17-jMPT-0.1.markdown ===================================================== --- layout: post title: "Apache MPT 0.1 released" date: 2009-07-17 16:13:22 +0200 categories: james update --- The Apache James project is pleased to announced that the first release of [Apache MPT][MPT] - a functional testing library particularly suitable for line protocols based on ASCII - is now [available][available] . These protocols are common in mail but the library may be useful more widely. See the [release notes][notes] for more details. [notes]: http://james.apache.org/mpt/0.1/release-notes.html [available]: /download.cgi#Apache_MPT [MPT]: http://james.apache.org/mpt ===================================================== == File: src/homepage/_posts/2023-06-20-fail2ban.markdown ===================================================== --- layout: post title: "Guest post: James and fail2ban" date: 2023-05-17 01:16:30 +0200 categories: james update --- Credits: Paul Gunter [Original][Original] version. # Repel brute force attacks with Linux firewall (iptables) and fail2ban ## Introduction Servers on the Internet are constantly under attack. Mail servers are also attacked to gain control of a server that can be used to send bulk spam emails. This often leads to these servers ending up on various black lists and can no longer be used as mail servers. A safe basic configuration of James is required at this point. Nevertheless, attacks can mean that the server can practically no longer be operated. These are often DoS or DDoS attacks (Denial-of-Service or Distributed Denial-of-Service), which smaller servers in particular are difficult to defend against. However, basic protection via the firewall is relatively easy to reach. But even after that, attacks can be seen, especially those that try to spy out access data. These attacks can be detected by monitoring the log files. So the attack patterns are known and can be repelled with fail2ban. All examples refer to a Linux operating system, Windows is not covered. The examples are shown using Ubuntu and can be transferred to other Linux variants. “iptables” is used as the firewall front end. ## Setting The following assumes a small mail server on which only an SSH service can be accessed from outside in addition to Apache James. In the example, the SSH service uses the standard port 22, James uses the standard ports 25 (smtp), 110 (pop3) and/or 143 (imap). The examples refer to Apache James 3.8.0 (Spring App). The operating system is Ubuntu 22.04. The configuration should be carried out beforehand on a test system and not during operation. One thing to note about James is that changes to log4j2's configuration usually take effect immediately. ## (D)DoS - Attacks An attempt is made to load the server with so many requests that it no longer works. In the case of DDos, this is carried out in parallel by a large number of servers, which also means a corresponding ===================================================== == File: src/homepage/_posts/2007-04-05-JAMES-2.3.1-RC1.markdown ===================================================== --- layout: post title: "James Server 2.3.1 RC1 released" date: 2007-04-05 16:13:22 +0200 categories: james update --- James PMC is proud to announce the [availability][availability] of the first release candidate of James Server 2.3.1. This release is maintenance release. See the [changelog][changelog] for more detail. [availability]: http://downloads.apache.org/james/server/rc [changelog]: http://issues.apache.org/jira/browse/James?report=com.atlassian.jira.plugin.system.project:changelog-panel ===================================================== == File: src/homepage/_posts/2022-08-26-james-3.7.1.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.1" date: 2022-08-26 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.1 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement As this is a minor maintenance release. This release addresses CVE-2022-28220 `STARTTLS command injection in Apache JAMES`. It also includes various bugfixes. ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#361---2022-08-26 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2006-09-03-JSPF-0.9-b3.markdown ===================================================== --- layout: post title: "jSPF 0.9 b3 Released" date: 2006-09-03 16:13:22 +0200 categories: james update --- James PMC is proud to announce the [availability][availability] of the third beta of jspf 0.9. This version has start to use the official spf testsuite to fix all rfc issues. [availability]: http://downloads.apache.org/james/jspf/ ===================================================== == File: src/homepage/_posts/2022-10-28-jspf-1.0.2.markdown ===================================================== --- layout: post title: "Apache James JSPF 1.0.3" date: 2022-12-30 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 1.0.3 release of the JSPF library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. This release fixes error management for DSNJava asynchronous capabilities The Apache James PMC would like to thanks all contributors who made this release possible! [tracker]: https://issues.apache.org/jira/projects/JSPF/issues [download]: https://james.apache.org/download.cgi#Apache_jSPF ===================================================== == File: src/homepage/_posts/2011-02-06-protocols-1.5.markdown ===================================================== --- layout: post title: "Apache James Protocols 1.5" date: 2011-02-06 16:13:22 +0200 categories: james update --- The Apache James Project is happy to announce the release of version 1.5 of the Apache James Protocols. [Read the release notes][notes] [notes]: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12311060&version=12316655 ===================================================== == File: src/homepage/_posts/2009-05-16-Mailet-crypto-0.1.markdown ===================================================== --- layout: post title: "Apache Crypto Mailets 1.0 released" date: 2009-05-16 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce the first independent release of [Apache Cryptographic Mailets][crypto] (previous versions were released as part of the [Apache James Server][server]). This package contains mailets which encode, decode, sign and verify mail plus cryptology utilities. [server]: http://james.apache.org/server [crypto]: http://james.apache.org/mailet/crypto ===================================================== == File: src/homepage/_posts/2012-01-07-mime4j-0.7.2.markdown ===================================================== --- layout: post title: "Apache James Mime4j 0.7.2 released" date: 2012-01-07 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 0.7.2 of Apache James Mime4j library. ===================================================== == File: src/homepage/_posts/2024-03-05-mime4j-0.8.11.markdown ===================================================== --- layout: post title: "Apache James MIME4J 0.8.11" date: 2024-03-05 03:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8.11 release of the MIME4J library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. This release fixes a minor regression of the 0.8.10 release regarding invalid encoding in email headers. The Apache James PMC would like to thanks all contributors who made this release possible! [CHANGELOG]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2007-04-15-JAMES-2.3.1.markdown ===================================================== --- layout: post title: "James Server 2.3.1 Final Released" date: 2007-04-15 16:13:22 +0200 categories: james update --- James PMC is proud to announce the [availability][availability] of the final release of James Server 2.3.1. More information on what has been fixed since the 2.3.0 release can be found in the [changelog][changelog] . [availability]: download.cgi [changelog]: /server/2.3.1/changelog.html ===================================================== == File: src/homepage/_posts/2010-06-02-mailet-base-1.1.markdown ===================================================== --- layout: post title: "Apache Mailet Base 1.1 released" date: 2010-06-02 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce a new [Apache Mailet Base][base] release which fixes a NullPointerException when using MatcherInverter. [base]: http://james.apache.org/mailet/api ===================================================== == File: src/homepage/_posts/2016-01-08-module-merge.markdown ===================================================== --- layout: post title: "James modules merge into james-project" date: 2016-01-08 16:13:22 +0200 categories: james update --- Some of James modules were merged into [james-project][git]. This change was done in order to speed up our development phase before the 3.0 release and as long as important changes are needed on the API. The modules merged are: james-server, apache-james-mailbox, apache-mailet, apache-james-mpt, protocols. [git]: https://git-wip-us.apache.org/repos/asf?p=james-project.git;a=tree ===================================================== == File: src/homepage/_posts/2016-02-08-moving-to-git.markdown ===================================================== --- layout: post title: "Moving to GIT!" date: 2016-02-09 16:13:22 +0200 categories: james update --- All James projects has been migrated from SVN to GIT. Here are the links to your favorite projects: - [james-project][james-project] - [james-jdkim][james-jdkim] - [james-jsieve][james-jsieve] - [james-jspf] [james-jspf] - [james-mime4j][james-mime4j] - [james-postage][james-postage] [james-project]: https://git-wip-us.apache.org/repos/asf?p=james-project.git [james-jdkim]: https://git-wip-us.apache.org/repos/asf?p=james-jdkim.git [james-jsieve]: https://git-wip-us.apache.org/repos/asf?p=james-jsieve.git [james-jspf]: https://git-wip-us.apache.org/repos/asf?p=james-jspf.git [james-mime4j]: https://git-wip-us.apache.org/repos/asf?p=james-mime4j.git [james-postage]: https://git-wip-us.apache.org/repos/asf?p=james-postage.git ===================================================== == File: src/homepage/_posts/2022-03-01-james-3.7.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.0" date: 2022-03-21 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.0 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement As of Apache James version 3.7.0 we removed support for maildir storage format. Users relying on maildir are encouraged to switch to other backends. Maildir can still be used as part of the 3.6.x release train. ## Most noticeable changes The Apache James PMC is pleased to announce the additions of the following components/features in Apache James 3.7.0: - Multiple bug fixes. We hopefully significantly improved James overall stability. - Multiple performance enhancements. This new release ships a blazing fast server! - Multiple additions had been made to our [JMAP][JMAP] implementation including: - Implementation of RFC-9007 for composing MDN messages with JMAP - Support for JMAP integration with Web Push (RFC-8030), including encryption - Multiple additional JMAP methods: Email/import, Identity/set, etc... - Periodical cleanup of JMAP uploads - Ease TLS configuration by accepting PEM keys. This makes it easier to use Let's encrypt and certbot. - Task to delete unreferenced blobs when blob deduplication is enabled on top of the Distributed James server. - Use of PBKDF2 as a strong password-hashing algorithm - Allow disabling SMTP/IMAP plain auth for increased security - Addition of a James product dedicated to mail processing relying on Apache Pulsar for its mail queue (experimental) - Support for IMAP SASL OAUTH authentication mechanism. Used successfully with OIDC! - Extension for rate limiting upon email processing (memory and redis backend) ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [JMAP]: https://jmap.io [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#362---2022-01-26 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2016-10-19-james-3.0.markdown ===================================================== --- layout: post title: "New logo" date: 2016-10-19 16:13:22 +0200 categories: james update --- We choosed a new logo!  ===================================================== == File: src/homepage/_posts/2017-06-23-jsieve-0.7.markdown ===================================================== --- layout: post title: "Apache James JSieve 0.7" date: 2017-06-23 11:30:00 +0700 categories: james update --- James JSieve 0.7 has been released. The library is available as a maven artifact, for instance for jsieve core: ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-jsieve-core</artifactId> <version>0.7</version> </dependency> ``` This release solves issues with folded encoded header matching. It also adds an additional DiscardAction to make discarding emails explicit for the calling code. ===================================================== == File: src/homepage/_posts/2024-06-07-jspf-1.0.4.markdown ===================================================== --- layout: post title: "Apache James JSPF 1.0.4" date: 2024-06-07 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 1.0.4 release of the JSPF library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. This release fixes the DSNJava asynchronous resolver that was mis-behaving since 1.0.2 release/ The Apache James PMC would like to thanks all contributors who made this release possible! [tracker]: https://issues.apache.org/jira/projects/JSPF/issues [download]: https://james.apache.org/download.cgi#Apache_jSPF ===================================================== == File: src/homepage/_posts/2018-05-07-mime4j-0.8.2.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.8.2" date: 2018-05-07 11:30:00 +0700 categories: james update --- James Mime4J 0.8.2 has been released. This release solves the following bugs: - MIME4J-267 MIME4J DOM parsing errors on specific formats - MIME4J-273 Correcting encoder splitting point The following feature were added: - MIME4J-269 Introduce a safe to use, PERMISSIVE configuration - MIME4J-268 DefaultMessageWriter: expose a convenient *asBytes* method - MIME4J-271 Make possible to define a Content-Type parameter - MIME4J-272 Implicit DOM builder call The library is available as a maven artifact, for instance for mime4j core: ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-mime4j-core</artifactId> <version>0.8.2</version> </dependency> ``` You can also download the release artifacts [here]. [here]: https://downloads.apache.org/james/mime4j/0.8.2/ ===================================================== == File: src/homepage/_posts/2012-04-08-James-3.0-beta4.markdown ===================================================== --- layout: post title: "Apache James Server 3.0-beta4 released" date: 2012-04-08 16:13:22 +0200 categories: james update --- The Apache James project is happy to announce the release of version 3.0-beta4 of its modular mail server. We thank all Users for their feedback and tests and we encourage anyone to [download][download] and discover this Milestone 3 release. If you're interested in contributing to the James project, please subscribe to the James [mailing lists][mail]. [download]: http://james.apache.org/download.cgi#Apache_James_Server [mail]: http://james.apache.org/mail.html ===================================================== == File: src/homepage/_posts/2007-01-03-Mailet-api.markdown ===================================================== --- layout: post title: "Mailet API to become a sub-project" date: 2007-01-03 16:13:22 +0200 categories: james update --- The James commiters have voted to promote the Mailet API to its own James sub-project. This move will provide a clearer division between development of the API and development of James server, and we hope this will encourage more participation from external projects. The effort will start small, by releasing the current version, and move on to look at the enhancements we've been discussing over on [the mailet api list][list] where we will extend a warm welcome to anyone who has something to contribute. Eventually we hope to extend the scope of the sub-project to include things like a Reference Implementation independent of James Server and suitable for embedding, an SDK, and possibly a TCK. [list]: http://james.apache.org/mail.html ===================================================== == File: src/homepage/_posts/2025-03-03-jspf-1.0.5.markdown ===================================================== --- layout: post title: "Apache James JSPF 1.0.5" date: 2025-03-03 15:44:00 +0700 categories: james update --- The Apache James developers are pleased to announce the 1.0.5 release of the JSPF library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. This release fixes the DSNJava asynchronous resolver that was improperly handling errors asynchronously. The Apache James PMC would like to thanks all contributors who made this release possible! [tracker]: https://issues.apache.org/jira/projects/JSPF/issues [download]: https://james.apache.org/download.cgi#Apache_jSPF ===================================================== == File: src/homepage/_posts/2007-05-15-mailet-api-lives.markdown ===================================================== --- layout: post title: "Mailet API sub-project lives" date: 2007-05-15 16:13:22 +0200 categories: james update --- Following a decision taken by the James PMC a few months ago, the Apache Mailet API project is now independent of James Server and has its own [webpage][webpage] and its own source repository. [webpage]: /mailet/index.html ===================================================== == File: src/homepage/_posts/2009-06-16-jsieve-03.markdown ===================================================== --- layout: post title: "Apache JSieve 0.3 released" date: 2009-06-16 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce that the third release of [Apache JSieve][JSieve] - an implementation of the [Sieve][Sieve] mail filtering language - is now available for [download][download]. This is the first modular release and includes a filtering [mailet][mailet]. See the [release notes][notes] for more details. [JSieve]: http://james.apache.org/jsieve [mailet]: http://james.apache.org/mailet. [download]: /download.cgi#Apache_JSieve [notes]: http://james.apache.org/jsieve/0.3/release-notes.html [Sieve]: http://www.ietf.org/rfc/rfc3028.txt ===================================================== == File: src/homepage/_posts/2016-11-19-james-3.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.0-beta5" date: 2016-11-19 16:13:22 +0200 categories: james update --- James server 3.0.0-beta5 has been released. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2019-08-30-latest-image-changes.markdown ===================================================== --- layout: post title: "Apache James `latest` Docker images changes" date: 2019-08-30 09:09:47 +0100 categories: james update --- We have decided to change the `latest` Docker images behaviour. Until nowadays, such images were built on the `master` branch for each products (`linagora/james-memory`, `linagora/james-cassandra-rabbitmq-ldap-project`, ...). This is not the way `latest` docker image should be, this [blog post](https://blog.container-solutions.com/docker-latest-confusion) is explaining this kind of misunderstood. So we decided to follow the global Docker users behaviour which is to clone the _latest stable release_ as the Docker `latest` images. For those of you who are willing to use a Docker image on top of the master branch, you can use the newly created `branch-master` tag, which is published on each merge on the master branch. NB: you should not use the `latest` image in a production deployment, otherwise you are at risk of jumping from one major release to another unexpectedly. Thanks for reading, Antoine ===================================================== == File: src/homepage/_posts/2015-10-08-james-2.3.1.markdown ===================================================== --- layout: post title: "Apache James Server 2.3.2.1 released" date: 2015-10-08 16:13:22 +0200 categories: james update --- Guice injection is now available in a new [Java project][guice]. Feel free to try it! [guice]: https://github.com/apache/james-project/tree/trunk/server/container/cassandra-guice/ ===================================================== == File: src/homepage/_posts/2011-01-06-imap-mailbox-0.2.markdown ===================================================== --- layout: post title: "Apache James IMAP 0.2 and Mailbox 0.2" date: 2011-01-06 16:13:22 +0200 categories: james update --- The Apache James Project is happy to announce the release of version 0.2 of the Apache James IMAP and Mailbox components with following features: - Numerous IMAP bug fixes (better client support, memory improvement, NIO and IO support...). - Support for IMAP IDLE (RFC 2177, server transmit updates to the client in real time). - Support for IMAP User Flags. - Support for IMAP WITHIN Extensions (RFC 5032). - Mailbox Tooling to copy from a persistence implementation to another implementation. - ... See also the complete release notes for [IMAP 0.2][IMAP] and [Mailbox 0.2][Mailbox]. [IMAP]: http://s.apache.org/n8 [Mailbox]: http://s.apache.org/SNu ===================================================== == File: src/homepage/_posts/2011-11-07-jspf-1.0.0.markdown ===================================================== --- layout: post title: "Apache James jSPF 1.0.0 released" date: 2011-10-07 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 1.0.0 of Apache James jSPF (Sender Policy Framework) library. ===================================================== == File: src/homepage/_posts/2021-12-02-james-3.6.1.markdown ===================================================== --- layout: post title: "Apache James Server 3.6.1" date: 2021-12-02 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.6.1 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. ## Announcements This release fixes the following vulnerability issues, that are present prior to 3.6.1: - *CVE-2021-38542*: Apache James vulnerable to STARTTLS command injection (IMAP and POP3) - *CVE-2021-40110*: Apache James IMAP vulnerable to a ReDoS - *CVE-2021-40111*: Apache James IMAP parsing Denial Of Service - *CVE-2021-40525*: Apache James: Sieve file storage vulnerable to path traversal attacks We recommend users to upgrade to this version. ## Release changelog Here are some points we worked on: ### Fixed - JAMES-3676 Avoid S3 connection leaks - JAMES-3477 Mail::duplicate did lead to file leak in various places - JAMES-3646 Sanitize some File based components - Prevent directory traversal on top of maildir mailbox (#659) - FileMailRepository shoud reject URL outside of James root - SieveFileRepository should validate underlying files belong to its root - JAMES-1862 Generalize STARTTLS sanitizing fix - JAMES-1862 Prevent Session fixation via STARTTLS - JAMES-3634 + JAMES-3635 Apply fuzzing to Apache James - Upgrade PrefixedRegex to RE2J - Fuzzed input throws String out of bound exception for FETCH - Prevent String OutOfBoundException for IMAP APPEND - Prevent infinite loop for IMAP STATUS command parser - Prevent infinite loop for IMAP APPEND command parser - JAMES-3571 MimeMessageWrapper getSize was incorrect for empty messages - JAMES-3525 verifyIdentity should not fail on null sender - JAMES-3556 Fix JMAP eventUrl s/closeAfter/closeafter/ - JAMES-3432 JMAP Uploads could alter the underlying byte source - JAMES-3537 (Email/set create should allow to attach mails) - JAMES-3558 JMAP Email/changes: When created + updated return both - JAMES-3558 JMAP Email/changes: moves should be considered as updates - JAMES-3557 Changes collectors should be ordered - JAMES-3277 Distinct uids before calling toRanges - JAMES-3434 Refactoring: EmailSubmissionSetMethod should not rely on nested clases ===================================================== == File: src/homepage/_posts/2021-09-21-james-joinsapachecon.markdown ===================================================== --- layout: post title: "Getting Apache James to serve 1M+ digital mailboxes of all Estonian residents " date: 2021-09-21 00:00:30 +0200 categories: james update --- The Apache James team is proud to announce that one of our committers, Juhan Aasaru, presents a James talk at [ApacheCON @home 2021][apacheCON] Here is the [talk description][desc]: Every Estonian (e)resident has a digital mailbox that is a secure application for the state and local government bodies to contact the resident and vice versa. A year ago our company won the tender to improve this service and to replace the legacy systems with something scalable. This is the story of how we started to look out for best technical solutions for the problem and found Apache James. How we made a proposition to the government agency responsible for providing this mailing service to use Apache James (and Apache Cassandra that powers the system under the hood). How we jumped into the Apache James community to understand the product and find a way to solve the requirements that were missing from the feature set. How we get tremendous help from the community and how we managed to give something back as well. Eventually our story could be a lesson learned for someone who plans to undertake something similar together with tips on how to correctly build a system on top of open source and what to avoid. Most of his working life Juhan has worked as a Java developer and Solutions Architect. He has also been CTO in two startup companies. A few years ago he was working on a Fintech startup and contributed to Apache Fineract but recently his attention has moved away from Fintech towards Apache James. Join him Tuesday, 21th of September in the *highligh* track. This talk can be seen on [youtube][youtube]. [apacheCON]: https://www.apachecon.com/acah2021/index.html [desc]: https://www.apachecon.com/acah2021/tracks/highlight.html [youtube]: https://www.youtube.com/watch?v=uA775icp-kk ===================================================== == File: src/homepage/_posts/2017-10-02-BlogPostInstallingJames.markdown ===================================================== --- layout: post title: "Blog post: Easy and secure James installation" date: 2017-10-03 16:13:22 +0200 categories: james update --- In a recent [blog post], [Thibaut] explains us how to easily set up a James server on a personal domain. He gives hints about DNS configuration, SSL configuration, James configuration, and SPF configuration. All those features explained with working examples! [blog post]: https://medium.com/@thibaut.sautereau/installing-james-3-0-with-spf-verification-421b26b92f11 [Thibaut]: https://github.com/thithib ===================================================== == File: src/homepage/_posts/2022-10-07-jdkim-0.3.markdown ===================================================== --- layout: post title: "Apache James JDKIM 0.3" date: 2022-10-07 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.3 release of the JDKIM library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. This release relocates the DKIM mailet into Apache James, upgrades dependencies, and fixed two bugs: ``` Fix FWS is not trimmed correctly DKIM-38 Support several headers with different cases ``` The Apache James PMC would like to thanks all contributors who made this release possible! [tracker]: https://james.apache.org/download.cgi#Apache_jDKIM [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2011-10-07-mime4j-0.7.1.markdown ===================================================== --- layout: post title: "Apache James Mime4j 0.7.1 released" date: 2011-10-07 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 0.7.1 of Apache James Mime4j library ===================================================== == File: src/homepage/_posts/2010-05-01-mailet-1.0.markdown ===================================================== --- layout: post title: "Apache Mailet Standard 1.0 released" date: 2010-05-01 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce that the first independent release of [Apache Mailet Standard][standard]/ - was bundled with James Server 2.3 before - is now available for [download][download]. [standard]: http://james.apache.org/mailet/standard/ [download]: download.cgi#Apache_JSieve ===================================================== == File: src/homepage/_posts/2019-03-19-mime4j-0.8.3.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.8.3" date: 2019-03-19 08:13:22 +0700 categories: james update --- James Mime4J 0.8.2 has been released. This release includes the following changes: - MIME4J-270: Using "alternative" as default subtype - MIME4J-263: decoding encoded words with empty encoded-text - MIME4J-279: Fixed JavaDoc errors to comply with Java8 - MIME4J-280: Improve exception handling - MIME4J-283: DecoderUtil performance fix The library is available as a maven artifact, for instance for mime4j core: ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-mime4j-core</artifactId> <version>0.8.3</version> </dependency> ``` You can also download the release artifacts [here]. [here]: https://downloads.apache.org/james/mime4j/0.8.3/ ===================================================== == File: src/homepage/_posts/2016-05-09-jmap.markdown ===================================================== --- layout: post title: "JMAP implementation" date: 2016-05-09 16:13:22 +0200 categories: james update --- We are now supporting all basic operations on mailboxes: - creating: through the *setMailboxes* JMAP command - reading: through the *getMailboxes* JMAP command - updating: through the *setMailboxes* JMAP command - deleting: through the *setMailboxes* JMAP command ===================================================== == File: src/homepage/_posts/2009-01-16-MAILET-2.4.markdown ===================================================== --- layout: post title: "Apache Mailet 2.4 released" date: 2009-01-16 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce the first independent release of [mailet][Apache Mailet] (previous versions were released as part of the [server][Apache James Server]). The Mailet API defines a standard approach to enterprise mail processing. [server]: http://james.apache.org/server [mailet]: http://james.apache.org/mailet/api ===================================================== == File: src/homepage/_posts/2006-10-03-JAMES-2.3.markdown ===================================================== --- layout: post title: "James Server 2.3.0 Final Released" date: 2006-10-03 16:13:22 +0200 categories: james update --- James PMC is proud to announce the [availability][availability] of the long awaited final release of James Server 2.3.0. More information on what's new can be found in the [changelog][changelog] . [availability]: download.cgi [changelog]: /server/2.3.0/changelog.html ===================================================== == File: src/homepage/_posts/2012-01-08-protocols-1.6.1.markdown ===================================================== --- layout: post title: "Apache James Protocols 1.6.1 released" date: 2012-01-08 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 1.6.1 of Apache James Protocols library. ===================================================== == File: src/homepage/_posts/2019-09-05-james-3.4.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.4.0" date: 2019-09-05 15:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.4.0 release. Here are some points we worked on: ### Added - Add in-memory docker image - Support of AWS S3 as blobstore - WebAdmin routes for mapping management (`AddAddressMapping`, `AddRegexMapping`, `ListMappings`), previously only manageable by CLI - Metrics for Deleted Message Vault - More metrics for BlobStore (new delete & deleteBucket configuration) ### Changed - (experimental) New implementation of the deleted message vault on top of an object store, not relying anymore on a repository. This avoids exposing messages via webAdmin. Messages previously stored in the vault will be lost. - Migration to ElasticSearch 6.3 - Blob export to LinShare - Native DKIM support for outgoing mails. The mailets from james-jdkim have been included in main James project. ### Deprecated - Zookeeper component. This will be removed after 3.4 release. If you have development skills, and are willing to maintain this component, please reach us. ### Removed - Karaf OSGi implementation. It was not compiled nor tested for a year. We didn't get any feedback about that and we don't have the resources nor the skills to maintain it any more. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2007-02-04-JSPF-0.9-beta4.markdown ===================================================== --- layout: post title: "jSPF-0.9b4 released" date: 2007-02-04 16:13:22 +0200 categories: james update --- James PMC is proud to announce the [availability][availability] of the fourth beta of jspf 0.9. This version pass all tests in the last official release of the [spf testsuite][spf_testsuite] . [availability]: http://downloads.apache.org/james/jspf/beta [spf_testsuite]: http://www.openspf.org/svn/project/test-suite/rfc4408-tests-2007.01.yml ===================================================== == File: src/homepage/_posts/2009-10-17-jdkim.markdown ===================================================== --- layout: post title: "jDKIM joins Apache James as sub-project" date: 2009-10-17 16:13:22 +0200 categories: james update --- The Apache James project is pleased to announce the inclusion of a new sub-project called [jDKIM][jDKIM]. jDKIM is a DomainKeys Identified Mail (DKIM) implementation library written in Java. It provides both verification and signing and also provides Mailets for the Apache James project. [jDKIM]: http://james.apache.org/jdkim/ ===================================================== == File: src/homepage/_posts/2007-05-16-mime4j-0.3.markdown ===================================================== --- layout: post title: "Apache Mime4J 0.3 Final Released" date: 2007-05-16 16:13:22 +0200 categories: james update --- After almost 2 years the Apache James team is proud to announce the [availability][availability] of Apache Mime4J 0.3. This is the first release under the ASF umbrella. [availability]: /download.cgi ===================================================== == File: src/homepage/_posts/2020-07-16-james-3.5.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.5.0" date: 2020-07-16 15:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.5.0 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. ## Announcements ### Distributed James guice product beta Furthermore, recent work of the Apache James project did lead to a James product that leverages a distributed mail server, using storage technologies like [Cassandra], [ElasticSearch], [RabbitMQ], and [objectStorage (S3/Swift)]. Feedback on this product, announced as a beta since 3.5.0 is welcome. This product can be executed via [docker-compose] or you can follow its [standard installation guide] ### End of support for Java 8 James 3.5.x is the last release line to support Java 8. From 3.6.0 James will run on a Java Runtime Environment 11. ## Release changelog Here are some points we worked on: ### Added - Distributed task management for Distributed James product. This enables several James servers to share a consistent view of tasks being currently executed. - JAMES-2563 Health check for ElasticSearch - JAMES-2904 Authentication and SSL support for Cassandra backend - JAMES-2904 Authentication and SSL support for ElasticSearch backend - JAMES-3066 Add support alias when sending emails, with a ["allowed From headers" webadmin endpoint](https://github.com/apache/james-project/blob/master/src/site/markdown/server/manage-webadmin.md#retrieving-the-list-of-allowed-from-headers-for-a-given-user) - JAMES-3062 HealthCheck for EventDeadLetters - JAMES-3058 WebAdmin offline task to correct mailbox inconsistencies on top of Cassandra products - JAMES-3105 WebAdmin offline task to recompute mailbox counters on top of Cassandra products - JAMES-3072 Webadmin endpoint to export mailbox backup ### Changed - Multiple changes have been made to enhance Distributed James indexing performance: - Use of routing keys to collocate documents per mailbox - Under some configuration, html was not extracted before document indexing - Removed unnecessary fields from mailbox mapping - Disable dynamic mapping thanks to a change of the header structure - JAMES-2855 Multiple library/plugin/docker images/build tool upgrades - By default the cassandra keyspace creation by James is now disabled by default. This allow to have credentials limited to a keyspace. It can be enabled by setting cassandra.keyspace.create=true in the cassandra.properties file. ===================================================== == File: src/homepage/_posts/2011-03-06-jspf-0.9.9.markdown ===================================================== --- layout: post title: "Apache James jSPF 0.9.9" date: 2011-03-06 16:13:22 +0200 categories: james update --- The Apache James Project is happy to announce the release of version 0.9.9 of the Apache James jSPF which includes fixes related to OSGI. [Read the release notes][notes] [notes]: https://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&jqlQuery=project+%3D+JSPF+AND+fixVersion+%3D+%220.9.9%22+AND+status+%3D+Resolved+ORDER+BY+priority+DESC&mode=hide ===================================================== == File: src/homepage/_posts/2009-03-16-Mime4j-0.6.markdown ===================================================== --- layout: post title: "MailetDocs Maven Plugin 0.1 released" date: 2009-03-16 16:13:22 +0200 categories: james update --- We are proud to announce the [availability][availability] of Apache Mime4j-0.6. This release brings another round of API enhancements and performance optimizations. There has been a number of notable improvements in the DOM support. MIME stream parser is expected to be 50% faster when line counting is disabled. Please also note that as of this release Mime4j requires a Java 1.5 compatible runtime [availability]: /download.cgi ===================================================== == File: src/homepage/_posts/2010-05-02-jsieve-0.4.markdown ===================================================== --- layout: post title: "Apache JSieve 0.4 released" date: 2010-05-02 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce that the forth release of [Apache JSieve][JSieve] - an implementation of the [Sieve][Sieve] mail filtering language - is now available for [download][download] [JSieve]: http://james.apache.org/jsieve [mailet]: http://james.apache.org/mailet. [download]: /download.cgi#Apache_JSieve [notes]: http://james.apache.org/jsieve/0.3/release-notes.html [Sieve]: http://www.ietf.org/rfc/rfc3028.txt ===================================================== == File: src/homepage/_posts/2018-06-06-linagora-june-nl.markdown ===================================================== --- layout: post title: "Linagora June newsletter" date: 2018-06-06 11:30:00 +0700 categories: james update --- In the name of the James team @Linagora I will be presenting you what we did in the past few weeks, and plan to work on in the coming weeks. We have to work on some specific features to make James easier to adopt for large organizations. # What was achieved in May ## Notifications when soon over quota > A mail needs to be sent to the user to warn him. This is an attempts to allow clients not implementing quota's RFCs to still get the warning. > > This is implemented with mailbox listeners (and not mailets), with event sourcing. We added the interfaces and implementations to achieve this feature in James using event sourcing with events being stored in Cassandra or in memory. > Such a technical solution might be very useful to implement other feature. > > This mailbox listener is optional. We allowed one to register his (potentially custom) mailbox listeners when working with Guice. ## Searching user by quota usage > This would allow an admin to inspect per-user quota usage, via a webadmin interface. > > Again, we provided two implementations: a scanning one, which naively enumerates mailboxes to compute occupation, and one where quota occupation is indexed in ElasticSearch. ## Performance enhancements > In order to have a very good mail search experience, it is possible to plug Apache Tika as a text extractor into James. We use Tika as an external service that we call with HTTP. When you use this Tika extractor with ElasticSearch indexing, you get a very powerful fulltext search even on complex attachment format like LibreOffice documents. > > We did experience slow requests with our Tika server. We contributed [this issue] which significantly enhanced Tika server performance, and we introduce a cache on James side to reduce calls to tika. > > We also worked on improving massive JMAP operation performance (delete a large number of emails). # What we will work on in June ## Data Leak Prevention > We should have a matcher applying rules defined by the admin. This matcher will then store suspicious emails in specific mail repository for an admin review. > > To implement this, we need to enhance browsing to MailRepository via WebAdmin. We need to allow storing such rules as well as updating them via webadmin. We need finally a mailet storing emails in a repository given its sender domain. ### Exporting a mail account > As an administrator, I should be able to export the content of my mail account. This both allows easier migrations, comply with legal requirements as well as allow some forms of backups. > > The chosen format is EMLs in a ZIP format, with the folder structure described in archive meta-data, and specific metadata to ease restoring a James account (flags, etc...). An administrator (via webamin) should be able to download/upload such backups in order to do export/restores mail accounts. ===================================================== == File: src/homepage/_posts/2024-01-08-mime4j-0.8.10.markdown ===================================================== --- layout: post title: "Apache James MIME4J 0.8.10" date: 2024-01-08 03:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8.10 release of the MIME4J library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. This release fixes `CVE-2024-21742: Mime4J DOM header injection`. The Apache James PMC would like to thanks all contributors who made this release possible! [CHANGELOG]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2007-02-03-feathercast-fetures.markdown ===================================================== --- layout: post title: "Feathercast features James" date: 2007-02-03 16:13:22 +0200 categories: james update --- James PMC member and commiter [Danny Angus][link] was interviewed about James by David Reid for Feathercast episode 24. You can download the podcast from [here][podcast] [link]: http://people.apache.org/list_A.html [podcast]: http://feathercast.org/?p=39 ===================================================== == File: src/homepage/_posts/2018-11-14-james-3.2.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.2.0" date: 2018-11-14 12:13:22 +0700 categories: james update --- The Apache James developers are pleased to announce James server 3.2.0 release. Here are some points we worked on: ### Added - Mail filtering configured via the JMAP protocol - WebAdmin exposed mail re-indexing tasks - WebAdmin exposed health checks. This includes: - Possibility to perform a single healthcheck, thanks to [mschnitzler](https://github.com/mschnitzler) - Cassandra health checks thanks to [matzepan](https://github.com/matzepan) - IMAP MOVE commend (RFC-6851) On top of JPA. Thanks to [mschnitzler](https://github.com/mschnitzler) - JPA support for Sieve script storage thanks to [Sebast26](https://github.com/sebast26) - Sieve script upload via the CLI thanks to [matzepan](https://github.com/matzepan) - Mailet DOC: Exclude from documentation annotation thanks to [mschnitzler](https://github.com/mschnitzler) - **cassandra.pooling.max.queue.size** configuration option Thanks to [matzepan](https://github.com/matzepan) - **RecipentDomainI** and **SenderDomainIs** matchers by [athulyaraj](https://github.com/athulyaraj) ### Changed - Multiple libraries updates - Migration from Cassandra 2 to Cassandra 3 - Mail::getSender was deprecated. Mail::getMaybeSender offers better Null Sender support. Java 8 default API method was used to not break compatibility. ### Deprecated - HBase and JCR components (mailbox and server/data). This will be removed as part of 3.3.0. If you have development skills, and are willing to maintain these components, please reach us. ### Removed - Drop partially implemented Kafka distributed events ### Third party softwares - SpamAssassin prior 3.4.2 is subject to multiple CVEs. We recommend the upg Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server [Sebast26]: https://github.com/sebast26 [mschnitzler]: https://github.com/mschnitzler [matzepan]: https://github.com/matzepan ===================================================== == File: src/homepage/_posts/2010-12-06-protocols-1.2.markdown ===================================================== --- layout: post title: "Apache James Protocols 1.2 released" date: 2010-11-05 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 3.0-M2 (Milestone 2) of the Apache James server. M2 is not only a fast corrective release on M1 (issues related to JMX security configuration on Windows platforms,...), but also contains an important number of enhancement and JIRA fixes. For example, memory usage has been reduced thanks to optimizations on the ActiveMQ component usage (responsible for the mail spooling). We thank all Users for their feedback and tests and we encourage anyone to discover this Milestone 2 release. If you're interested in contributing to the James project, please subscribe to the James [mailing lists][lists] [lists]: http://james.apache.org/mail.html ===================================================== == File: src/homepage/_posts/2025-01-29-james-3.7.6.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.6" date: 2025-01-29 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.6 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement This release comprise minor bug fixes enhancing Apache James stability. This release fixes the following security issues: - **CVE-2024-37358**: Denial of service through the use of IMAP literals - **CVE-2024-45626**: Denial of service through JMAP HTML to text conversion ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#376 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2010-11-06-james-3.0-M2.markdown ===================================================== --- layout: post title: "Apache James Server 3.0-M2 released" date: 2010-12-06 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 1.2 of the Apache James Protocols. ===================================================== == File: src/homepage/_posts/2023-05-17-james-3.8.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.8.0" date: 2023-05-17 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.8.0 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thank all contributors who made this release possible! ## Announcement This release brings the following significant changes: - Upgrade TCP protocols to Netty 4 - Migrate IMAP protocol as reactive - Multiple additional IMAP extensions are implemented - Upgrade to Cassandra driver 4 - Migrate to OpenSearch - Review our threading model to cap threads performing blocking tasks - Implement official JMAP quotas specification ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#380---2023-05-17 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2017-10-03-Hacktoberfest.markdown ===================================================== --- layout: post title: "Hacktoberfest: contribute to James" date: 2017-10-03 16:13:22 +0200 categories: james update --- The James project joins the [Hactoberfest]! Retrieve available issues on [GitHub].  Contributions are diversified and feature some core James components like: - Additional mailet/matcher contributions - Additional Command Line options - Additional WebAdmin functionality - JPA Mailbox missing components [Hactoberfest]: https://hacktoberfest.digitalocean.com/ [GitHub]: https://github.com/linagora/james-project/issues?q=is%3Aissue+is%3Aopen+label%3AHacktoberfest ===================================================== == File: src/homepage/_posts/2016-07-09-jmap.markdown ===================================================== --- layout: post title: "JMAP implementation" date: 2016-07-09 16:13:22 +0200 categories: james update --- Read and Send message with attachments. You can now send and read messages with attachments through the JMAP commands *setMessages* and *getMessages*. Those attachments are uploaded via the */upload* and downloaded via the */download* JMAP endpoints. ===================================================== == File: src/homepage/_posts/2008-10-16-mime4j-0.5.markdown ===================================================== --- layout: post title: "Mime4j 0.5 released" date: 2008-10-16 16:13:22 +0200 categories: james update --- we are proud to announce the [availability][availability] of APACHE Mime4j-0.5. This release addresses a number of important issues discovered since 0.4. In particular, it improves Mime4j ability to deal with malformed data streams including those intentionally crafted to cause excessive CPU and memory utilization that can lead to DoS condition This release also fixes a serious bug that can prevent Mime4j from correctly processing binary content [availability]: /download.cgi ===================================================== == File: src/homepage/_posts/2022-10-06-james-3.7.2.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.2" date: 2022-10-06 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.2 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement This release proposes stability related bug fixes and updates some dependencies for security reasons. ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#372---2022-10-06 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2007-04-04-james-commiters-guidelines.markdown ===================================================== --- layout: post title: "Apache James Project Guidelines published" date: 2007-04-04 16:13:22 +0200 categories: james update --- The James PMC has approved - for the first time - a set of [guidelines]: guidelines.html for the project. These guidelines are intended to reflect and summarize well-known practices in our community. They include "... definitions of how conflict is resolved by voting, who is able to vote, and the procedures to follow for proposing and making changes to the Apache James products. ===================================================== == File: src/homepage/_posts/2022-12-30-james-3.7.3.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.3" date: 2022-12-30 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.3 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement This release fixes CVE-2022-45935: Temporary File Information Disclosure in Apache JAMES. This release proposes stability related bug fixes and updates some dependencies for security reasons. ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#373---2022-12-30 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2009-02-16-MAILET-docs-plugin-0.1.markdown ===================================================== --- layout: post title: "MailetDocs Maven Plugin 0.1 released" date: 2009-02-16 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce the first release of the [MailetDocs]: http://james.apache.org/mailet/maven-mailetdocs-plugin/ plugin for [Maven][Maven]. The plugin catalogs mailet (for [example][example]). For more information, see the [release notes][notes]. [Maven]: http://maven.apache.org [example]: http://james.apache.org/mailet/standard/mailet-report.html [notes]: http://james.apache.org/mailet/maven-mailetdocs-plugin/release-notes.html ===================================================== == File: src/homepage/_posts/2015-09-08-james-2.3.1.markdown ===================================================== --- layout: post title: "Apache James Server 2.3.2.1 released" date: 2015-09-08 16:13:22 +0200 categories: james update --- This release fixes a security vulnerability - Users are invited to upgrade (read [annouce on the Apache James blog][blog]). [blog]: https://blogs.apache.org/james/entry/apache_james_server_2_3 ===================================================== == File: src/homepage/_posts/2020-10-29-testing-james-with-jmeter.markdown ===================================================== --- layout: post title: "Performance testing for James with JMeter" date: 2020-10-29 15:16:30 +0200 categories: community --- Ever wanted to figure out what Apache James gets in its guts? Xian Long detailed in this [blog post][post] how to be using JMeter in order to run some IMAP performance tests on top of the distributed server, using [JMeter][jmeter] [Other tools][james-gatling], based on [Gatling][gatling] had been developed within the community, addressing SMTP, IMAP and [JMAP][JMAP] protocols. [post]: https://www.cnblogs.com/hanxianlong/p/13894595.html [jmeter]: https://jmeter.apache.org/ [gatling]: https://gatling.io/ [JMAP]: https://jmap.io/ [james-gatling]: https://github.com/linagora/james-gatling ===================================================== == File: src/homepage/_posts/2009-06-17-jspf-0.9.7.markdown ===================================================== --- layout: post title: "Apache jSPF 0.9.7 released" date: 2009-06-17 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce a new [Apache jSPF][jSPF] release which included some critical bug fixes. [jSPF]: http://james.apache.org/jspf ===================================================== == File: src/homepage/_posts/2010-09-04-imap-0.2-M1.markdown ===================================================== --- layout: post title: "Apache IMAP 0.2-M1 released" date: 2010-09-04 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce a new [Apache IMAP][imap] release in preparation of the upcoming 3.0-M1 [Apache Mail server][imap] [imap]: http://james.apache.org/imap ===================================================== == File: src/homepage/_posts/2023-03-20-james-3.7.4.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.4" date: 2023-03-20 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.4 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement This release comprise minor bug fixes enhancing Apache James stability. ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#374---2023-03-20 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2009-08-17-james-2.3.2.markdown ===================================================== --- layout: post title: "Apache James 2.3.2 Released" date: 2009-08-17 16:13:22 +0200 categories: james update --- The Apache James project is pleased to announce that Apache James 2.3.2 is now [available][available]. This is a minor bug fix release. See the [Release Notes][notes] for more details. Upgrading is recommended for users of previous 2.x releases. [notes]: http://james.apache.org/server/2.3.2/release-notes.html [available]: /download.cgi#Apache_James_2.3.2_is_the_stable_version ===================================================== == File: src/homepage/_posts/2018-01-26-admin-features.markdown ===================================================== --- layout: post title: "New administration features: manage your queues and your reporitories" date: 2018-01-26 00:00:22 +0200 categories: james update --- An often asked feature for James is the ability to handle the mails, that after some processing, have landed in a [repository], for example /var/mail/error/. A brand new webadmin API allows you to handle the content of these repositories, see the documentation in [manage-webadmin]. It allows you to list the repositories, their content, but also to reprocess one or several mails in the processor and queue of your choice. Oh! And bonus, now you can forget this non scalable file repository and use the brand new Cassandra repository! On the same documentation page you will also find the new mail queue management API, done to list queued mails, remove some of them regarding different criteria, but also flush delayed mails. Most of the work on these already usable features is done, but we still have some ideas for related improvements. [Contributions] are welcomed! [repository]: http://james.apache.org/server/feature-persistence.html [Contributions]: https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20in%20(feature)%20AND%20component%20%20in%20(Queue%2C%20%22MailStore%20%26%20MailRepository%22)%20AND%20type%20in%20(Improvement) [manage-webadmin]: https://james.apache.org/server/manage-webadmin.html ===================================================== == File: src/homepage/_posts/2011-04-06-mime4J-0.7.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.7" date: 2011-04-06 16:13:22 +0200 categories: james update --- The Apache James Project is happy to announce the release of version 0.7 of the Apache James Mime4J. Mime4J is a flexible MIME parsing library written in Java. SAX, DOM and pull parsing styles are supported. The 0.7 release brings another round of API enhancements, bug fixes and performance optimizations. A major effort has been put in code reorganization, separating parsing code from DOM manipulation code. Mime4J has been restructured into three separate modules: 'core', 'dom' and 'storage'. The 'core' package provides an event-driven SAX style parser that relies on a callback mechanism to report parsing events such as the start of an entity header the start of a body, etc. The 'dom' package contains base/abstract classes and interfaces for MIME-DOM manipulation aiming to provide the base for a full featured traversable DOM. Per default the Mime4J DOM builder stores content of individual body parts in memory. The 'storage' package provides support for more complex storage backends such on-disk storage systems, overflow on max limit, or encrypted storage through JSSE API. Mime4J 0.7 improves support for headless messages, malformed separation between headers and body and adds support for "obsolete" rfc822 syntax (e.g: "Header<somespace>: " style). Parsing performance for quoted printable streams have been considerably improved. A "DecodeMonitor" object has been introduced in most code to define how to deal with malformed input (Lenient vs Strict behaviours). Mime4J 0.7 also provides LenientFieldParser as an alternative to DefaultFieldParser when a higher degree of tolerance to non-severe MIME field format violations is desired. [Read the release notes][notes] [notes]: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310521&version=12313592 ===================================================== == File: src/homepage/_posts/2017-07-20-james-3.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.0.0" date: 2017-07-20 16:13:22 +0200 categories: james update --- James server 3.0.0 has been released ! You are welcome to [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2017-05-16-mime4j-0.8.1.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.8.1" date: 2017-06-16 11:30:00 +0700 categories: james update --- James Mime4J 0.8.1 has been released. The library is available as a maven artifact, for instance for mime4j core: ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-mime4j-core</artifactId> <version>0.8.1</version> </dependency> ``` This release solves issues with header Date handling in the dom project: - It was not possible to know if the Date header was set as a default value was always provided - Valid dates missing century was badly parsed. ===================================================== == File: src/homepage/_posts/2008-08-17-JSIEVE-0.2.markdown ===================================================== --- layout: post title: "Apache JSieve 0.2 released" date: 2008-08-17 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce the first public release of [jsieve][Apache JSieve] an implementation of [RFC3028][RFC3028 - Sieve: A Mail Filtering Language] for Java. [jsieve]: http://james.apache.org/jsieve [RFC3028]: http://www.faqs.org/rfcs/rfc3028.html ===================================================== == File: src/homepage/_posts/2010-11-05-james-3.0-M1.markdown ===================================================== --- layout: post title: "Apache IMAP 0.2-M1 released" date: 2010-11-05 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 3.0-M1 (Milestone 1) of the Apache James server. The Apache James Server is a 100% pure Java enterprise mail server based on open protocols. Currently supported are SMTP/LMTP, POP3, IMAP4 protocols together with several different storage solutions (relational database via JPA and JDBC, File system with MailDir, JCR Content Repsitory). The James server also serves as a mail application platform. It hosts the Apache Mailet API, and acts has a Mailet container. This feature makes it easy to design, write, and deploy custom applications for mail processing. This modularity and ease of customization is one of James' strengths, and can allow administrators to produce powerful applications surprisingly easily. Features for that version include enhancements to nearly every area of functionality, including full IMAP support, improved mailing list capabilities, fastfail support, SMTP API for developing own fastfail filters and the next revision of the Mailet API. This was an exciting time in James development and we thank all contributors. We are still actively looking for eager, capable developers to contribute to James. If you're interesting in contributing to the James project, please subscribe to the James [mailing lists]: http://james.apache.org/mail.html. Information about James can be found at the James web site at [http://james.apache.org/][web]. [web]: http://james.apache.org/ ===================================================== == File: src/homepage/_posts/2021-04-21-mime4j-0.8.4.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.8.4" date: 2021-04-21 13:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce Apache James Mime4J 0.8.4. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The changelog for this release can be seen [here][changelog] [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: http://james.apache.org/download.cgi#Apache_James_Server [changelog]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md ===================================================== == File: src/homepage/_posts/2022-12-30-mime4j-0.8.9.markdown ===================================================== --- layout: post title: "Apache James MIME4J 0.8.9" date: 2022-12-30 03:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8.9 release of the MIME4J library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. The Apache James PMC would like to thanks all contributors who made this release possible! [CHANGELOG]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2011-08-06-james-beta3.markdown ===================================================== --- layout: post title: "Apache James Server 3.0-beta3 released" date: 2011-08-06 16:13:22 +0200 categories: james update --- The Apache James project is happy to announce the release of version 3.0-beta3 of its modular mail server. We thank all Users for their feedback and tests and we encourage anyone to [download][download] and discover this Milestone 3 release. If you're interested in contributing to the James project, please subscribe to the James [mailing lists][lists] What's new in 3.0-beta3 for end users: - Numerous IMAP bug fixes (better client support, memory improvement, NIO and IO support...) - Support for IMAP IDLE (RFC 2177, server transmit updates to the client in real time) - Support for IMAP User Flags - Support for IMAP WITHIN Extensions (RFC 5032) - Mailbox Tooling to copy from a persistence implementation to another implementation - Telnet Management has been removed in favor of JMX with client shell - More metrics counters available via JMX - Better debug logging on protocols - JPA validated against more databases (among others Oracle) - Multiple address and port configurations per protocol - POP3 is now operational (was buggy in 3.0-M2) - Upgrade tool from James 2.3 is available - Better logging on protocols with adjustable level - Full mailet package must be specified - Composite Matchers - Better debug logging on protocols - Mailing list functionality has been removed - More documentation on web site for configuration,... - Java 1.6 mandatory - ... and much more, see details on https://issues.apache.org/jira/secure/ReleaseNote.jspa?in&version=12316850&styleName=Html&projectId=10411 What's new in 3.0-beta3 for developers: - Less maven modules - Maven 3.0.2 required to build - Upgrade to latest frameworks versions (netty, activemq, jackrabbit...) - Code reports generation via 'mvn site -P site-reports' maven profile - Corrections further to findbugs,... reports - Code formatting - ... and much more, see details on https://issues.apache.org/jira/secure/ReleaseNote.jspa?in&version=12316850&styleName=Html&projectId=10411 [Quick Start][quick] ===================================================== == File: src/homepage/_posts/2018-02-12-gsoc-2018.markdown ===================================================== --- layout: post title: "Apache JAMES joins Google Summer of code 2018 !" date: 2018-02-1 00:00:22 +0200 categories: announcements --- This year, James developers will propose ideas of Google Summer of Code projects for students. [Google Summer of Code] is a global program focused on bringing more student developers into open source software development. Students work with an open source organization on a 3 month programming project during their break from school.  We consider it is a dreamed occasion to discover the Apache James project, and get on board in this amazing project! We are willing to offer high quality mentoring on high added value, useful tasks. As a student: - ?? You will discover how Open Source world works. You will exchange with our community. - ?? You will be advised by experienced, long term committers. - ?? You will build technical experience on a mail server. - ?? And hopefully you will get some code contributions on an Apache project. Here are some ideas of applications: - ⚒ [JAMES-1931] We are in need of a WebAdmin User Interface to ease our beloved administrator API. You will need to build an administration website on top of the **webAdmin** REST API. - ⚒ [JAMES-1932] James allow to fully customize mail processing. But we miss tools to ease edition and testing of the processing flow. - ⚒ [JAMES-1933] Emails need to be secure. Many protocols like DKIM, SPF and DMARC allow to meet this purpose. However we need more documentation and a DMARC implementation. - ⚒ [JAMES-2335] James should be a flexible server. We should be able to use custom configuration providers, not only XML files as of today. That is a move toward "clustering done the right way". Of course, we are very open if you want to propose other ideas to us! Come and discuss this on [our gitter channel] or on the issues directly. Thank you by advance for your involvement and hope to see you around! [Google Summer of Code]: https://summerofcode.withgoogle.com/ [JAMES-1931]: https://issues.apache.org/jira/browse/JAMES-1931 [JAMES-1932]: https://issues.apache.org/jira/browse/JAMES-1932 [JAMES-1933]: https://issues.apache.org/jira/browse/JAMES-1933 [JAMES-2335]: https://issues.apache.org/jira/browse/JAMES-2335 [our gitter channel]: https://gitter.im/apache/james-project ===================================================== == File: src/homepage/_posts/2021-09-26-mime4j-0.8.6.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.8.6" date: 2021-09-26 13:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce Apache James Mime4J 0.8.6 This release mostly enhances performances: - MIME4J-306 MimeUtil::unfold should group char appends (#52) - MIME4J-305 ContentUtil::decode can avoid using StringBuilder (#51) - MIME4J-304 DecoderUtil::decodeEncodedWords without REGEXP (#50) Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The changelog for this release can be seen [here][changelog] [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: http://james.apache.org/download.cgi#Apache_James_Server [changelog]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md ===================================================== == File: src/homepage/_posts/2016-07-19-jmap.markdown ===================================================== --- layout: post title: "JMAP implementation" date: 2016-07-19 16:13:22 +0200 categories: james update --- Full text search via JMAP. Full text search via the *getMessageList* JMAP command is now supported. The JMAP search **filtering** parameter is converted to an internal *SearchQuery*; then this query is processed by your binded search backend. ===================================================== == File: src/homepage/_posts/2008-03-16-gsoc-2008.markdown ===================================================== --- layout: post title: "James publishes project ideas for Google Summer of Code '08" date: 2008-03-16 16:13:22 +0200 categories: james update --- The James Team are delighted to announce that we're proposing two project ideas for [Google Summer of Code (GSOC) 2008][gsoc]. The project Ideas are set out on the Apache GSOC wiki [here]: http://wiki.apache.org/general/SummerOfCode2008#james . In brief they are: - Develop a VERP Mailet to allow James to write VERP modified return addresses on outbound messages, and an inbound mailet/matcher to identify VERP bounces and invoke configurable "do something" code. - James' provided mailing list manager is fine for small closed groups, but lacks the functionality of a more robust MLM, the project is to add some all or more of the following features subscriber and message moderation, double opt-in and bounce handling. [gsoc]: : http://code.google.com/soc/2008/ ===================================================== == File: src/homepage/_posts/2019-11-19-apache-con-eu.markdown ===================================================== --- layout: post title: "Benoit Tellier presents James at ApacheCon Europe" date: 2019-11-19 16:16:30 +0200 categories: james apachecon --- Benoit had the pleasure to present James at the ApacheCon at Berlin: "Gaining control over emails with Apache James". If you missed him you can see his conference on [youtube][Youtube], or read his [article][article]. [youtube]: https://www.youtube.com/watch?v=zr8qpNkL6U4 [article]: https://medium.com/linagora-engineering/linagora-representing-james-at-the-apachecon-europe-2019-c6e28b31242a ===================================================== == File: src/homepage/_posts/2011-05-06-jdKim0.2.markdown ===================================================== --- layout: post title: "Apache James jDKIM 0.2" date: 2011-05-06 16:13:22 +0200 categories: james update --- The Apache James Project is happy to announce the release of version 0.2 of the Apache James jDKIM library. jDKIM is a DKIM implementation library written in Java. It provides both verification and signing and also provides Mailets for the Apache JAMES project. This is the first official release of the library, but the code has been in production almost unchanged since two years. [Read the release notes][notes] [notes]: https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310990&version=12314300 ===================================================== == File: src/homepage/_posts/2009-09-17-hupa.markdown ===================================================== --- layout: post title: "Hupa joins Apache James as sub-project" date: 2009-09-17 16:13:22 +0200 categories: james update --- The Apache James project is pleased to announce the inclusion of a new sub-project called [Hupa][Hupa]. Hupa is a GWT based webmail which use IMAP to connect to the backend mailserver. [Hupa]: http://james.apache.org/hupa/ ===================================================== == File: src/homepage/_posts/2010-06-03-jspf-0.9.8.markdown ===================================================== --- layout: post title: "Apache jSPF 0.9.8 released" date: 2010-06-03 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce a new [Apache jSPF][jSPF] release which includes fixed to TXT record escaping and pass the rfc4408-tests-2009.10 testsuite. [jSPF]: http://james.apache.org/jspf ===================================================== == File: src/homepage/_posts/2022-10-28-mime4j-0.8.8.markdown ===================================================== --- layout: post title: "Apache James MIME4J 0.8.8" date: 2022-10-28 03:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8.8 release of the MIME4J library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. The Apache James PMC would like to thanks all contributors who made this release possible! [CHANGELOG]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2010-09-03-protocols-1.2-M2.markdown ===================================================== --- layout: post title: "Apache protocols 1.2-M1 released" date: 2010-09-03 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce a new Apache protocols release in preparation of the upcoming 3.0-M1 [Apache Mail server][imap]. [imap]: http://james.apache.org/imap ===================================================== == File: src/homepage/_posts/2021-03-16-james-3.6.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.6.0" date: 2021-03-16 15:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.6.0 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. ## Announcements ### Experimental support for JMAP RFC-8621 and deprecation of JMAP Draft Since the last release we worked hard refreshing our JMAP implementation, implementing both [JMAP core][jmap-core], [JMAP mail][jmap-mail] and the [JMAP over WebSocket][jmap-ws] specifications. Their support is considered experimental and early adopters' feedback is highly welcomed. [JMAP Draft][jmap-draft] should be considered legacy, and will be removed in upcoming 3.7.0 release. ### Switch to Java 11 for build and run We adopted Java Runtime Environment 11 from James release 3.6.0. James 3.5.0 is the last version offering Java Runtime Environment 8 support. ## Release changelog Here are some points we worked on: ### Added - JAMES-2884 Partial Support for JMAP RFC-8621: The current implementation status allow reading mailboxes, emails, vacation responses. - JAMES-3457 Implement JMAP eventSource - JAMES-3491 JMAP over websocket (RFC-8887) - JAMES-3470 JMAP RFC-8621 Email/changes + Mailbox/changes support - JAMES-3117 Add PeriodicalHealthChecks for periodical calling all health checks - JAMES-3143 WebAdmin endpoint to solve Cassandra message inconsistencies - JAMES-3138 Webadmin endpoint to recompute users current quotas on top of Guice products - JAMES-3296 Webadmin endpoint to rebuild RabbitMQMailQueue in the Distributed Server - JAMES-3266 Offer an option to disable ElasticSearch in Distributed James product - JAMES-3202 Reindex only outdated documents with the Mode option set to CORRECT in reindexing tasks - JAMES-3405 Expose metrics of Guice servers over HTTP - enables easy Prometheus metrics collection - JAMES-3407 Distributed server: Read-repairs for the mailbox entity - JAMES-3428 Distributed server: Read-repairs for the mailbox counters entity - JAMES-3139 Expose RabbitMQ channel & connection configuration - JAMES-3441 Make possible and document Distributed Server setup with specialized instances - JAMES-3337 Document the use of JWT - JAMES-3399 Allow JSON logging with logback - enables structure logging with FluentBit - JAMES-3396 WebAdmin should try to prevent RRT addresses redirection loops when possible - JAMES-3402 JMAP MDN messages should have a Date header ===================================================== == File: src/homepage/_posts/2016-09-19-james-3.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.0" date: 2016-09-19 16:13:22 +0200 categories: james update --- We are currently working on the release. Keep an eye on the [news][news], we are planning to release the next version in November. [news]: http://james.apache.org/newsarchive.html ===================================================== == File: src/homepage/_posts/2022-04-01-mime4j-0.8.7.markdown ===================================================== --- layout: post title: "Apache James MIME4J 0.8.7" date: 2022-04-01 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8.7 release of the MIME4J library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. The Apache James PMC would like to thanks all contributors who made this release possible! [CHANGELOG]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md#087---2022-04-01 [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2022-10-28-jsieve-0.8.markdown ===================================================== --- layout: post title: "Apache James JSieve 0.8" date: 2022-10-28 02:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8 release of the JSieve library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. This release targets JDK 8, update dependencies, and also brings a couple bug fixes. See the [release notes][notes]. The Apache James PMC would like to thanks all contributors who made this release possible! [notes]: https://github.com/apache/james-jsieve/blob/master/RELEASE_NOTES.txt [tracker]: https://issues.apache.org/jira/projects/JSIEVE/issues [download]: https://james.apache.org/download.cgi#Apache_JSieve ===================================================== == File: src/homepage/_posts/2009-04-16-Mailet-base-0.1.markdown ===================================================== --- layout: post title: "Apache Mailet Base 1.0 released" date: 2009-04-16 16:13:22 +0200 categories: james update --- The Apache James Project is pleased to announce the first independent release of [Apache Mailet Base][base] (previous versions were released as part of the [Apache James Server][server]). The Basic Mailet Toolkit contains lightweight frameworks and utilities likely to be of interest to [Mailet][mailet] developers. [base]: http://james.apache.org/mailet/base [server]: http://james.apache.org/server [mailet]: http://james.apache.org/mailet/api ===================================================== == File: src/homepage/_posts/2018-07-31-james-3.1.0.markdown ===================================================== --- layout: post title: "Apache James Server 3.1.0" date: 2018-07-31 16:13:22 +0200 categories: james update --- James server 3.1.0 has been releases. Here are some points we worked on: ### Added - Introduce an object store - Configurable listeners - MDN (Message Disposition notification) parsing and handling - SpamAssassin support with per user reports - Search in attachments - Data Leak Prevention - JPA SMTP Guice product - Cassandra migration process - Structured logging - RPM packaging (in addition to deb packaging) - Delegating folders ### Changed - Move to Java 8 - Improve Mail Repositories handling, including a nice web API - Improve Mail Queues handling, including a nice web API - Improve RRT (Recipient Rewrite Table) implementation - Quota handling improvements, and in particular users can receive an email when they are near the limit of their quota - Many performances enhancement, in particular on Cassandra backend - Documentation updates Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2006-08-02-james-website-updates.markdown ===================================================== --- layout: post title: "James Products website revamped<" date: 2006-08-02 16:13:22 +0200 categories: james update --- We just finished a major update of james products to be able to publish each product specific site under this new website structure ===================================================== == File: src/homepage/_posts/2008-08-16-mime4j-0.4.markdown ===================================================== --- layout: post title: "Mime4j 0.4 released" date: 2008-08-16 16:13:22 +0200 categories: james update --- We are proud to announce the [availability][availability] of APACHE Mime4j-0.4. This release brings a number of significant improvements in terms of supported capabilities, flexibility and performance: - Revised and improved public API with support for pull parsing - Support for parsing of 'headless' messages transmitted using non SMTP transports such as HTTP - Reduced external dependencies. Mime4j is no longer directly dependent on log4j and commons-io - Improved parsing performance (up to 10x for large messages) - More comprehensive header parsing including support for RFC1864, RFC2045, RFC2183, RFC2557 and RFC3066 - Revised packaging and exception hierarchy. MimeException now extends IOException [availability]: /download.cgi ===================================================== == File: src/homepage/_posts/2012-06-08-hupa-0.2.markdown ===================================================== --- layout: post title: "Apache Hupa 0.0.2 released" date: 2012-06-08 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server Project is happy to announce the release of version 0.0.2 of Apache Hupa, the James rich webmail client. ===================================================== == File: src/homepage/_posts/2024-01-09-james-3.7.5.markdown ===================================================== --- layout: post title: "Apache James Server 3.7.5" date: 2024-01-09 01:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.7.5 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thanks all contributors who made this release possible! ## Announcement This release comprise minor bug fixes enhancing Apache James stability. This release fixes the following security issues: - **CVE-2023-51747**: SMTP smuggling in Apache James - **CVE-2023-51518**: Privilege escalation via JMX pre-authentication deserialisation ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#375---2024-01-09 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2016-02-09-jmap.markdown ===================================================== --- layout: post title: "JMAP implementation" date: 2016-02-09 16:13:22 +0200 categories: james update --- We are actively working on implementing JMAP protocol into James. [JMAP][JMAP] is a transport-agnostic, stateless JSON-based API for synchronising a mail client with a mail server. It allows to develop easily a mail client in a browser, without the pain of using a server to proxy IMAP commands. Feel free to help us, you can see our advancement on the specification implementation into [jmap/doc][doc] [JMAP]: http://jmap.io [doc]: https://github.com/apache/james-project/tree/3.3.x/server/protocols/jmap/doc/specs ===================================================== == File: src/homepage/_posts/2024-12-23-mime4j-0.8.12.markdown ===================================================== --- layout: post title: "Apache James MIME4J 0.8.12" date: 2024-12-23 03:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce the 0.8.12 release of the MIME4J library. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. This release fixes a minor regression of the 0.8.12 release regarding UTF-8 encoding. The Apache James PMC would like to thanks all contributors who made this release possible! [CHANGELOG]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: https://james.apache.org/download.cgi#Apache_Mime4J ===================================================== == File: src/homepage/_posts/2024-01-09-james-3.8.1.markdown ===================================================== --- layout: post title: "Apache James Server 3.8.1" date: 2024-01-09 02:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.8.1 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thank all contributors who made this release possible! ## Announcement This release comprise minor bug fixes enhancing Apache James stability. This release fixes the following security issues: - **CVE-2023-51747**: SMTP smuggling in Apache James - **CVE-2023-51518**: Privilege escalation via JMX pre-authentication deserialisation ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#381---2024-01-09 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2012-01-07-protocols-1.6.0.markdown ===================================================== --- layout: post title: "Apache James Protocols 1.6.0 released" date: 2012-01-07 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 1.6.0 of Apache James Protocols library. ===================================================== == File: src/homepage/_posts/2021-07-02-mime4j-0.8.5.markdown ===================================================== --- layout: post title: "Apache James Mime4J 0.8.5" date: 2021-07-02 13:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce Apache James Mime4J 0.8.5. This release mostly enhances performances (dates, base64 encoding, case sensitivity management, ...) Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The changelog for this release can be seen [here][changelog] [tracker]: https://issues.apache.org/jira/browse/MIME4J [download]: http://james.apache.org/download.cgi#Apache_James_Server [changelog]: https://github.com/apache/james-mime4j/blob/master/CHANGELOG.md ===================================================== == File: src/homepage/_posts/2006-08-03-2.3.0-RC3.markdown ===================================================== --- layout: post title: "James Server 2.3.0 RC3 Released" date: 2006-08-02 16:13:22 +0200 categories: james update --- James PMC is proud to announce the [availability][availability] of the third, and hopefully last, release candidate of James Server 2.3.0. More information on what's new can be found in the [changelog]: /server/2.3.0/changelog.html. New development roadmaps are being discussed right now, so stay tuned for 2.3.0 final and for the following news. [availability]: http://downloads.apache.org/james/server/ ===================================================== == File: src/homepage/_posts/2011-10-06-protocols-1.6-beta2.markdown ===================================================== --- layout: post title: "Apache James Protocols 1.6-beta1 released" date: 2011-10-06 16:13:22 +0200 categories: james update --- The Java Apache Mail Enterprise Server (a.k.a. Apache James) Project is happy to announce the release of version 1.6-beta1 of Apache James Protocols library. ===================================================== == File: src/homepage/_posts/2017-10-20-james-3.0.1.markdown ===================================================== --- layout: post title: "Security release: Apache James server 3.0.1" date: 2017-10-20 00:00:22 +0200 categories: james update --- The Apache James PMCs are glad to announce you the release version 3.0.1 of Apache James server. It fixes vulnerability described in CVE-2017-12628. The JMX server, also used by the command line client is exposed to a java de-serialization issue, and thus can be used to execute arbitrary commands. As James exposes JMX socket by default only on local-host, this vulnerability can only be used for privilege escalation. Release 3.0.1 upgrades the incriminated library. Note that you can take additional defensive steps in order to mitigate this vulnerability: - Ensure that you restrict the access to JMX only on local-host - Ensure that you are using a recent Java Run-time Environment. For instance OpenJDK 8 u111 is vulnerable but OpenJDK 8 u 141 is not. - You can additionally run James in a container to limit damages of potential exploits - And of course upgrade to the newest 3.0.1 version. Read more about Java deserialization [issues]. [issues]: https://www.sourceclear.com/blog/Commons-Collections-Deserialization-Vulnerability-Research-Findings/ ===================================================== == File: src/homepage/_posts/2025-03-04-jdKim0.4.markdown ===================================================== --- layout: post title: "Apache James jDKIM 0.4" date: 2025-03-04 16:43:22 +0700 categories: james update --- The Apache James Project is happy to announce the release of version 0.4 of the Apache James jDKIM library. jDKIM is a DKIM implementation library written in Java. It provides both verification and signing. This release updates DNS Java to a non-vulnerable version. ===================================================== == File: src/homepage/_posts/2017-05-16-james-3.0.0-rc1.markdown ===================================================== --- layout: post title: "Apache James Server 3.0-RC1" date: 2017-05-16 09:14:00 +0200 categories: james update --- James server 3.0.0-RC1 has been released. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2008-04-16-jspf-0.9.6.markdown ===================================================== --- layout: post title: "jSPF-0.9.6 released" date: 2008-04-16 16:13:22 +0200 categories: james update --- We are proud to announce the [availability][availability] release of APACHE jSPF-0.9.6. This release fix two possible NullPointerExceptions and handle the "exp=" modifier correctly. [availability]: /download.cgi ===================================================== == File: src/homepage/_posts/2025-01-29-james-3.8.2.markdown ===================================================== --- layout: post title: "Apache James Server 3.8.2" date: 2025-01-29 02:16:30 +0200 categories: james update --- The Apache James developers are pleased to announce James server 3.8.2 release. Early adopters can [download it][download], any issue can be reported on our issue [tracker][tracker]. The Apache James PMC would like to thank all contributors who made this release possible! ## Announcement This release comprise minor bug fixes enhancing Apache James stability. This release fixes the following security issues: - **CVE-2024-37358**: Denial of service through the use of IMAP literals - **CVE-2024-45626**: Denial of service through JMAP HTML to text conversion ## Release changelog The full changes included in this release can be seen in the [CHANGELOG][CHANGELOG]. [CHANGELOG]: https://github.com/apache/james-project/blob/master/CHANGELOG.md#382 [tracker]: https://issues.apache.org/jira/browse/JAMES [download]: http://james.apache.org/download.cgi#Apache_James_Server ===================================================== == File: src/homepage/_posts/2012-12-08-mailet-2.5.0.markdown ===================================================== --- layout: post title: "Apache James Mailet 2.5.0 Released" date: 2012-12-08 16:13:22 +0200 categories: james update --- Apache Mailet 2.5.0 released. This release brings all components under the same project so future releases will be made with all of them. All Mailet artifact have the same version, names that start with apache-mailet-* and are OSGi bundles. ===================================================== == File: src/homepage/_posts/2006-07-02-2.3.0on-the-way.markdown ===================================================== --- layout: post title: "James Server 2.3.0 on the way" date: 2006-07-02 16:13:22 +0200 categories: james update --- After a long time of development we have released the first [release candidate][rc] of James Server 2.3.0. After a period of user testing version 2.3.0 will be released. [rc]: http://downloads.apache.org/james/server/ ===================================================== == File: src/homepage/_config.yml ===================================================== # Welcome to Jekyll! # # This config file is meant for settings that affect your whole blog, values # which you are expected to set up once and rarely edit after that. If you find # yourself editing these this file very often, consider using Jekyll's data files # feature for the data you need to update frequently. # # For technical reasons, this file is *NOT* reloaded automatically when you use # 'jekyll serve'. If you change this file, please restart the server process. # Site settings # These are used to personalize your new site. If you look in the HTML files, # you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. # You can create any custom variable you would like, and they will be accessible # in the templates via {{ site.myvariable }}. title: James Website email: btellier@apache.org description: > # this means to ignore newlines until "baseurl:" Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description. baseurl: "" # the subpath of your site, e.g. /blog url: "http://james.apache.org" # the base hostname & protocol for your site twitter_username: ApacheJames github_username: apache # Build settings markdown: kramdown theme: minima # Plugins gems: [] ===================================================== == File: src/homepage/assets/css/font-awesome.min.css ===================================================== /*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url('../../assets/fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../../assets/fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../../assets/fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../../assets/fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../../assets/fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../../assets/fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} ===================================================== == File: src/homepage/assets/css/main.css ===================================================== @import url(font-awesome.min.css); @import "https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400"; @import url('https://fonts.googleapis.com/css?family=Poppins'); /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ /* Reset */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 12pt; font-family: "Poppins", Helvetica, sans-serif; vertical-align: baseline; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } body { -webkit-text-size-adjust: none; } ===================================================== == File: src/homepage/assets/css/lity.min.css ===================================================== /*! Lity - v2.2.2 - 2016-12-14 * http://sorgalla.com/lity/ * Copyright (c) 2015-2016 Jan Sorgalla; Licensed MIT */.lity{z-index:9990;position:fixed;top:0;right:0;bottom:0;left:0;white-space:nowrap;background:#0b0b0b;background:rgba(0,0,0,0.9);outline:none !important;opacity:0;-webkit-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease}.lity.lity-opened{opacity:1}.lity.lity-closed{opacity:0}.lity *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.lity-wrap{z-index:9990;position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;outline:none !important}.lity-wrap:before{content:'';display:inline-block;height:100%;vertical-align:middle;margin-right:-0.25em}.lity-loader{z-index:9991;color:#fff;position:absolute;top:50%;margin-top:-0.8em;width:100%;text-align:center;font-size:14px;font-family:Arial,Helvetica,sans-serif;opacity:0;-webkit-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease}.lity-loading .lity-loader{opacity:1}.lity-container{z-index:9992;position:relative;text-align:left;vertical-align:middle;display:inline-block;white-space:normal;max-width:100%;max-height:100%;outline:none !important}.lity-content{z-index:9993;width:100%;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;-o-transition:-o-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease, -webkit-transform .3s ease, -o-transform .3s ease}.lity-loading .lity-content,.lity-closed .lity-content{-webkit-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}.lity-content:after{content:'';position:absolute;left:0;top:0;bottom:0;display:block;right:0;width:auto;height:auto;z-index:-1;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.6);box-shadow:0 0 8px rgba(0,0,0,0.6)}.lity-close{z-index:9994;width:35px;height:35px;position:fixed;right:0;top:0;-webkit-appearance:none;cursor:pointer;text-decoration:none;text-align:center;padding:0;color:#fff;font-style:normal;font-size:35px;font-family:Arial,Baskerville,monospace;line-height:35px;text-shadow:0 1px 2px rgba(0,0,0,0.6);border:0;background:none;outline:none;-webkit-box-shadow:none;box-shadow:none}.lity-close::-moz-focus-inner{border:0;padding:0}.lity-close:hover,.lity-close:focus,.lity-close:active,.lity-close:visited{text-decoration:none;text-align:center;padding:0;color:#fff;font-style:normal;font-size:35px;font-family:Arial,Baskerville,monospace;line-height:35px;text-shadow:0 1px 2px rgba(0,0,0,0.6);border:0;background:none;outline:none;-webkit-box-shadow:none;box-shadow:none}.lity-close:active{top:1px}.lity-image img{max-width:100%;display:block;line-height:0;border:0}.lity-iframe .lity-container,.lity-youtube .lity-container,.lity-vimeo .lity-container,.lity-facebookvideo .lity-container,.lity-googlemaps .lity-container{width:100%;max-width:964px}.lity-iframe-container{width:100%;height:0;padding-top:56.25%;overflow:auto;pointer-events:auto;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-overflow-scrolling:touch}.lity-iframe-container iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.6);box-shadow:0 0 8px rgba(0,0,0,0.6);background:#000}.lity-hide{display:none} ===================================================== == File: src/homepage/assets/css/ie8.css ===================================================== /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ /* Type */ body { color: #ffffff; } /* Button */ .button { position: relative; border: solid 1px !important; } .button.special { border: none !important; } /* Icon */ .icon.major { -ms-behavior: url("assets/js/ie/PIE.htc"); } .icon.major:before { font-size: 4em; border: 0; } /* Spotlight */ .spotlight .image { position: relative; -ms-behavior: url("assets/js/ie/PIE.htc"); } .spotlight .image img { position: relative; -ms-behavior: url("assets/js/ie/PIE.htc"); } /* Features */ .features li { width: 29%; ===================================================== == File: src/homepage/assets/css/ie9.css ===================================================== /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ /* Spotlight */ .spotlight:after { content: ''; display: block; clear: both; } .spotlight .content { float: left; width: 60%; } .spotlight .image { float: left; } /* Features */ .features:after { content: ''; display: block; clear: both; } .features li { float: left; } /* Statistics */ .statistics { display: inline-block; } .statistics:after { content: ''; display: block; clear: both; } .statistics li { float: left; padding: 1.5em 2.5em; ===================================================== == File: src/homepage/assets/css/test.html ===================================================== <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Calque_1" x="0px" y="0px" width="841.89px" height="595.28px" viewBox="0 0 841.89 595.28" enable-background="new 0 0 841.89 595.28" xml:space="preserve"> <circle fill="#FFFFFF" cx="672.754" cy="148.406" r="66.5"/> <g> <path fill="#E64821" d="M718.72,121.022c-3.564-2.383-7.259-4.322-11.117-5.314c-3.85-1.014-7.823-0.778-11.496,0.742l-0.691,0.288 l-0.342,0.154l-0.169,0.079l-0.087,0.04l-0.042,0.02l-0.022,0.01c0.022-0.015-0.064,0.039,0.048-0.031l-0.011,0.006 c-0.5,0.313-0.969,0.572-1.462,0.83c-0.978,0.509-1.981,0.965-3.021,1.341c-2.077,0.729-4.318,1.242-6.619,0.96 c-1.14-0.15-2.273-0.547-3.228-1.208c-0.954-0.659-1.714-1.552-2.235-2.532c-1.052-1.972-1.373-4.147-1.439-6.262 c0.386,2.077,0.973,4.162,2.13,5.836c0.581,0.827,1.298,1.534,2.146,1.999c0.842,0.471,1.794,0.699,2.763,0.743 c1.946,0.094,3.931-0.496,5.777-1.31c0.931-0.407,1.84-0.872,2.715-1.393c0.433-0.256,0.877-0.537,1.262-0.808l0.763-0.498 c0.242-0.141,0.476-0.302,0.729-0.428c1.985-1.068,4.221-1.805,6.523-1.96c2.296-0.168,4.614,0.158,6.75,0.882 c2.142,0.716,4.112,1.807,5.864,3.129C715.953,117.664,717.52,119.218,718.72,121.022z"/> <g> <path fill="none" d="M637.856,139.139c-0.337,0.258,9.157,11.617,23.405,22.405c4.192,3.205,8.29,5.973,11.994,8.286 c0.281-0.416,0.542-0.842,0.787-1.279c-3.608-2.39-7.623-5.184-11.763-8.348C648.18,149.535,638.222,138.782,637.856,139.139z"/> <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="1192.2021" y1="229.4492" x2="1234.9417" y2="229.4492" gradientTransform="matrix(-0.1008 -0.9949 0.9949 -0.1008 547.1743 1381.7705)"> <stop offset="0" style="stop-color:#FCC30E"/> <stop offset="0.4969" style="stop-color:#E64821"/> <stop offset="1" style="stop-color:#E42328"/> </linearGradient> <path fill="url(#SVGID_5_)" d="M659.708,160.542c-14.247-10.789-23.741-22.147-23.405-22.406 c0.366-0.357,10.323,10.396,24.424,21.064c4.14,3.164,8.154,5.958,11.763,8.348c0.048-0.086,0.104-0.168,0.152-0.256 c0.592-1.131,1.046-2.347,1.401-3.617c-2.531-5.059-8.833-12.067-16.158-18.494c-1.629-1.413-3.325-2.666-5.04-3.792 c-0.373,3.018-1.118,5.178-1.123,5.177c0,0-0.831-2.873-0.76-6.369c-1.156-0.697-2.313-1.347-3.463-1.94 c-0.011,3.443-1.033,6.021-1.038,6.022c0,0.007-2.07-3.492-2.291-7.581c-0.003-0.026-0.003-0.052-0.003-0.076 c-6.875-3.16-12.671-4.681-12.682-4.666c-0.062-0.155,0.428,14.595,11.28,25.836c0.366-0.022,0.735-0.04,1.114-0.039 c3.946,0.008,7.317,1.426,7.323,1.425c0-0.003-2.075,1.235-5.106,1.653c1.103,0.882,2.235,1.681,3.39,2.406 c2.854-1.034,5.221-1.376,5.221-1.376c0-0.005-1.248,1.226-3.314,2.506c7.54,4.161,14.378,6.28,18.711,6.479 c0.586-0.64,1.121-1.313,1.599-2.021C667.998,166.515,663.901,163.747,659.708,160.542z"/> <path fill="#E42328" d="M710.524,120.843c-2.746,0.231-5.496,0.723-8.203,1.497c-5.401,1.538-10.711,4.256-15.061,8.381 c-2.191,2.033-4.073,4.437-5.644,7.024c-1.523,2.615-2.755,5.412-3.551,8.303c-0.82,2.884-1.311,5.83-1.479,8.755 c-0.05,0.721-0.077,1.467-0.096,2.221l-0.017,1.005l-0.024,0.862c-0.029,1.145-0.127,2.268-0.303,3.355 c-0.138,0.833-0.329,1.64-0.552,2.429c-0.354,1.27-0.809,2.486-1.4,3.618c-0.048,0.087-0.105,0.169-0.152,0.255 c-0.245,0.438-0.506,0.864-0.787,1.279c-0.479,0.708-1.013,1.381-1.6,2.021c-0.423,0.461-0.865,0.91-1.347,1.333 c-3.241,2.849-7.697,4.804-12.477,6.061c-4.796,1.275-9.926,1.944-15.132,2.303c-5.218,0.352-10.52,0.408-15.913,0.276 c5.027,2.018,10.327,3.3,15.735,4.109c5.415,0.774,10.986,1.024,16.65,0.312c2.825-0.373,5.682-0.975,8.496-1.973 c2.801-1.005,5.597-2.373,8.113-4.309c2.525-1.907,4.765-4.373,6.386-7.192c0.82-1.403,1.494-2.88,2.035-4.386 c0.519-1.511,0.908-3.049,1.171-4.583c0.269-1.535,0.419-3.065,0.479-4.578c0.019-0.379,0.017-0.755,0.021-1.132l0.002-0.989 c0.005-0.574,0.018-1.158,0.049-1.764c0.129-2.384,0.416-4.727,0.939-6.99c1.039-4.525,3.008-8.727,5.973-12.363 c2.961-3.634,6.877-6.692,11.314-9.149c4.449-2.453,9.354-4.38,14.567-5.816C716.026,120.628,713.268,120.607,710.524,120.843z"/> </g> </g> </svg> ===================================================== == File: src/homepage/assets/css/lightbox.css ===================================================== /* Preload images */ body:after { content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png) url(../images/next.png); display: none; } body.lb-disable-scrolling { overflow: hidden; } .lightboxOverlay { position: absolute; top: 0; left: 0; z-index: 9999; background-color: black; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); opacity: 0.8; display: none; } .lightbox { position: absolute; left: 0; width: 100%; z-index: 10000; text-align: center; line-height: 0; font-weight: normal; } .lightbox .lb-image { display: block; height: auto; max-width: inherit; border-radius: 3px; } .lightbox a img { border: none; } .lb-outerContainer { position: relative; background-color: white; *zoom: 1; width: 250px; height: 250px; margin: 0 auto; border-radius: 4px; ===================================================== == File: src/homepage/assets/fonts/fontawesome-webfont.svg ===================================================== <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > <svg xmlns="http://www.w3.org/2000/svg"> <metadata></metadata> <defs> <font id="fontawesomeregular" horiz-adv-x="1536" > <font-face units-per-em="1792" ascent="1536" descent="-256" /> <missing-glyph horiz-adv-x="448" /> <glyph unicode=" " horiz-adv-x="448" /> <glyph unicode="	" horiz-adv-x="448" /> <glyph unicode=" " horiz-adv-x="448" /> <glyph unicode="¨" horiz-adv-x="1792" /> <glyph unicode="©" horiz-adv-x="1792" /> <glyph unicode="®" horiz-adv-x="1792" /> <glyph unicode="´" horiz-adv-x="1792" /> <glyph unicode="Æ" horiz-adv-x="1792" /> <glyph unicode="Ø" horiz-adv-x="1792" /> <glyph unicode=" " horiz-adv-x="768" /> <glyph unicode=" " horiz-adv-x="1537" /> <glyph unicode=" " horiz-adv-x="768" /> <glyph unicode=" " horiz-adv-x="1537" /> <glyph unicode=" " horiz-adv-x="512" /> <glyph unicode=" " horiz-adv-x="384" /> <glyph unicode=" " horiz-adv-x="256" /> <glyph unicode=" " horiz-adv-x="256" /> <glyph unicode=" " horiz-adv-x="192" /> <glyph unicode=" " horiz-adv-x="307" /> <glyph unicode=" " horiz-adv-x="85" /> <glyph unicode=" " horiz-adv-x="307" /> <glyph unicode=" " horiz-adv-x="384" /> <glyph unicode="™" horiz-adv-x="1792" /> <glyph unicode="∞" horiz-adv-x="1792" /> <glyph unicode="≠" horiz-adv-x="1792" /> <glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> <glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> <glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> <glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> <glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> <glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> <glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> <glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> <glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> <glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> <glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> <glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> <glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> <glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> <glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> <glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> ===================================================== == File: src/homepage/assets/js/main.js ===================================================== /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ (function($) { skel.breakpoints({ xlarge: '(max-width: 1680px)', large: '(max-width: 1280px)', medium: '(max-width: 980px)', small: '(max-width: 736px)', xsmall: '(max-width: 480px)', xxsmall: '(max-width: 360px)' }); $(function() { var $window = $(window), $body = $('body'), $main = $('#main'); // Disable animations/transitions until the page has loaded. $body.addClass('is-loading'); $window.on('load', function() { window.setTimeout(function() { $body.removeClass('is-loading'); }, 100); }); // Fix: Placeholder polyfill. $('form').placeholder(); // Prioritize "important" elements on medium. skel.on('+medium -medium', function() { $.prioritize( '.important\\28 medium\\29', skel.breakpoint('medium').active ); }); // Nav. var $nav = $('#nav'); if ($nav.length > 0) { // Shrink effect. $main ===================================================== == File: src/homepage/assets/js/github-fetch.js ===================================================== let repositoryInfo = {}; let allContributors = []; const repositoryUrl = "https://api.github.com/repos/apache/james-project"; function getAllCollaborators(callback) { if (allContributors.length > 0) { callback(allContributors); } else { $.get(repositoryInfo.contributors_url, function(contributors) { allContributors = contributors; callback(contributors); }); } } function getListContributorDom(contributors) { let list = ""; contributors.sort(function(a, b){ if(a.login.toLowerCase() < b.login.toLowerCase()) return -1; if(a.login.toLowerCase() > b.login.toLowerCase()) return 1; return 0; }); for (contributor of contributors) { list += `<li class="contributor-card"><a href="` + contributor.html_url + `" alt="` + contributor.login + ` github account"><span class="image contributor-avatar"><img src="` + contributor.avatar_url + `"></span><span class="icon fa-github"></span>` + contributor.login + `</a></li>`; } return list; } function getTotalCommit(callback) { $.get("https://api.github.com/repos/apache/james-project/stats/commit_activity", function(data) { let total = 0; for(week of data) { total += week.total; } callback(total); }); } $(document).ready(function () { $.get(repositoryUrl, function(repository) { repositoryInfo = repository; getAllCollaborators(function(collabs) { $('#contributor-num').append(collabs.length); let contributors = getListContributorDom(collabs); $('#contributor-list').append(contributors); }); getTotalCommit(function(commits) { $('#commit-num').append(commits); }); $('#fork-num').append(repositoryInfo.forks_count); ===================================================== == File: src/homepage/assets/js/jquery.min.js ===================================================== /*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){ return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m}); ===================================================== == File: src/homepage/assets/js/lightbox.js ===================================================== /*! * Lightbox v2.8.2 * by Lokesh Dhakar * * More info: * http://lokeshdhakar.com/projects/lightbox2/ * * Copyright 2007, 2015 Lokesh Dhakar * Released under the MIT license * https://github.com/lokesh/lightbox2/blob/master/LICENSE */ // Uses Node, AMD or browser globals to create a module. (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(require('jquery')); } else { // Browser globals (root is window) root.lightbox = factory(root.jQuery); } }(this, function ($) { function Lightbox(options) { this.album = []; this.currentImageIndex = void 0; this.init(); // options this.options = $.extend({}, this.constructor.defaults); this.option(options); } // Descriptions of all options available on the demo site: // http://lokeshdhakar.com/projects/lightbox2/index.html#options Lightbox.defaults = { albumLabel: 'Image %1 of %2', alwaysShowNavOnTouchDevices: false, fadeDuration: 500, fitImagesInViewport: true, // maxWidth: 800, // maxHeight: 600, positionFromTop: 50, resizeDuration: 700, showImageNumberLabel: true, ===================================================== == File: src/homepage/assets/js/ie/PIE.htc ===================================================== <!-- PIE: CSS3 rendering for IE Version 1.0.0 http://css3pie.com Dual-licensed for use under the Apache License Version 2.0 or the General Public License (GPL) Version 2. --> <PUBLIC:COMPONENT lightWeight="true"> <!-- saved from url=(0014)about:internet --> <PUBLIC:ATTACH EVENT="oncontentready" FOR="element" ONEVENT="init()" /> <PUBLIC:ATTACH EVENT="ondocumentready" FOR="element" ONEVENT="init()" /> <PUBLIC:ATTACH EVENT="ondetach" FOR="element" ONEVENT="cleanup()" /> <script type="text/javascript"> var doc = element.document;var f=window.PIE; if(!f){f=window.PIE={F:"-pie-",nb:"Pie",La:"pie_",Ac:{TD:1,TH:1},cc:{TABLE:1,THEAD:1,TBODY:1,TFOOT:1,TR:1,INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,IMG:1,HR:1},fc:{A:1,INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1},Gd:{submit:1,button:1,reset:1},aa:function(){}};try{doc.execCommand("BackgroundImageCache",false,true)}catch(aa){}for(var ba=4,Z=doc.createElement("div"),ca=Z.getElementsByTagName("i"),ga;Z.innerHTML="<!--[if gt IE "+ ++ba+"]><i></i><![endif]--\>",ca[0];);f.O=ba;if(ba===6)f.F=f.F.replace(/^-/,"");f.ja= doc.documentMode||f.O;Z.innerHTML='<v:shape adj="1"/>';ga=Z.firstChild;ga.style.behavior="url(#default#VML)";f.zc=typeof ga.adj==="object";(function(){var a,b=0,c={};f.p={Za:function(d){if(!a){a=doc.createDocumentFragment();a.namespaces.add("css3vml","urn:schemas-microsoft-com:vml")}return a.createElement("css3vml:"+d)},Ba:function(d){return d&&d._pieId||(d._pieId="_"+ ++b)},Eb:function(d){var e,g,j,i,h=arguments;e=1;for(g=h.length;e<g;e++){i=h[e];for(j in i)if(i.hasOwnProperty(j))d[j]=i[j]}return d}, Rb:function(d,e,g){var j=c[d],i,h;if(j)Object.prototype.toString.call(j)==="[object Array]"?j.push([e,g]):e.call(g,j);else{h=c[d]=[[e,g]];i=new Image;i.onload=function(){j=c[d]={h:i.width,f:i.height};for(var k=0,n=h.length;k<n;k++)h[k][0].call(h[k][1],j);i.onload=null};i.src=d}}}})();f.Na={gc:function(a,b,c,d){function e(){k=j>=90&&j<270?b:0;n=j<180?c:0;m=b-k;p=c-n}function g(){for(;j<0;)j+=360;j%=360}var j=d.sa;d=d.zb;var i,h,k,n,m,p,r,t;if(d){d=d.coords(a,b,c);i=d.x;h=d.y}if(j){j=j.jd();g();e(); if(!d){i=k;h=n}d=f.Na.tc(i,h,j,m,p);a=d[0];d=d[1]}else if(d){a=b-i;d=c-h}else{i=h=a=0;d=c}r=a-i;t=d-h;if(j===void 0){j=!r?t<0?90:270:!t?r<0?180:0:-Math.atan2(t,r)/Math.PI*180;g();e()}return{sa:j,xc:i,yc:h,td:a,ud:d,Wd:k,Xd:n,rd:m,sd:p,kd:r,ld:t,rc:f.Na.dc(i,h,a,d)}},tc:function(a,b,c,d,e){if(c===0||c===180)return[d,b];else if(c===90||c===270)return[a,e];else{c=Math.tan(-c*Math.PI/180);a=c*a-b;b=-1/c;d=b*d-e;e=b-c;return[(d-a)/e,(c*d-b*a)/e]}},dc:function(a,b,c,d){a=c-a;b=d-b;return Math.abs(a===0? b:b===0?a:Math.sqrt(a*a+b*b))}};f.ea=function(){this.Gb=[];this.oc={}};f.ea.prototype={ba:function(a){var b=f.p.Ba(a),c=this.oc,d=this.Gb;if(!(b in c)){c[b]=d.length;d.push(a)}},Ha:function(a){a=f.p.Ba(a);var b=this.oc;if(a&&a in b){delete this.Gb[b[a]];delete b[a]}},xa:function(){for(var a=this.Gb,b=a.length;b--;)a[b]&&a[b]()}};f.Oa=new f.ea;f.Oa.Rd=function(){var a=this,b;if(!a.Sd){b=doc.documentElement.currentStyle.getAttribute(f.F+"poll-interval")||250;(function c(){a.xa();setTimeout(c,b)})(); a.Sd=1}};(function(){function a(){f.L.xa();window.detachEvent("onunload",a);window.PIE=null}f.L=new f.ea;window.attachEvent("onunload",a);f.L.ta=function(b,c,d){b.attachEvent(c,d);this.ba(function(){b.detachEvent(c,d)})}})();f.Qa=new f.ea;f.L.ta(window,"onresize",function(){f.Qa.xa()});(function(){function a(){f.mb.xa()}f.mb=new f.ea;f.L.ta(window,"onscroll",a);f.Qa.ba(a)})();(function(){function a(){c=f.kb.md()}function b(){if(c){for(var d=0,e=c.length;d<e;d++)f.attach(c[d]);c=0}}var c;if(f.ja<9){f.L.ta(window, "onbeforeprint",a);f.L.ta(window,"onafterprint",b)}})();f.lb=new f.ea;f.L.ta(doc,"onmouseup",function(){f.lb.xa()});f.he=function(){function a(h){this.Y=h}var b=doc.createElement("length-calc"),c=doc.body||doc.documentElement,d=b.style,e={},g=["mm","cm","in","pt","pc"],j=g.length,i={};d.position="absolute";d.top=d.left="-9999px";for(c.appendChild(b);j--;){d.width="100"+g[j];e[g[j]]=b.offsetWidth/100}c.removeChild(b);d.width="1em";a.prototype={Kb:/(px|em|ex|mm|cm|in|pt|pc|%)$/,ic:function(){var h= this.Jd;if(h===void 0)h=this.Jd=parseFloat(this.Y);return h},yb:function(){var h=this.ae;if(!h)h=this.ae=(h=this.Y.match(this.Kb))&&h[0]||"px";return h},a:function(h,k){var n=this.ic(),m=this.yb();switch(m){case "px":return n;case "%":return n*(typeof k==="function"?k():k)/100;case "em":return n*this.xb(h);case "ex":return n*this.xb(h)/2;default:return n*e[m]}},xb:function(h){var k=h.currentStyle.fontSize,n,m;if(k.indexOf("px")>0)return parseFloat(k);else if(h.tagName in f.cc){m=this;n=h.parentNode; return f.n(k).a(n,function(){return m.xb(n)})}else{h.appendChild(b);k=b.offsetWidth;b.parentNode===h&&h.removeChild(b);return k}}};f.n=function(h){return i[h]||(i[h]=new a(h))};return a}();f.Ja=function(){function a(e){this.X=e}var b=f.n("50%"),c={top:1,center:1,bottom:1},d={left:1,center:1,right:1};a.prototype={zd:function(){if(!this.ac){var e=this.X,g=e.length,j=f.v,i=j.qa,h=f.n("0");i=i.na;h=["left",h,"top",h];if(g===1){e.push(new j.ob(i,"center"));g++}if(g===2){i&(e[0].k|e[1].k)&&e[0].d in c&& e[1].d in d&&e.push(e.shift());if(e[0].k&i)if(e[0].d==="center")h[1]=b;else h[0]=e[0].d;else if(e[0].W())h[1]=f.n(e[0].d);if(e[1].k&i)if(e[1].d==="center")h[3]=b;else h[2]=e[1].d;else if(e[1].W())h[3]=f.n(e[1].d)}this.ac=h}return this.ac},coords:function(e,g,j){var i=this.zd(),h=i[1].a(e,g);e=i[3].a(e,j);return{x:i[0]==="right"?g-h:h,y:i[2]==="bottom"?j-e:e}}};return a}();f.Ka=function(){function a(b,c){this.h=b;this.f=c}a.prototype={a:function(b,c,d,e,g){var j=this.h,i=this.f,h=c/d;e=e/g;if(j=== "contain"){j=e>h?c:d*e;i=e>h?c/e:d}else if(j==="cover"){j=e<h?c:d*e;i=e<h?c/e:d}else if(j==="auto"){i=i==="auto"?g:i.a(b,d);j=i*e}else{j=j.a(b,c);i=i==="auto"?j/e:i.a(b,d)}return{h:j,f:i}}};a.Kc=new a("auto","auto");return a}();f.Ec=function(){function a(b){this.Y=b}a.prototype={Kb:/[a-z]+$/i,yb:function(){return this.ad||(this.ad=this.Y.match(this.Kb)[0].toLowerCase())},jd:function(){var b=this.Vc,c;if(b===undefined){b=this.yb();c=parseFloat(this.Y,10);b=this.Vc=b==="deg"?c:b==="rad"?c/Math.PI*180: b==="grad"?c/400*360:b==="turn"?c*360:0}return b}};return a}();f.Jc=function(){function a(c){this.Y=c}var b={};a.Qd=/\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d+|\d*\.\d+)\s*\)\s*/;a.Fb={aliceblue:"F0F8FF",antiquewhite:"FAEBD7",aqua:"0FF",aquamarine:"7FFFD4",azure:"F0FFFF",beige:"F5F5DC",bisque:"FFE4C4",black:"000",blanchedalmond:"FFEBCD",blue:"00F",blueviolet:"8A2BE2",brown:"A52A2A",burlywood:"DEB887",cadetblue:"5F9EA0",chartreuse:"7FFF00",chocolate:"D2691E",coral:"FF7F50",cornflowerblue:"6495ED", cornsilk:"FFF8DC",crimson:"DC143C",cyan:"0FF",darkblue:"00008B",darkcyan:"008B8B",darkgoldenrod:"B8860B",darkgray:"A9A9A9",darkgreen:"006400",darkkhaki:"BDB76B",darkmagenta:"8B008B",darkolivegreen:"556B2F",darkorange:"FF8C00",darkorchid:"9932CC",darkred:"8B0000",darksalmon:"E9967A",darkseagreen:"8FBC8F",darkslateblue:"483D8B",darkslategray:"2F4F4F",darkturquoise:"00CED1",darkviolet:"9400D3",deeppink:"FF1493",deepskyblue:"00BFFF",dimgray:"696969",dodgerblue:"1E90FF",firebrick:"B22222",floralwhite:"FFFAF0", forestgreen:"228B22",fuchsia:"F0F",gainsboro:"DCDCDC",ghostwhite:"F8F8FF",gold:"FFD700",goldenrod:"DAA520",gray:"808080",green:"008000",greenyellow:"ADFF2F",honeydew:"F0FFF0",hotpink:"FF69B4",indianred:"CD5C5C",indigo:"4B0082",ivory:"FFFFF0",khaki:"F0E68C",lavender:"E6E6FA",lavenderblush:"FFF0F5",lawngreen:"7CFC00",lemonchiffon:"FFFACD",lightblue:"ADD8E6",lightcoral:"F08080",lightcyan:"E0FFFF",lightgoldenrodyellow:"FAFAD2",lightgreen:"90EE90",lightgrey:"D3D3D3",lightpink:"FFB6C1",lightsalmon:"FFA07A", lightseagreen:"20B2AA",lightskyblue:"87CEFA",lightslategray:"789",lightsteelblue:"B0C4DE",lightyellow:"FFFFE0",lime:"0F0",limegreen:"32CD32",linen:"FAF0E6",magenta:"F0F",maroon:"800000",mediumauqamarine:"66CDAA",mediumblue:"0000CD",mediumorchid:"BA55D3",mediumpurple:"9370D8",mediumseagreen:"3CB371",mediumslateblue:"7B68EE",mediumspringgreen:"00FA9A",mediumturquoise:"48D1CC",mediumvioletred:"C71585",midnightblue:"191970",mintcream:"F5FFFA",mistyrose:"FFE4E1",moccasin:"FFE4B5",navajowhite:"FFDEAD", navy:"000080",oldlace:"FDF5E6",olive:"808000",olivedrab:"688E23",orange:"FFA500",orangered:"FF4500",orchid:"DA70D6",palegoldenrod:"EEE8AA",palegreen:"98FB98",paleturquoise:"AFEEEE",palevioletred:"D87093",papayawhip:"FFEFD5",peachpuff:"FFDAB9",peru:"CD853F",pink:"FFC0CB",plum:"DDA0DD",powderblue:"B0E0E6",purple:"800080",red:"F00",rosybrown:"BC8F8F",royalblue:"4169E1",saddlebrown:"8B4513",salmon:"FA8072",sandybrown:"F4A460",seagreen:"2E8B57",seashell:"FFF5EE",sienna:"A0522D",silver:"C0C0C0",skyblue:"87CEEB", slateblue:"6A5ACD",slategray:"708090",snow:"FFFAFA",springgreen:"00FF7F",steelblue:"4682B4",tan:"D2B48C",teal:"008080",thistle:"D8BFD8",tomato:"FF6347",turquoise:"40E0D0",violet:"EE82EE",wheat:"F5DEB3",white:"FFF",whitesmoke:"F5F5F5",yellow:"FF0",yellowgreen:"9ACD32"};a.prototype={parse:function(){if(!this.Ua){var c=this.Y,d;if(d=c.match(a.Qd)){this.Ua="rgb("+d[1]+","+d[2]+","+d[3]+")";this.Yb=parseFloat(d[4])}else{if((d=c.toLowerCase())in a.Fb)c="#"+a.Fb[d];this.Ua=c;this.Yb=c==="transparent"?0: 1}}},U:function(c){this.parse();return this.Ua==="currentColor"?c.currentStyle.color:this.Ua},fa:function(){this.parse();return this.Yb}};f.ha=function(c){return b[c]||(b[c]=new a(c))};return a}();f.v=function(){function a(c){this.$a=c;this.ch=0;this.X=[];this.Ga=0}var b=a.qa={Ia:1,Wb:2,z:4,Lc:8,Xb:16,na:32,K:64,oa:128,pa:256,Ra:512,Tc:1024,URL:2048};a.ob=function(c,d){this.k=c;this.d=d};a.ob.prototype={Ca:function(){return this.k&b.K||this.k&b.oa&&this.d==="0"},W:function(){return this.Ca()||this.k& b.Ra}};a.prototype={de:/\s/,Kd:/^[\+\-]?(\d*\.)?\d+/,url:/^url\(\s*("([^"]*)"|'([^']*)'|([!#$%&*-~]*))\s*\)/i,nc:/^\-?[_a-z][\w-]*/i,Yd:/^("([^"]*)"|'([^']*)')/,Bd:/^#([\da-f]{6}|[\da-f]{3})/i,be:{px:b.K,em:b.K,ex:b.K,mm:b.K,cm:b.K,"in":b.K,pt:b.K,pc:b.K,deg:b.Ia,rad:b.Ia,grad:b.Ia},fd:{rgb:1,rgba:1,hsl:1,hsla:1},next:function(c){function d(p,r){p=new a.ob(p,r);if(!c){k.X.push(p);k.Ga++}return p}function e(){k.Ga++;return null}var g,j,i,h,k=this;if(this.Ga<this.X.length)return this.X[this.Ga++];for(;this.de.test(this.$a.charAt(this.ch));)this.ch++; if(this.ch>=this.$a.length)return e();j=this.ch;g=this.$a.substring(this.ch);i=g.charAt(0);switch(i){case "#":if(h=g.match(this.Bd)){this.ch+=h[0].length;return d(b.z,h[0])}break;case '"':case "'":if(h=g.match(this.Yd)){this.ch+=h[0].length;return d(b.Tc,h[2]||h[3]||"")}break;case "/":case ",":this.ch++;return d(b.pa,i);case "u":if(h=g.match(this.url)){this.ch+=h[0].length;return d(b.URL,h[2]||h[3]||h[4]||"")}}if(h=g.match(this.Kd)){i=h[0];this.ch+=i.length;if(g.charAt(i.length)==="%"){this.ch++; return d(b.Ra,i+"%")}if(h=g.substring(i.length).match(this.nc)){i+=h[0];this.ch+=h[0].length;return d(this.be[h[0].toLowerCase()]||b.Lc,i)}return d(b.oa,i)}if(h=g.match(this.nc)){i=h[0];this.ch+=i.length;if(i.toLowerCase()in f.Jc.Fb||i==="currentColor"||i==="transparent")return d(b.z,i);if(g.charAt(i.length)==="("){this.ch++;if(i.toLowerCase()in this.fd){g=function(p){return p&&p.k&b.oa};h=function(p){return p&&p.k&(b.oa|b.Ra)};var n=function(p,r){return p&&p.d===r},m=function(){return k.next(1)}; if((i.charAt(0)==="r"?h(m()):g(m()))&&n(m(),",")&&h(m())&&n(m(),",")&&h(m())&&(i==="rgb"||i==="hsa"||n(m(),",")&&g(m()))&&n(m(),")"))return d(b.z,this.$a.substring(j,this.ch));return e()}return d(b.Xb,i)}return d(b.na,i)}this.ch++;return d(b.Wb,i)},D:function(){return this.X[this.Ga-- -2]},all:function(){for(;this.next(););return this.X},ma:function(c,d){for(var e=[],g,j;g=this.next();){if(c(g)){j=true;this.D();break}e.push(g)}return d&&!j?null:e}};return a}();var ha=function(a){this.e=a};ha.prototype= {Z:0,Od:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.x!==b.x||a.y!==b.y)},Td:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.h!==b.h||a.f!==b.f)},hc:function(){var a=this.e,b=a.getBoundingClientRect(),c=f.ja===9,d=f.O===7,e=b.right-b.left;return{x:b.left,y:b.top,h:c||d?a.offsetWidth:e,f:c||d?a.offsetHeight:b.bottom-b.top,Hd:d&&e?a.offsetWidth/e:1}},o:function(){return this.Z?this.Va||(this.Va=this.hc()):this.hc()},Ad:function(){return!!this.qb},cb:function(){++this.Z},hb:function(){if(!--this.Z){if(this.Va)this.qb= this.Va;this.Va=null}}};(function(){function a(b){var c=f.p.Ba(b);return function(){if(this.Z){var d=this.$b||(this.$b={});return c in d?d[c]:(d[c]=b.call(this))}else return b.call(this)}}f.B={Z:0,ka:function(b){function c(d){this.e=d;this.Zb=this.ia()}f.p.Eb(c.prototype,f.B,b);c.$c={};return c},j:function(){var b=this.ia(),c=this.constructor.$c;return b?b in c?c[b]:(c[b]=this.la(b)):null},ia:a(function(){var b=this.e,c=this.constructor,d=b.style;b=b.currentStyle;var e=this.wa,g=this.Fa,j=c.Yc||(c.Yc= f.F+e);c=c.Zc||(c.Zc=f.nb+g.charAt(0).toUpperCase()+g.substring(1));return d[c]||b.getAttribute(j)||d[g]||b.getAttribute(e)}),i:a(function(){return!!this.j()}),H:a(function(){var b=this.ia(),c=b!==this.Zb;this.Zb=b;return c}),va:a,cb:function(){++this.Z},hb:function(){--this.Z||delete this.$b}}})();f.Sb=f.B.ka({wa:f.F+"background",Fa:f.nb+"Background",cd:{scroll:1,fixed:1,local:1},fb:{"repeat-x":1,"repeat-y":1,repeat:1,"no-repeat":1},sc:{"padding-box":1,"border-box":1,"content-box":1},Pd:{top:1,right:1, bottom:1,left:1,center:1},Ud:{contain:1,cover:1},eb:{Ma:"backgroundClip",z:"backgroundColor",da:"backgroundImage",Pa:"backgroundOrigin",S:"backgroundPosition",T:"backgroundRepeat",Sa:"backgroundSize"},la:function(a){function b(s){return s&&s.W()||s.k&k&&s.d in t}function c(s){return s&&(s.W()&&f.n(s.d)||s.d==="auto"&&"auto")}var d=this.e.currentStyle,e,g,j,i=f.v.qa,h=i.pa,k=i.na,n=i.z,m,p,r=0,t=this.Pd,v,l,q={M:[]};if(this.wb()){e=new f.v(a);for(j={};g=e.next();){m=g.k;p=g.d;if(!j.P&&m&i.Xb&&p=== "linear-gradient"){v={ca:[],P:p};for(l={};g=e.next();){m=g.k;p=g.d;if(m&i.Wb&&p===")"){l.color&&v.ca.push(l);v.ca.length>1&&f.p.Eb(j,v);break}if(m&n){if(v.sa||v.zb){g=e.D();if(g.k!==h)break;e.next()}l={color:f.ha(p)};g=e.next();if(g.W())l.db=f.n(g.d);else e.D()}else if(m&i.Ia&&!v.sa&&!l.color&&!v.ca.length)v.sa=new f.Ec(g.d);else if(b(g)&&!v.zb&&!l.color&&!v.ca.length){e.D();v.zb=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&h&&p===","){if(l.color){v.ca.push(l);l={}}}else break}}else if(!j.P&& m&i.URL){j.Ab=p;j.P="image"}else if(b(g)&&!j.$){e.D();j.$=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&k)if(p in this.fb&&!j.bb)j.bb=p;else if(p in this.sc&&!j.Wa){j.Wa=p;if((g=e.next())&&g.k&k&&g.d in this.sc)j.ub=g.d;else{j.ub=p;e.D()}}else if(p in this.cd&&!j.bc)j.bc=p;else return null;else if(m&n&&!q.color)q.color=f.ha(p);else if(m&h&&p==="/"&&!j.Xa&&j.$){g=e.next();if(g.k&k&&g.d in this.Ud)j.Xa=new f.Ka(g.d);else if(g=c(g)){m=c(e.next());if(!m){m=g;e.D()}j.Xa=new f.Ka(g,m)}else return null}else if(m& h&&p===","&&j.P){j.Hb=a.substring(r,e.ch-1);r=e.ch;q.M.push(j);j={}}else return null}if(j.P){j.Hb=a.substring(r);q.M.push(j)}}else this.Bc(f.ja<9?function(){var s=this.eb,o=d[s.S+"X"],u=d[s.S+"Y"],x=d[s.da],y=d[s.z];if(y!=="transparent")q.color=f.ha(y);if(x!=="none")q.M=[{P:"image",Ab:(new f.v(x)).next().d,bb:d[s.T],$:new f.Ja((new f.v(o+" "+u)).all())}]}:function(){var s=this.eb,o=/\s*,\s*/,u=d[s.da].split(o),x=d[s.z],y,z,B,E,D,C;if(x!=="transparent")q.color=f.ha(x);if((E=u.length)&&u[0]!=="none"){x= d[s.T].split(o);y=d[s.S].split(o);z=d[s.Pa].split(o);B=d[s.Ma].split(o);s=d[s.Sa].split(o);q.M=[];for(o=0;o<E;o++)if((D=u[o])&&D!=="none"){C=s[o].split(" ");q.M.push({Hb:D+" "+x[o]+" "+y[o]+" / "+s[o]+" "+z[o]+" "+B[o],P:"image",Ab:(new f.v(D)).next().d,bb:x[o],$:new f.Ja((new f.v(y[o])).all()),Wa:z[o],ub:B[o],Xa:new f.Ka(C[0],C[1])})}}});return q.color||q.M[0]?q:null},Bc:function(a){var b=f.ja>8,c=this.eb,d=this.e.runtimeStyle,e=d[c.da],g=d[c.z],j=d[c.T],i,h,k,n;if(e)d[c.da]="";if(g)d[c.z]="";if(j)d[c.T]= "";if(b){i=d[c.Ma];h=d[c.Pa];n=d[c.S];k=d[c.Sa];if(i)d[c.Ma]="";if(h)d[c.Pa]="";if(n)d[c.S]="";if(k)d[c.Sa]=""}a=a.call(this);if(e)d[c.da]=e;if(g)d[c.z]=g;if(j)d[c.T]=j;if(b){if(i)d[c.Ma]=i;if(h)d[c.Pa]=h;if(n)d[c.S]=n;if(k)d[c.Sa]=k}return a},ia:f.B.va(function(){return this.wb()||this.Bc(function(){var a=this.e.currentStyle,b=this.eb;return a[b.z]+" "+a[b.da]+" "+a[b.T]+" "+a[b.S+"X"]+" "+a[b.S+"Y"]})}),wb:f.B.va(function(){var a=this.e;return a.style[this.Fa]||a.currentStyle.getAttribute(this.wa)}), qc:function(){var a=0;if(f.O<7){a=this.e;a=""+(a.style[f.nb+"PngFix"]||a.currentStyle.getAttribute(f.F+"png-fix"))==="true"}return a},i:f.B.va(function(){return(this.wb()||this.qc())&&!!this.j()})});f.Vb=f.B.ka({wc:["Top","Right","Bottom","Left"],Id:{thin:"1px",medium:"3px",thick:"5px"},la:function(){var a={},b={},c={},d=false,e=true,g=true,j=true;this.Cc(function(){for(var i=this.e.currentStyle,h=0,k,n,m,p,r,t,v;h<4;h++){m=this.wc[h];v=m.charAt(0).toLowerCase();k=b[v]=i["border"+m+"Style"];n=i["border"+ m+"Color"];m=i["border"+m+"Width"];if(h>0){if(k!==p)g=false;if(n!==r)e=false;if(m!==t)j=false}p=k;r=n;t=m;c[v]=f.ha(n);m=a[v]=f.n(b[v]==="none"?"0":this.Id[m]||m);if(m.a(this.e)>0)d=true}});return d?{J:a,Zd:b,gd:c,ee:j,hd:e,$d:g}:null},ia:f.B.va(function(){var a=this.e,b=a.currentStyle,c;a.tagName in f.Ac&&a.offsetParent.currentStyle.borderCollapse==="collapse"||this.Cc(function(){c=b.borderWidth+"|"+b.borderStyle+"|"+b.borderColor});return c}),Cc:function(a){var b=this.e.runtimeStyle,c=b.borderWidth, d=b.borderColor;if(c)b.borderWidth="";if(d)b.borderColor="";a=a.call(this);if(c)b.borderWidth=c;if(d)b.borderColor=d;return a}});(function(){f.jb=f.B.ka({wa:"border-radius",Fa:"borderRadius",la:function(b){var c=null,d,e,g,j,i=false;if(b){e=new f.v(b);var h=function(){for(var k=[],n;(g=e.next())&&g.W();){j=f.n(g.d);n=j.ic();if(n<0)return null;if(n>0)i=true;k.push(j)}return k.length>0&&k.length<5?{tl:k[0],tr:k[1]||k[0],br:k[2]||k[0],bl:k[3]||k[1]||k[0]}:null};if(b=h()){if(g){if(g.k&f.v.qa.pa&&g.d=== "/")d=h()}else d=b;if(i&&b&&d)c={x:b,y:d}}}return c}});var a=f.n("0");a={tl:a,tr:a,br:a,bl:a};f.jb.Dc={x:a,y:a}})();f.Ub=f.B.ka({wa:"border-image",Fa:"borderImage",fb:{stretch:1,round:1,repeat:1,space:1},la:function(a){var b=null,c,d,e,g,j,i,h=0,k=f.v.qa,n=k.na,m=k.oa,p=k.Ra;if(a){c=new f.v(a);b={};for(var r=function(l){return l&&l.k&k.pa&&l.d==="/"},t=function(l){return l&&l.k&n&&l.d==="fill"},v=function(){g=c.ma(function(l){return!(l.k&(m|p))});if(t(c.next())&&!b.fill)b.fill=true;else c.D();if(r(c.next())){h++; j=c.ma(function(l){return!l.W()&&!(l.k&n&&l.d==="auto")});if(r(c.next())){h++;i=c.ma(function(l){return!l.Ca()})}}else c.D()};a=c.next();){d=a.k;e=a.d;if(d&(m|p)&&!g){c.D();v()}else if(t(a)&&!b.fill){b.fill=true;v()}else if(d&n&&this.fb[e]&&!b.repeat){b.repeat={f:e};if(a=c.next())if(a.k&n&&this.fb[a.d])b.repeat.Ob=a.d;else c.D()}else if(d&k.URL&&!b.src)b.src=e;else return null}if(!b.src||!g||g.length<1||g.length>4||j&&j.length>4||h===1&&j.length<1||i&&i.length>4||h===2&&i.length<1)return null;if(!b.repeat)b.repeat= ===================================================== == File: src/homepage/assets/js/ie/respond.min.js ===================================================== /*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2014 Scott Jehl * Licensed under MIT * http://j.mp/respondjs */ !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this); ===================================================== == File: src/homepage/assets/js/ie/html5shiv.js ===================================================== /* HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */ (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}</style>"; c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document); ===================================================== == File: src/homepage/assets/js/jquery.scrolly.min.js ===================================================== /* jquery.scrolly v1.0.0-dev | (c) @ajlkn | MIT licensed */ (function(e){function u(s,o){var u,a,f;if((u=e(s))[t]==0)return n;a=u[i]()[r];switch(o.anchor){case"middle":f=a-(e(window).height()-u.outerHeight())/2;break;default:case r:f=Math.max(a,0)}return typeof o[i]=="function"?f-=o[i]():f-=o[i],f}var t="length",n=null,r="top",i="offset",s="click.scrolly",o=e(window);e.fn.scrolly=function(i){var o,a,f,l,c=e(this);if(this[t]==0)return c;if(this[t]>1){for(o=0;o<this[t];o++)e(this[o]).scrolly(i);return c}l=n,f=c.attr("href");if(f.charAt(0)!="#"||f[t]<2)return c;a=jQuery.extend({anchor:r,easing:"swing",offset:0,parent:e("body,html"),pollOnce:!1,speed:1e3},i),a.pollOnce&&(l=u(f,a)),c.off(s).on(s,function(e){var t=l!==n?l:u(f,a);t!==n&&(e.preventDefault(),a.parent.stop().animate({scrollTop:t},a.speed,a.easing))})}})(jQuery); ===================================================== == File: src/homepage/assets/js/skel.min.js ===================================================== /* skel.js v3.0.1 | (c) skel.io | MIT licensed */ var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),Array.prototype.indexOf?t.indexOf=function(t,e){return t.indexOf(e)}:t.indexOf=function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},Array.isArray?t.isArray=function(t){return Array.isArray(t)}:t.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},Object.keys?t.iterate=function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:t.iterate=function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},window.matchMedia?t.matchesMedia=function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?t.matchesMedia=function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?t.matchesMedia=function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:t.matchesMedia=function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;for(i=t.split(/\s+and\s+/),e=0;e<i.length;e++)n=i[e],"("==n.charAt(0)&&(n=n.substring(1,n.length-1),a=n.split(/:\s+/),2==a.length&&(r[a[0].replace(/^\s+|\s+$/g,"")]=parseInt(a[1]),o=!0));if(!o)return!1;var s=document.documentElement.clientWidth,c=document.documentElement.clientHeight;return null!==r["min-width"]&&s<r["min-width"]||null!==r["max-width"]&&s>r["max-width"]||null!==r["min-height"]&&c<r["min-height"]||null!==r["max-height"]&&c>r["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML=' <style type="text/css">'+t+"</style>",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel}); ===================================================== == File: src/homepage/assets/js/lity.min.js ===================================================== /*! Lity - v2.2.2 - 2016-12-14 * http://sorgalla.com/lity/ * Copyright (c) 2015-2016 Jan Sorgalla; Licensed MIT */ !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=b(a,require("jquery")):a.lity=b(a,a.jQuery||a.Zepto)}("undefined"!=typeof window?window:this,function(a,b){"use strict";function c(a){var b=B();return N&&a.length?(a.one(N,b.resolve),setTimeout(b.resolve,500)):b.resolve(),b.promise()}function d(a,c,d){if(1===arguments.length)return b.extend({},a);if("string"==typeof c){if("undefined"==typeof d)return"undefined"==typeof a[c]?null:a[c];a[c]=d}else b.extend(a,c);return this}function e(a){for(var b,c=decodeURI(a.split("#")[0]).split("&"),d={},e=0,f=c.length;e<f;e++)c[e]&&(b=c[e].split("="),d[b[0]]=b[1]);return d}function f(a,c){return a+(a.indexOf("?")>-1?"&":"?")+b.param(c)}function g(a,b){var c=a.indexOf("#");return-1===c?b:(c>0&&(a=a.substr(c)),b+a)}function h(a){return b('<span class="lity-error"/>').append(a)}function i(a,c){var d=c.opener()&&c.opener().data("lity-desc")||"Image with no description",e=b('<img src="'+a+'" alt="'+d+'"/>'),f=B(),g=function(){f.reject(h("Failed loading image"))};return e.on("load",function(){return 0===this.naturalWidth?g():void f.resolve(e)}).on("error",g),f.promise()}function j(a,c){var d,e,f;try{d=b(a)}catch(a){return!1}return!!d.length&&(e=b('<i style="display:none !important"/>'),f=d.hasClass("lity-hide"),c.element().one("lity:remove",function(){e.before(d).remove(),f&&!d.closest(".lity-content").length&&d.addClass("lity-hide")}),d.removeClass("lity-hide").after(e))}function k(a){var c=J.exec(a);return!!c&&o(g(a,f("https://www.youtube"+(c[2]||"")+".com/embed/"+c[4],b.extend({autoplay:1},e(c[5]||"")))))}function l(a){var c=K.exec(a);return!!c&&o(g(a,f("https://player.vimeo.com/video/"+c[3],b.extend({autoplay:1},e(c[4]||"")))))}function m(a){var c=M.exec(a);return!!c&&(0!==a.indexOf("http")&&(a="https:"+a),o(g(a,f("https://www.facebook.com/plugins/video.php?href="+a,b.extend({autoplay:1},e(c[4]||""))))))}function n(a){var b=L.exec(a);return!!b&&o(g(a,f("https://www.google."+b[3]+"/maps?"+b[6],{output:b[6].indexOf("layer=c")>0?"svembed":"embed"})))}function o(a){return'<div class="lity-iframe-container"><iframe frameborder="0" allowfullscreen src="'+a+'"/></div>'}function p(){return z.documentElement.clientHeight?z.documentElement.clientHeight:Math.round(A.height())}function q(a){var b=v();b&&(27===a.keyCode&&b.close(),9===a.keyCode&&r(a,b))}function r(a,b){var c=b.element().find(G),d=c.index(z.activeElement);a.shiftKey&&d<=0?(c.get(c.length-1).focus(),a.preventDefault()):a.shiftKey||d!==c.length-1||(c.get(0).focus(),a.preventDefault())}function s(){b.each(D,function(a,b){b.resize()})}function t(a){1===D.unshift(a)&&(C.addClass("lity-active"),A.on({resize:s,keydown:q})),b("body > *").not(a.element()).addClass("lity-hidden").each(function(){var a=b(this);void 0===a.data(F)&&a.data(F,a.attr(E)||null)}).attr(E,"true")}function u(a){var c;a.element().attr(E,"true"),1===D.length&&(C.removeClass("lity-active"),A.off({resize:s,keydown:q})),D=b.grep(D,function(b){return a!==b}),c=D.length?D[0].element():b(".lity-hidden"),c.removeClass("lity-hidden").each(function(){var a=b(this),c=a.data(F);c?a.attr(E,c):a.removeAttr(E),a.removeData(F)})}function v(){return 0===D.length?null:D[0]}function w(a,c,d,e){var f,g="inline",h=b.extend({},d);return e&&h[e]?(f=h[e](a,c),g=e):(b.each(["inline","iframe"],function(a,b){delete h[b],h[b]=d[b]}),b.each(h,function(b,d){return!d||(!(!d.test||d.test(a,c))||(f=d(a,c),!1!==f?(g=b,!1):void 0))})),{handler:g,content:f||""}}function x(a,e,f,g){function h(a){k=b(a).css("max-height",p()+"px"),j.find(".lity-loader").each(function(){var a=b(this);c(a).always(function(){a.remove()})}),j.removeClass("lity-loading").find(".lity-content").empty().append(k),m=!0,k.trigger("lity:ready",[l])}var i,j,k,l=this,m=!1,n=!1;e=b.extend({},H,e),j=b(e.template),l.element=function(){return j},l.opener=function(){return f},l.options=b.proxy(d,l,e),l.handlers=b.proxy(d,l,e.handlers),l.resize=function(){m&&!n&&k.css("max-height",p()+"px").trigger("lity:resize",[l])},l.close=function(){if(m&&!n){n=!0,u(l);var a=B();if(g&&(z.activeElement===j[0]||b.contains(j[0],z.activeElement)))try{g.focus()}catch(a){}return k.trigger("lity:close",[l]),j.removeClass("lity-opened").addClass("lity-closed"),c(k.add(j)).always(function(){k.trigger("lity:remove",[l]),j.remove(),j=void 0,a.resolve()}),a.promise()}},i=w(a,l,e.handlers,e.handler),j.attr(E,"false").addClass("lity-loading lity-opened lity-"+i.handler).appendTo("body").focus().on("click","[data-lity-close]",function(a){b(a.target).is("[data-lity-close]")&&l.close()}).trigger("lity:open",[l]),t(l),b.when(i.content).always(h)}function y(a,c,d){a.preventDefault?(a.preventDefault(),d=b(this),a=d.data("lity-target")||d.attr("href")||d.attr("src")):d=b(d);var e=new x(a,b.extend({},d.data("lity-options")||d.data("lity"),c),d,z.activeElement);if(!a.preventDefault)return e}var z=a.document,A=b(a),B=b.Deferred,C=b("html"),D=[],E="aria-hidden",F="lity-"+E,G='a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),iframe,object,embed,[contenteditable],[tabindex]:not([tabindex^="-"])',H={handler:null,handlers:{image:i,inline:j,youtube:k,vimeo:l,googlemaps:n,facebookvideo:m,iframe:o},template:'<div class="lity" role="dialog" aria-label="Dialog Window (Press escape to close)" tabindex="-1"><div class="lity-wrap" data-lity-close role="document"><div class="lity-loader" aria-hidden="true">Loading...</div><div class="lity-container"><div class="lity-content"></div><button class="lity-close" type="button" aria-label="Close (Press escape to close)" data-lity-close>×</button></div></div></div>'},I=/(^data:image\/)|(\.(png|jpe?g|gif|svg|webp|bmp|ico|tiff?)(\?\S*)?$)/i,J=/(youtube(-nocookie)?\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?([\w-]{11})(.*)?/i,K=/(vimeo(pro)?.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/,L=/((maps|www)\.)?google\.([^\/\?]+)\/?((maps\/?)?\?)(.*)/i,M=/(facebook\.com)\/([a-z0-9_-]*)\/videos\/([0-9]*)(.*)?$/i,N=function(){var a=z.createElement("div"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return b[c];return!1}();return i.test=function(a){return I.test(a)},y.version="2.2.2",y.options=b.proxy(d,y,H),y.handlers=b.proxy(d,y,H.handlers),y.current=v,b(z).on("click.lity","[data-lity]",y),y}); ===================================================== == File: src/homepage/assets/js/util.js ===================================================== (function($) { /** * Generate an indented list of links from a nav. Meant for use with panel(). * @return {jQuery} jQuery object. */ $.fn.navList = function() { var $this = $(this); $a = $this.find('a'), b = []; $a.each(function() { var $this = $(this), indent = Math.max(0, $this.parents('li').length - 1), href = $this.attr('href'), target = $this.attr('target'); b.push( '<a ' + 'class="link depth-' + indent + '"' + ( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') + ( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') + '>' + '<span class="indent-' + indent + '"></span>' + $this.text() + '</a>' ); }); return b.join(''); }; /** * Panel-ify an element. * @param {object} userConfig User config. * @return {jQuery} jQuery object. */ $.fn.panel = function(userConfig) { // No elements? if (this.length == 0) return $this; // Multiple elements? if (this.length > 1) { ===================================================== == File: src/homepage/assets/js/jquery.scrollex.min.js ===================================================== /* jquery.scrollex v0.2.1 | (c) @ajlkn | github.com/ajlkn/jquery.scrollex | MIT licensed */ !function(t){function e(t,e,n){return"string"==typeof t&&("%"==t.slice(-1)?t=parseInt(t.substring(0,t.length-1))/100*e:"vh"==t.slice(-2)?t=parseInt(t.substring(0,t.length-2))/100*n:"px"==t.slice(-2)&&(t=parseInt(t.substring(0,t.length-2)))),t}var n=t(window),i=1,o={};n.on("scroll",function(){var e=n.scrollTop();t.map(o,function(t){window.clearTimeout(t.timeoutId),t.timeoutId=window.setTimeout(function(){t.handler(e)},t.options.delay)})}).on("load",function(){n.trigger("scroll")}),jQuery.fn.scrollex=function(l){var s=t(this);if(0==this.length)return s;if(this.length>1){for(var r=0;r<this.length;r++)t(this[r]).scrollex(l);return s}if(s.data("_scrollexId"))return s;var a,u,h,c,p;switch(a=i++,u=jQuery.extend({top:0,bottom:0,delay:0,mode:"default",enter:null,leave:null,initialize:null,terminate:null,scroll:null},l),u.mode){case"top":h=function(t,e,n,i,o){return t>=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n<this.length;n++)t(this[n]).unscrollex();return e}var i,l;return(i=e.data("_scrollexId"))?(l=o[i],window.clearTimeout(l.timeoutId),delete o[i],e.removeData("_scrollexId"),l.options.terminate&&l.options.terminate.apply(this),e):e}}(jQuery); ===================================================== == File: src/homepage/.sass-cache/1d0a46e57975118413d176685dbd41641eaa56fa/_syntax-highlighting.scssc ===================================================== 3.7.4 ef05d1dd452eb066ab53c0c3dbf2871ef35af39b ??o:?Sass::Tree::RootNode?:?@children[?o:?Sass::Tree::CommentNode?:?@value[?I"*/** * Syntax highlighting styles */?:?ET: @type:?normal;?[?:?@filename0: @options{?: @linei?:?@source_rangeo:?Sass::Source::Range :?@start_poso:?Sass::Source::Position?;?i?:?@offseti?: @end_poso;??;?i?;?i : @fileI"Q/var/lib/gems/3.0.0/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss?; T:?@importero: Sass::Importers::Filesystem?: @rootI"0/var/lib/gems/3.0.0/gems/minima-2.5.1/_sass?; F:?@real_rootI"0/var/lib/gems/3.0.0/gems/minima-2.5.1/_sass?; F:?@same_name_warningso:?Set?: @hash}?Fo:?Sass::Tree::RuleNode?: @rule[?I"?.highlight?; T:?@parsed_ruleso:"Sass::Selector::CommaSequence?: @members[?o:?Sass::Selector::Sequence?; You can find the source code for the Jekyll new theme at: {% include icon-github.html username="jekyll" %} / [minima](https://github.com/jekyll/minima) You can find the source code for Jekyll at {% include icon-github.html username="jekyll" %} / [jekyll](https://github.com/jekyll/jekyll) ## How to post new articles on Jekyll #### The Posts Folder As explained on the [directory structure](https://jekyllrb.com/docs/structure/) page, the _posts folder is where your blog posts will live: ``` . ├── _drafts ├── _includes ├── _layouts ├── _posts | ├── 2007-10-29-why-every-programmer-should-play-nethack.md | └── 2009-04-26-barcamp-boston-4-roundup.md ├── _data ├── _site ├── .jekyll-metadata └── index.html ``` The files extension is Markdown. #### Front Matter The front matter is where Jekyll starts to get really cool. Any file that contains a YAML front matter block will be processed by Jekyll as a special file. The front matter must be the first thing in the file and must take the form of valid YAML set between triple-dashed lines. Here is a basic example: ``` --- layout: post title: "Welcome to Jekyll" date: 2016-08-29 16:13:22 +0200 tags: --- ``` * ```Layout``` attribute must be always Post to load the good HTM-CSS template of the page ===================================================== == File: src/homepage/_site/images/james-alt.svg ===================================================== <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="37px" height="31px" viewBox="0 0 37 31" enable-background="new 0 0 37 31" xml:space="preserve"> <g> <path fill="#FFFFFF" d="M37.001,4.407c-1.435-0.966-2.92-1.75-4.473-2.153c-1.552-0.412-3.151-0.315-4.63,0.3l-0.277,0.117 l-0.139,0.062l-0.064,0.032l-0.036,0.016l-0.018,0.008l-0.008,0.004c0.008-0.007-0.028,0.016,0.02-0.012L27.37,2.783 c-0.2,0.127-0.391,0.232-0.589,0.337c-0.392,0.207-0.796,0.391-1.216,0.543c-0.836,0.295-1.737,0.503-2.664,0.389 c-0.458-0.061-0.913-0.222-1.3-0.489c-0.382-0.268-0.689-0.629-0.899-1.026C20.28,1.737,20.15,0.857,20.124,0 c0.156,0.842,0.393,1.686,0.857,2.363c0.234,0.336,0.523,0.622,0.864,0.811c0.339,0.19,0.723,0.284,1.111,0.301 c0.782,0.038,1.582-0.201,2.325-0.532c0.376-0.165,0.741-0.353,1.092-0.563c0.176-0.105,0.354-0.219,0.509-0.33l0.307-0.201 c0.1-0.057,0.194-0.122,0.293-0.173c0.801-0.433,1.702-0.731,2.627-0.793c0.925-0.069,1.856,0.063,2.716,0.357 c0.863,0.29,1.655,0.731,2.359,1.267C35.888,3.047,36.52,3.676,37.001,4.407z"/> <path fill="#FFFFFF" d="M13.25,20.418c-5.733-4.373-9.554-8.973-9.418-9.078c0.147-0.145,4.153,4.212,9.83,8.536 c1.665,1.28,3.28,2.412,4.733,3.381c0.02-0.036,0.041-0.069,0.062-0.105c0.237-0.456,0.42-0.948,0.562-1.462 c-1.018-2.053-3.554-4.892-6.501-7.496c-0.656-0.572-1.338-1.078-2.028-1.536c-0.151,1.223-0.452,2.098-0.453,2.096 c0,0-0.335-1.163-0.306-2.579C9.266,11.892,8.8,11.63,8.336,11.389c-0.004,1.395-0.414,2.439-0.417,2.439 c0,0.002-0.833-1.414-0.922-3.071c-0.002-0.01-0.002-0.021-0.002-0.031c-2.767-1.279-5.1-1.896-5.104-1.89 C1.867,8.774,2.064,14.75,6.431,19.305c0.147-0.008,0.296-0.016,0.449-0.016c1.588,0.004,2.944,0.577,2.947,0.577 c0-0.002-0.835,0.501-2.054,0.671c0.444,0.355,0.899,0.682,1.364,0.973c1.148-0.416,2.102-0.557,2.102-0.557 c0-0.002-0.503,0.495-1.334,1.017c3.035,1.685,5.787,2.542,7.53,2.624c0.236-0.26,0.452-0.532,0.645-0.821 C16.586,22.84,14.938,21.717,13.25,20.418z"/> <path fill="#FFFFFF" d="M33.7,4.335c-1.103,0.092-2.21,0.292-3.3,0.605c-2.173,0.623-4.31,1.725-6.062,3.396 c-0.883,0.824-1.64,1.798-2.271,2.846c-0.614,1.059-1.109,2.191-1.43,3.363c-0.327,1.168-0.529,2.363-0.595,3.548 c-0.02,0.291-0.031,0.596-0.039,0.9L19.995,19.4l-0.008,0.35c-0.012,0.462-0.051,0.918-0.122,1.358 c-0.056,0.337-0.131,0.665-0.223,0.984c-0.141,0.514-0.324,1.006-0.562,1.466c-0.02,0.036-0.043,0.066-0.062,0.102 c-0.099,0.178-0.204,0.353-0.317,0.52c-0.191,0.286-0.407,0.559-0.643,0.819c-0.17,0.186-0.348,0.366-0.544,0.541 c-1.304,1.152-3.097,1.944-5.021,2.453c-1.931,0.518-3.995,0.788-6.091,0.934c-2.1,0.145-4.234,0.166-6.404,0.112 c2.023,0.815,4.157,1.338,6.333,1.664c2.179,0.313,4.422,0.415,6.701,0.127c1.137-0.149,2.287-0.394,3.418-0.802 c1.129-0.405,2.252-0.959,3.265-1.745c1.019-0.771,1.92-1.77,2.571-2.913c0.331-0.568,0.601-1.167,0.82-1.775 c0.21-0.611,0.364-1.236,0.47-1.859c0.11-0.619,0.17-1.24,0.193-1.852c0.008-0.154,0.008-0.307,0.008-0.461v-0.398 c0.005-0.234,0.011-0.468,0.022-0.716c0.052-0.967,0.166-1.914,0.376-2.832c0.418-1.832,1.213-3.537,2.405-5.009 c1.192-1.472,2.767-2.711,4.552-3.706c1.79-0.994,3.765-1.774,5.862-2.355C35.917,4.247,34.808,4.238,33.7,4.335z"/> </g> </svg> ===================================================== == File: src/homepage/_site/images/james.svg ===================================================== <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="-223 283 164 228" style="enable-background:new -223 283 164 228;" xml:space="preserve"> <style type="text/css"> .st0{display:none;} .st1{display:inline;} .st2{fill:#FFFFFF;} .st3{fill:#E74A24;} .st4{fill:none;} .st5{fill:url(#SVGID_1_);} .st6{fill:#E4262A;} .st7{font-family:'Poppins-Regular';} .st8{font-size:28px;} </style> <g id="Calque_2" class="st0"> <rect x="-233.5" y="269.3" class="st1" width="186" height="258"/> </g> <g id="Calque_1"> <g> <circle class="st2" cx="-141.1" cy="342.3" r="59.3"/> <path class="st3" d="M-100.2,317.9c-3.2-2.1-6.5-3.9-9.9-4.7c-3.4-0.9-7-0.7-10.2,0.7l-0.6,0.3l-0.3,0.1l-0.2,0.1l-0.1,0l0,0l0,0 c0,0-0.1,0,0,0l0,0c-0.4,0.3-0.9,0.5-1.3,0.7c-0.9,0.5-1.8,0.9-2.7,1.2c-1.9,0.6-3.8,1.1-5.9,0.9c-1-0.1-2-0.5-2.9-1.1 c-0.9-0.6-1.5-1.4-2-2.3c-0.9-1.8-1.2-3.7-1.3-5.6c0.3,1.9,0.9,3.7,1.9,5.2c0.5,0.7,1.2,1.4,1.9,1.8c0.8,0.4,1.6,0.6,2.5,0.7 c1.7,0.1,3.5-0.4,5.2-1.2c0.8-0.4,1.6-0.8,2.4-1.2c0.4-0.2,0.8-0.5,1.1-0.7l0.7-0.4c0.2-0.1,0.4-0.3,0.7-0.4 c1.8-1,3.8-1.6,5.8-1.7c2-0.1,4.1,0.1,6,0.8c1.9,0.6,3.7,1.6,5.2,2.8C-102.6,314.9-101.2,316.3-100.2,317.9z"/> <path class="st4" d="M-172.3,334c-0.3,0.2,8.2,10.4,20.9,20c3.7,2.9,7.4,5.3,10.7,7.4c0.3-0.4,0.5-0.8,0.7-1.1 c-3.2-2.1-6.8-4.6-10.5-7.4C-163.1,343.3-171.9,333.7-172.3,334z"/> <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.0298" y1="783.6619" x2="46.1336" y2="783.6619" gradientTransform="matrix(-0.1008 -0.9949 -0.9949 0.1008 623.7179 292.7814)"> <stop offset="0" style="stop-color:#FBC315"/> <stop offset="0.4969" style="stop-color:#E74A24"/> <stop offset="1" style="stop-color:#E4262A"/> </linearGradient> <path class="st5" d="M-152.8,353.1c-12.7-9.6-21.2-19.7-20.9-20c0.3-0.3,9.2,9.3,21.8,18.8c3.7,2.8,7.3,5.3,10.5,7.4 c0-0.1,0.1-0.1,0.1-0.2c0.5-1,0.9-2.1,1.2-3.2c-2.3-4.5-7.9-10.8-14.4-16.5c-1.5-1.3-3-2.4-4.5-3.4c-0.3,2.7-1,4.6-1,4.6 c0,0-0.7-2.6-0.7-5.7c-1-0.6-2.1-1.2-3.1-1.7c0,3.1-0.9,5.4-0.9,5.4c0,0-1.8-3.1-2-6.8c0,0,0,0,0-0.1c-6.1-2.8-11.3-4.2-11.3-4.2 c-0.1-0.1,0.4,13,10.1,23c0.3,0,0.7,0,1,0c3.5,0,6.5,1.3,6.5,1.3c0,0-1.8,1.1-4.6,1.5c1,0.8,2,1.5,3,2.1c2.5-0.9,4.7-1.2,4.7-1.2 c0,0-1.1,1.1-3,2.2c6.7,3.7,12.8,5.6,16.7,5.8c0.5-0.6,1-1.2,1.4-1.8C-145.4,358.4-149,356-152.8,353.1z"/> <path class="st6" d="M-107.5,317.7c-2.4,0.2-4.9,0.6-7.3,1.3c-4.8,1.4-9.5,3.8-13.4,7.5c-2,1.8-3.6,4-5,6.3 c-1.4,2.3-2.5,4.8-3.2,7.4c-0.7,2.6-1.2,5.2-1.3,7.8c0,0.6-0.1,1.3-0.1,2l0,0.9l0,0.8c0,1-0.1,2-0.3,3c-0.1,0.7-0.3,1.5-0.5,2.2 c-0.3,1.1-0.7,2.2-1.2,3.2c0,0.1-0.1,0.1-0.1,0.2c-0.2,0.4-0.5,0.8-0.7,1.1c-0.4,0.6-0.9,1.2-1.4,1.8c-0.4,0.4-0.8,0.8-1.2,1.2 c-2.9,2.5-6.9,4.3-11.1,5.4c-4.3,1.1-8.9,1.7-13.5,2.1c-4.7,0.3-9.4,0.4-14.2,0.2c4.5,1.8,9.2,2.9,14,3.7 c4.8,0.7,9.8,0.9,14.8,0.3c2.5-0.3,5.1-0.9,7.6-1.8c2.5-0.9,5-2.1,7.2-3.8c2.3-1.7,4.2-3.9,5.7-6.4c0.7-1.3,1.3-2.6,1.8-3.9 c0.5-1.3,0.8-2.7,1-4.1c0.2-1.4,0.4-2.7,0.4-4.1c0-0.3,0-0.7,0-1l0-0.9c0-0.5,0-1,0-1.6c0.1-2.1,0.4-4.2,0.8-6.2 c0.9-4,2.7-7.8,5.3-11c2.6-3.2,6.1-6,10.1-8.2c4-2.2,8.3-3.9,13-5.2C-102.6,317.5-105,317.5-107.5,317.7z"/> </g> <g> <path class="st2" d="M-217.7,479.8c-1.9,0-3.4-0.2-4.7-0.7v-5.7c1.6,0.4,3,0.6,4.2,0.6c3.7,0,5.6-2.4,5.6-7.1v-40.3h6.8v40.1 c0,4.3-1,7.5-3,9.8C-210.8,478.7-213.8,479.8-217.7,479.8z"/> ===================================================== == File: src/homepage/_site/assets/main.css ===================================================== /** * Reset some basic elements */ body, h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr, dl, dd, ol, ul, figure { margin: 0; padding: 0; } /** * Basic styling */ body { font: 400 16px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; color: #111; background-color: #fdfdfd; -webkit-text-size-adjust: 100%; -webkit-font-feature-settings: "kern" 1; -moz-font-feature-settings: "kern" 1; -o-font-feature-settings: "kern" 1; font-feature-settings: "kern" 1; font-kerning: normal; display: flex; min-height: 100vh; flex-direction: column; } /** * Set `margin-bottom` to maintain vertical rhythm */ h1, h2, h3, h4, h5, h6, p, blockquote, pre, ul, ol, dl, figure, .highlight { margin-bottom: 15px; } /** * `main` element */ main { display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */ } /** * Images */ img { max-width: 100%; ===================================================== == File: src/homepage/_site/assets/main.css.map ===================================================== {"version":3,"sourceRoot":"","sources":["../../../../../gems/gems/minima-2.5.1/_sass/minima/_base.scss","../../../../../gems/gems/minima-2.5.1/_sass/minima.scss","../../../../../gems/gems/minima-2.5.1/_sass/minima/_layout.scss","../../../../../gems/gems/minima-2.5.1/_sass/minima/_syntax-highlighting.scss"],"names":[],"mappings":"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","sourcesContent":["/**\n * Reset some basic elements\n */\nbody, h1, h2, h3, h4, h5, h6,\np, blockquote, pre, hr,\ndl, dd, ol, ul, figure {\n margin: 0;\n padding: 0;\n}\n\n\n\n/**\n * Basic styling\n */\nbody {\n font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;\n color: $text-color;\n background-color: $background-color;\n -webkit-text-size-adjust: 100%;\n -webkit-font-feature-settings: \"kern\" 1;\n -moz-font-feature-settings: \"kern\" 1;\n -o-font-feature-settings: \"kern\" 1;\n font-feature-settings: \"kern\" 1;\n font-kerning: normal;\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n}\n\n\n\n/**\n * Set `margin-bottom` to maintain vertical rhythm\n */\nh1, h2, h3, h4, h5, h6,\np, blockquote, pre,\nul, ol, dl, figure,\n%vertical-rhythm {\n margin-bottom: $spacing-unit / 2;\n}\n\n\n\n/**\n * `main` element\n */\nmain {\n display: block; /* Default value of `display` of `main` element is 'inline' in IE 11. */\n}\n\n\n\n/**\n * Images\n */\nimg {\n max-width: 100%;\n vertical-align: middle;\n}\n\n\n\n/**\n * Figures\n */\nfigure > img {\n display: block;\n}\n\nfigcaption {\n font-size: $small-font-size;\n}\n\n\n\n/**\n * Lists\n */\nul, ol {\n margin-left: $spacing-unit;\n}\n\nli {\n > ul,\n > ol {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Headings\n */\nh1, h2, h3, h4, h5, h6 {\n font-weight: $base-font-weight;\n}\n\n\n\n/**\n * Links\n */\na {\n color: $brand-color;\n text-decoration: none;\n\n &:visited {\n color: darken($brand-color, 15%);\n }\n\n &:hover {\n color: $text-color;\n text-decoration: underline;\n }\n\n .social-media-list &:hover {\n text-decoration: none;\n\n .username {\n text-decoration: underline;\n }\n }\n}\n\n\n/**\n * Blockquotes\n */\nblockquote {\n color: $grey-color;\n border-left: 4px solid $grey-color-light;\n padding-left: $spacing-unit / 2;\n @include relative-font-size(1.125);\n letter-spacing: -1px;\n font-style: italic;\n\n > :last-child {\n margin-bottom: 0;\n }\n}\n\n\n\n/**\n * Code formatting\n */\npre,\ncode {\n @include relative-font-size(0.9375);\n border: 1px solid $grey-color-light;\n border-radius: 3px;\n background-color: #eef;\n}\n\ncode {\n padding: 1px 5px;\n}\n\npre {\n padding: 8px 12px;\n overflow-x: auto;\n\n > code {\n border: 0;\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n\n/**\n * Wrapper\n */\n.wrapper {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));\n max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));\n margin-right: auto;\n margin-left: auto;\n padding-right: $spacing-unit;\n padding-left: $spacing-unit;\n @extend %clearfix;\n\n @include media-query($on-laptop) {\n max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));\n max-width: calc(#{$content-width} - (#{$spacing-unit}));\n padding-right: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n }\n}\n\n\n\n/**\n * Clearfix\n */\n%clearfix:after {\n content: \"\";\n display: table;\n clear: both;\n}\n\n\n\n/**\n * Icons\n */\n\n.svg-icon {\n width: 16px;\n height: 16px;\n display: inline-block;\n fill: #{$grey-color};\n padding-right: 5px;\n vertical-align: text-top;\n}\n\n.social-media-list {\n li + li {\n padding-top: 5px;\n }\n}\n\n\n\n/**\n * Tables\n */\ntable {\n margin-bottom: $spacing-unit;\n width: 100%;\n text-align: $table-text-align;\n color: lighten($text-color, 18%);\n border-collapse: collapse;\n border: 1px solid $grey-color-light;\n tr {\n &:nth-child(even) {\n background-color: lighten($grey-color-light, 6%);\n }\n }\n th, td {\n padding: ($spacing-unit / 3) ($spacing-unit / 2);\n }\n th {\n background-color: lighten($grey-color-light, 3%);\n border: 1px solid darken($grey-color-light, 4%);\n border-bottom-color: darken($grey-color-light, 12%);\n }\n td {\n border: 1px solid $grey-color-light;\n }\n}\n","@charset \"utf-8\";\n\n// Define defaults for each variable.\n\n$base-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\" !default;\n$base-font-size: 16px !default;\n$base-font-weight: 400 !default;\n$small-font-size: $base-font-size * 0.875 !default;\n$base-line-height: 1.5 !default;\n\n$spacing-unit: 30px !default;\n\n$text-color: #111 !default;\n$background-color: #fdfdfd !default;\n$brand-color: #2a7ae2 !default;\n\n$grey-color: #828282 !default;\n$grey-color-light: lighten($grey-color, 40%) !default;\n$grey-color-dark: darken($grey-color, 25%) !default;\n\n$table-text-align: left !default;\n\n// Width of the content area\n$content-width: 800px !default;\n\n$on-palm: 600px !default;\n$on-laptop: 800px !default;\n\n// Use media queries like this:\n// @include media-query($on-palm) {\n// .wrapper {\n// padding-right: $spacing-unit / 2;\n// padding-left: $spacing-unit / 2;\n// }\n// }\n@mixin media-query($device) {\n @media screen and (max-width: $device) {\n @content;\n }\n}\n\n@mixin relative-font-size($ratio) {\n font-size: $base-font-size * $ratio;\n}\n\n// Import partials.\n@import\n \"minima/base\",\n \"minima/layout\",\n \"minima/syntax-highlighting\"\n;\n","/**\n * Site header\n */\n.site-header {\n border-top: 5px solid $grey-color-dark;\n border-bottom: 1px solid $grey-color-light;\n min-height: $spacing-unit * 1.865;\n\n // Positioning context for the mobile navigation icon\n position: relative;\n}\n\n.site-title {\n @include relative-font-size(1.625);\n font-weight: 300;\n line-height: $base-line-height * $base-font-size * 2.25;\n letter-spacing: -1px;\n margin-bottom: 0;\n float: left;\n\n &,\n &:visited {\n color: $grey-color-dark;\n }\n}\n\n.site-nav {\n float: right;\n line-height: $base-line-height * $base-font-size * 2.25;\n\n .nav-trigger {\n display: none;\n }\n\n .menu-icon {\n display: none;\n }\n\n .page-link {\n color: $text-color;\n line-height: $base-line-height;\n\n // Gaps between nav items, but not on the last one\n &:not(:last-child) {\n margin-right: 20px;\n }\n }\n\n @include media-query($on-palm) {\n position: absolute;\n top: 9px;\n right: $spacing-unit / 2;\n background-color: $background-color;\n border: 1px solid $grey-color-light;\n border-radius: 5px;\n text-align: right;\n\n label[for=\"nav-trigger\"] {\n display: block;\n float: right;\n width: 36px;\n height: 36px;\n z-index: 2;\n cursor: pointer;\n }\n\n .menu-icon {\n display: block;\n float: right;\n width: 36px;\n height: 26px;\n line-height: 0;\n padding-top: 10px;\n text-align: center;\n\n > svg {\n fill: $grey-color-dark;\n }\n }\n\n input ~ .trigger {\n clear: both;\n display: none;\n }\n\n input:checked ~ .trigger {\n display: block;\n padding-bottom: 5px;\n }\n\n .page-link {\n display: block;\n padding: 5px 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n margin-left: 20px;\n }\n }\n}\n\n\n\n/**\n * Site footer\n */\n.site-footer {\n border-top: 1px solid $grey-color-light;\n padding: $spacing-unit 0;\n}\n\n.footer-heading {\n @include relative-font-size(1.125);\n margin-bottom: $spacing-unit / 2;\n}\n\n.contact-list,\n.social-media-list {\n list-style: none;\n margin-left: 0;\n}\n\n.footer-col-wrapper {\n @include relative-font-size(0.9375);\n color: $grey-color;\n margin-left: -$spacing-unit / 2;\n @extend %clearfix;\n}\n\n.footer-col {\n float: left;\n margin-bottom: $spacing-unit / 2;\n padding-left: $spacing-unit / 2;\n}\n\n.footer-col-1 {\n width: -webkit-calc(35% - (#{$spacing-unit} / 2));\n width: calc(35% - (#{$spacing-unit} / 2));\n}\n\n.footer-col-2 {\n width: -webkit-calc(20% - (#{$spacing-unit} / 2));\n width: calc(20% - (#{$spacing-unit} / 2));\n}\n\n.footer-col-3 {\n width: -webkit-calc(45% - (#{$spacing-unit} / 2));\n width: calc(45% - (#{$spacing-unit} / 2));\n}\n\n@include media-query($on-laptop) {\n .footer-col-1,\n .footer-col-2 {\n width: -webkit-calc(50% - (#{$spacing-unit} / 2));\n width: calc(50% - (#{$spacing-unit} / 2));\n }\n\n .footer-col-3 {\n width: -webkit-calc(100% - (#{$spacing-unit} / 2));\n width: calc(100% - (#{$spacing-unit} / 2));\n }\n}\n\n@include media-query($on-palm) {\n .footer-col {\n float: none;\n width: -webkit-calc(100% - (#{$spacing-unit} / 2));\n width: calc(100% - (#{$spacing-unit} / 2));\n }\n}\n\n\n\n/**\n * Page content\n */\n.page-content {\n padding: $spacing-unit 0;\n flex: 1;\n}\n\n.page-heading {\n @include relative-font-size(2);\n}\n\n.post-list-heading {\n @include relative-font-size(1.75);\n}\n\n.post-list {\n margin-left: 0;\n list-style: none;\n\n > li {\n margin-bottom: $spacing-unit;\n }\n}\n\n.post-meta {\n font-size: $small-font-size;\n color: $grey-color;\n}\n\n.post-link {\n display: block;\n @include relative-font-size(1.5);\n}\n\n\n\n/**\n * Posts\n */\n.post-header {\n margin-bottom: $spacing-unit;\n}\n\n.post-title {\n @include relative-font-size(2.625);\n letter-spacing: -1px;\n line-height: 1;\n\n @include media-query($on-laptop) {\n @include relative-font-size(2.25);\n }\n}\n\n.post-content {\n margin-bottom: $spacing-unit;\n\n h2 {\n @include relative-font-size(2);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.75);\n }\n }\n\n h3 {\n @include relative-font-size(1.625);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.375);\n }\n }\n\n h4 {\n @include relative-font-size(1.25);\n\n @include media-query($on-laptop) {\n @include relative-font-size(1.125);\n }\n }\n}\n","/**\n * Syntax highlighting styles\n */\n.highlight {\n background: #fff;\n @extend %vertical-rhythm;\n\n .highlighter-rouge & {\n background: #eef;\n }\n\n .c { color: #998; font-style: italic } // Comment\n .err { color: #a61717; background-color: #e3d2d2 } // Error\n .k { font-weight: bold } // Keyword\n .o { font-weight: bold } // Operator\n .cm { color: #998; font-style: italic } // Comment.Multiline\n .cp { color: #999; font-weight: bold } // Comment.Preproc\n .c1 { color: #998; font-style: italic } // Comment.Single\n .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special\n .gd { color: #000; background-color: #fdd } // Generic.Deleted\n .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific\n .ge { font-style: italic } // Generic.Emph\n .gr { color: #a00 } // Generic.Error\n .gh { color: #999 } // Generic.Heading\n .gi { color: #000; background-color: #dfd } // Generic.Inserted\n .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific\n .go { color: #888 } // Generic.Output\n .gp { color: #555 } // Generic.Prompt\n .gs { font-weight: bold } // Generic.Strong\n .gu { color: #aaa } // Generic.Subheading\n .gt { color: #a00 } // Generic.Traceback\n .kc { font-weight: bold } // Keyword.Constant\n .kd { font-weight: bold } // Keyword.Declaration\n .kp { font-weight: bold } // Keyword.Pseudo\n .kr { font-weight: bold } // Keyword.Reserved\n .kt { color: #458; font-weight: bold } // Keyword.Type\n .m { color: #099 } // Literal.Number\n .s { color: #d14 } // Literal.String\n .na { color: #008080 } // Name.Attribute\n .nb { color: #0086B3 } // Name.Builtin\n .nc { color: #458; font-weight: bold } // Name.Class\n .no { color: #008080 } // Name.Constant\n .ni { color: #800080 } // Name.Entity\n .ne { color: #900; font-weight: bold } // Name.Exception\n .nf { color: #900; font-weight: bold } // Name.Function\n .nn { color: #555 } // Name.Namespace\n .nt { color: #000080 } // Name.Tag\n .nv { color: #008080 } // Name.Variable\n .ow { font-weight: bold } // Operator.Word\n .w { color: #bbb } // Text.Whitespace\n .mf { color: #099 } // Literal.Number.Float\n .mh { color: #099 } // Literal.Number.Hex\n .mi { color: #099 } // Literal.Number.Integer\n .mo { color: #099 } // Literal.Number.Oct\n .sb { color: #d14 } // Literal.String.Backtick\n .sc { color: #d14 } // Literal.String.Char\n .sd { color: #d14 } // Literal.String.Doc\n .s2 { color: #d14 } // Literal.String.Double\n .se { color: #d14 } // Literal.String.Escape\n .sh { color: #d14 } // Literal.String.Heredoc\n .si { color: #d14 } // Literal.String.Interpol\n .sx { color: #d14 } // Literal.String.Other\n .sr { color: #009926 } // Literal.String.Regex\n .s1 { color: #d14 } // Literal.String.Single\n .ss { color: #990073 } // Literal.String.Symbol\n .bp { color: #999 } // Name.Builtin.Pseudo\n .vc { color: #008080 } // Name.Variable.Class\n .vg { color: #008080 } // Name.Variable.Global\n .vi { color: #008080 } // Name.Variable.Instance\n .il { color: #099 } // Literal.Number.Integer.Long\n}\n"],"file":"main.css"} ===================================================== == File: src/homepage/_site/assets/css/font-awesome.min.css ===================================================== /*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url('../../assets/fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../../assets/fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../../assets/fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../../assets/fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../../assets/fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../../assets/fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} ===================================================== == File: src/homepage/_site/assets/css/main.css ===================================================== @import url(font-awesome.min.css); @import "https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400"; @import url('https://fonts.googleapis.com/css?family=Poppins'); /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ /* Reset */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 12pt; font-family: "Poppins", Helvetica, sans-serif; vertical-align: baseline; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } body { -webkit-text-size-adjust: none; } ===================================================== == File: src/homepage/_site/assets/css/lity.min.css ===================================================== /*! Lity - v2.2.2 - 2016-12-14 * http://sorgalla.com/lity/ * Copyright (c) 2015-2016 Jan Sorgalla; Licensed MIT */.lity{z-index:9990;position:fixed;top:0;right:0;bottom:0;left:0;white-space:nowrap;background:#0b0b0b;background:rgba(0,0,0,0.9);outline:none !important;opacity:0;-webkit-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease}.lity.lity-opened{opacity:1}.lity.lity-closed{opacity:0}.lity *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.lity-wrap{z-index:9990;position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;outline:none !important}.lity-wrap:before{content:'';display:inline-block;height:100%;vertical-align:middle;margin-right:-0.25em}.lity-loader{z-index:9991;color:#fff;position:absolute;top:50%;margin-top:-0.8em;width:100%;text-align:center;font-size:14px;font-family:Arial,Helvetica,sans-serif;opacity:0;-webkit-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease}.lity-loading .lity-loader{opacity:1}.lity-container{z-index:9992;position:relative;text-align:left;vertical-align:middle;display:inline-block;white-space:normal;max-width:100%;max-height:100%;outline:none !important}.lity-content{z-index:9993;width:100%;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;-o-transition:-o-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease, -webkit-transform .3s ease, -o-transform .3s ease}.lity-loading .lity-content,.lity-closed .lity-content{-webkit-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}.lity-content:after{content:'';position:absolute;left:0;top:0;bottom:0;display:block;right:0;width:auto;height:auto;z-index:-1;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.6);box-shadow:0 0 8px rgba(0,0,0,0.6)}.lity-close{z-index:9994;width:35px;height:35px;position:fixed;right:0;top:0;-webkit-appearance:none;cursor:pointer;text-decoration:none;text-align:center;padding:0;color:#fff;font-style:normal;font-size:35px;font-family:Arial,Baskerville,monospace;line-height:35px;text-shadow:0 1px 2px rgba(0,0,0,0.6);border:0;background:none;outline:none;-webkit-box-shadow:none;box-shadow:none}.lity-close::-moz-focus-inner{border:0;padding:0}.lity-close:hover,.lity-close:focus,.lity-close:active,.lity-close:visited{text-decoration:none;text-align:center;padding:0;color:#fff;font-style:normal;font-size:35px;font-family:Arial,Baskerville,monospace;line-height:35px;text-shadow:0 1px 2px rgba(0,0,0,0.6);border:0;background:none;outline:none;-webkit-box-shadow:none;box-shadow:none}.lity-close:active{top:1px}.lity-image img{max-width:100%;display:block;line-height:0;border:0}.lity-iframe .lity-container,.lity-youtube .lity-container,.lity-vimeo .lity-container,.lity-facebookvideo .lity-container,.lity-googlemaps .lity-container{width:100%;max-width:964px}.lity-iframe-container{width:100%;height:0;padding-top:56.25%;overflow:auto;pointer-events:auto;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-overflow-scrolling:touch}.lity-iframe-container iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;-webkit-box-shadow:0 0 8px rgba(0,0,0,0.6);box-shadow:0 0 8px rgba(0,0,0,0.6);background:#000}.lity-hide{display:none} ===================================================== == File: src/homepage/_site/assets/css/ie8.css ===================================================== /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ /* Type */ body { color: #ffffff; } /* Button */ .button { position: relative; border: solid 1px !important; } .button.special { border: none !important; } /* Icon */ .icon.major { -ms-behavior: url("assets/js/ie/PIE.htc"); } .icon.major:before { font-size: 4em; border: 0; } /* Spotlight */ .spotlight .image { position: relative; -ms-behavior: url("assets/js/ie/PIE.htc"); } .spotlight .image img { position: relative; -ms-behavior: url("assets/js/ie/PIE.htc"); } /* Features */ .features li { width: 29%; ===================================================== == File: src/homepage/_site/assets/css/ie9.css ===================================================== /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ /* Spotlight */ .spotlight:after { content: ''; display: block; clear: both; } .spotlight .content { float: left; width: 60%; } .spotlight .image { float: left; } /* Features */ .features:after { content: ''; display: block; clear: both; } .features li { float: left; } /* Statistics */ .statistics { display: inline-block; } .statistics:after { content: ''; display: block; clear: both; } .statistics li { float: left; padding: 1.5em 2.5em; ===================================================== == File: src/homepage/_site/assets/css/test.html ===================================================== <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Calque_1" x="0px" y="0px" width="841.89px" height="595.28px" viewBox="0 0 841.89 595.28" enable-background="new 0 0 841.89 595.28" xml:space="preserve"> <circle fill="#FFFFFF" cx="672.754" cy="148.406" r="66.5"/> <g> <path fill="#E64821" d="M718.72,121.022c-3.564-2.383-7.259-4.322-11.117-5.314c-3.85-1.014-7.823-0.778-11.496,0.742l-0.691,0.288 l-0.342,0.154l-0.169,0.079l-0.087,0.04l-0.042,0.02l-0.022,0.01c0.022-0.015-0.064,0.039,0.048-0.031l-0.011,0.006 c-0.5,0.313-0.969,0.572-1.462,0.83c-0.978,0.509-1.981,0.965-3.021,1.341c-2.077,0.729-4.318,1.242-6.619,0.96 c-1.14-0.15-2.273-0.547-3.228-1.208c-0.954-0.659-1.714-1.552-2.235-2.532c-1.052-1.972-1.373-4.147-1.439-6.262 c0.386,2.077,0.973,4.162,2.13,5.836c0.581,0.827,1.298,1.534,2.146,1.999c0.842,0.471,1.794,0.699,2.763,0.743 c1.946,0.094,3.931-0.496,5.777-1.31c0.931-0.407,1.84-0.872,2.715-1.393c0.433-0.256,0.877-0.537,1.262-0.808l0.763-0.498 c0.242-0.141,0.476-0.302,0.729-0.428c1.985-1.068,4.221-1.805,6.523-1.96c2.296-0.168,4.614,0.158,6.75,0.882 c2.142,0.716,4.112,1.807,5.864,3.129C715.953,117.664,717.52,119.218,718.72,121.022z"/> <g> <path fill="none" d="M637.856,139.139c-0.337,0.258,9.157,11.617,23.405,22.405c4.192,3.205,8.29,5.973,11.994,8.286 c0.281-0.416,0.542-0.842,0.787-1.279c-3.608-2.39-7.623-5.184-11.763-8.348C648.18,149.535,638.222,138.782,637.856,139.139z"/> <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="1192.2021" y1="229.4492" x2="1234.9417" y2="229.4492" gradientTransform="matrix(-0.1008 -0.9949 0.9949 -0.1008 547.1743 1381.7705)"> <stop offset="0" style="stop-color:#FCC30E"/> <stop offset="0.4969" style="stop-color:#E64821"/> <stop offset="1" style="stop-color:#E42328"/> </linearGradient> <path fill="url(#SVGID_5_)" d="M659.708,160.542c-14.247-10.789-23.741-22.147-23.405-22.406 c0.366-0.357,10.323,10.396,24.424,21.064c4.14,3.164,8.154,5.958,11.763,8.348c0.048-0.086,0.104-0.168,0.152-0.256 c0.592-1.131,1.046-2.347,1.401-3.617c-2.531-5.059-8.833-12.067-16.158-18.494c-1.629-1.413-3.325-2.666-5.04-3.792 c-0.373,3.018-1.118,5.178-1.123,5.177c0,0-0.831-2.873-0.76-6.369c-1.156-0.697-2.313-1.347-3.463-1.94 c-0.011,3.443-1.033,6.021-1.038,6.022c0,0.007-2.07-3.492-2.291-7.581c-0.003-0.026-0.003-0.052-0.003-0.076 c-6.875-3.16-12.671-4.681-12.682-4.666c-0.062-0.155,0.428,14.595,11.28,25.836c0.366-0.022,0.735-0.04,1.114-0.039 c3.946,0.008,7.317,1.426,7.323,1.425c0-0.003-2.075,1.235-5.106,1.653c1.103,0.882,2.235,1.681,3.39,2.406 c2.854-1.034,5.221-1.376,5.221-1.376c0-0.005-1.248,1.226-3.314,2.506c7.54,4.161,14.378,6.28,18.711,6.479 c0.586-0.64,1.121-1.313,1.599-2.021C667.998,166.515,663.901,163.747,659.708,160.542z"/> <path fill="#E42328" d="M710.524,120.843c-2.746,0.231-5.496,0.723-8.203,1.497c-5.401,1.538-10.711,4.256-15.061,8.381 c-2.191,2.033-4.073,4.437-5.644,7.024c-1.523,2.615-2.755,5.412-3.551,8.303c-0.82,2.884-1.311,5.83-1.479,8.755 c-0.05,0.721-0.077,1.467-0.096,2.221l-0.017,1.005l-0.024,0.862c-0.029,1.145-0.127,2.268-0.303,3.355 c-0.138,0.833-0.329,1.64-0.552,2.429c-0.354,1.27-0.809,2.486-1.4,3.618c-0.048,0.087-0.105,0.169-0.152,0.255 c-0.245,0.438-0.506,0.864-0.787,1.279c-0.479,0.708-1.013,1.381-1.6,2.021c-0.423,0.461-0.865,0.91-1.347,1.333 c-3.241,2.849-7.697,4.804-12.477,6.061c-4.796,1.275-9.926,1.944-15.132,2.303c-5.218,0.352-10.52,0.408-15.913,0.276 c5.027,2.018,10.327,3.3,15.735,4.109c5.415,0.774,10.986,1.024,16.65,0.312c2.825-0.373,5.682-0.975,8.496-1.973 c2.801-1.005,5.597-2.373,8.113-4.309c2.525-1.907,4.765-4.373,6.386-7.192c0.82-1.403,1.494-2.88,2.035-4.386 c0.519-1.511,0.908-3.049,1.171-4.583c0.269-1.535,0.419-3.065,0.479-4.578c0.019-0.379,0.017-0.755,0.021-1.132l0.002-0.989 c0.005-0.574,0.018-1.158,0.049-1.764c0.129-2.384,0.416-4.727,0.939-6.99c1.039-4.525,3.008-8.727,5.973-12.363 c2.961-3.634,6.877-6.692,11.314-9.149c4.449-2.453,9.354-4.38,14.567-5.816C716.026,120.628,713.268,120.607,710.524,120.843z"/> </g> </g> </svg> ===================================================== == File: src/homepage/_site/assets/css/lightbox.css ===================================================== /* Preload images */ body:after { content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png) url(../images/next.png); display: none; } body.lb-disable-scrolling { overflow: hidden; } .lightboxOverlay { position: absolute; top: 0; left: 0; z-index: 9999; background-color: black; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); opacity: 0.8; display: none; } .lightbox { position: absolute; left: 0; width: 100%; z-index: 10000; text-align: center; line-height: 0; font-weight: normal; } .lightbox .lb-image { display: block; height: auto; max-width: inherit; border-radius: 3px; } .lightbox a img { border: none; } .lb-outerContainer { position: relative; background-color: white; *zoom: 1; width: 250px; height: 250px; margin: 0 auto; border-radius: 4px; ===================================================== == File: src/homepage/_site/assets/minima-social-icons.svg ===================================================== <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <symbol id="dribbble" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 16c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm6.747-6.905c-.234-.074-2.115-.635-4.257-.292.894 2.456 1.258 4.456 1.328 4.872 1.533-1.037 2.624-2.68 2.93-4.58zM10.67 14.3c-.102-.6-.5-2.688-1.46-5.18l-.044.014C5.312 10.477 3.93 13.15 3.806 13.4c1.158.905 2.614 1.444 4.194 1.444.947 0 1.85-.194 2.67-.543zm-7.747-1.72c.155-.266 2.03-3.37 5.555-4.51.09-.03.18-.056.27-.08-.173-.39-.36-.778-.555-1.16-3.413 1.02-6.723.977-7.023.97l-.003.208c0 1.755.665 3.358 1.756 4.57zM1.31 6.61c.307.005 3.122.017 6.318-.832-1.132-2.012-2.353-3.705-2.533-3.952-1.912.902-3.34 2.664-3.784 4.785zM6.4 1.368c.188.253 1.43 1.943 2.548 4 2.43-.91 3.46-2.293 3.582-2.468C11.323 1.827 9.736 1.176 8 1.176c-.55 0-1.087.066-1.6.19zm6.89 2.322c-.145.194-1.29 1.662-3.816 2.694.16.325.31.656.453.99.05.117.1.235.147.352 2.274-.286 4.533.172 4.758.22-.015-1.613-.59-3.094-1.543-4.257z"/></symbol> <symbol id="facebook" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M15.117 0H.883C.395 0 0 .395 0 .883v14.234c0 .488.395.883.883.883h7.663V9.804H6.46V7.39h2.086V5.607c0-2.066 1.262-3.19 3.106-3.19.883 0 1.642.064 1.863.094v2.16h-1.28c-1 0-1.195.48-1.195 1.18v1.54h2.39l-.31 2.42h-2.08V16h4.077c.488 0 .883-.395.883-.883V.883C16 .395 15.605 0 15.117 0" fill-rule="nonzero"/></symbol> <symbol id="flickr" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M0 8c0 2.05 1.662 3.71 3.71 3.71 2.05 0 3.713-1.66 3.713-3.71S5.76 4.29 3.71 4.29C1.663 4.29 0 5.95 0 8zm8.577 0c0 2.05 1.662 3.71 3.712 3.71C14.33 11.71 16 10.05 16 8s-1.662-3.71-3.71-3.71c-2.05 0-3.713 1.66-3.713 3.71z"/></symbol> <symbol id="github" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 0C3.58 0 0 3.582 0 8c0 3.535 2.292 6.533 5.47 7.59.4.075.547-.172.547-.385 0-.19-.007-.693-.01-1.36-2.226.483-2.695-1.073-2.695-1.073-.364-.924-.89-1.17-.89-1.17-.725-.496.056-.486.056-.486.803.056 1.225.824 1.225.824.714 1.223 1.873.87 2.33.665.072-.517.278-.87.507-1.07-1.777-.2-3.644-.888-3.644-3.953 0-.873.31-1.587.823-2.147-.09-.202-.36-1.015.07-2.117 0 0 .67-.215 2.2.82.64-.178 1.32-.266 2-.27.68.004 1.36.092 2 .27 1.52-1.035 2.19-.82 2.19-.82.43 1.102.16 1.915.08 2.117.51.56.82 1.274.82 2.147 0 3.073-1.87 3.75-3.65 3.947.28.24.54.73.54 1.48 0 1.07-.01 1.93-.01 2.19 0 .21.14.46.55.38C13.71 14.53 16 11.53 16 8c0-4.418-3.582-8-8-8"/></symbol> <symbol id="googleplus" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M5.09 7.273v1.745h2.89c-.116.75-.873 2.197-2.887 2.197-1.737 0-3.155-1.44-3.155-3.215S3.353 4.785 5.09 4.785c.99 0 1.652.422 2.03.786l1.382-1.33c-.887-.83-2.037-1.33-3.41-1.33C2.275 2.91 0 5.19 0 8s2.276 5.09 5.09 5.09c2.94 0 4.888-2.065 4.888-4.974 0-.334-.036-.59-.08-.843H5.09zm10.91 0h-1.455V5.818H13.09v1.455h-1.454v1.454h1.455v1.455h1.46V8.727H16"/></symbol> <symbol id="instagram" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 0C5.827 0 5.555.01 4.702.048 3.85.088 3.27.222 2.76.42c-.526.204-.973.478-1.417.923-.445.444-.72.89-.923 1.417-.198.51-.333 1.09-.372 1.942C.008 5.555 0 5.827 0 8s.01 2.445.048 3.298c.04.852.174 1.433.372 1.942.204.526.478.973.923 1.417.444.445.89.72 1.417.923.51.198 1.09.333 1.942.372.853.04 1.125.048 3.298.048s2.445-.01 3.298-.048c.852-.04 1.433-.174 1.942-.372.526-.204.973-.478 1.417-.923.445-.444.72-.89.923-1.417.198-.51.333-1.09.372-1.942.04-.853.048-1.125.048-3.298s-.01-2.445-.048-3.298c-.04-.852-.174-1.433-.372-1.942-.204-.526-.478-.973-.923-1.417-.444-.445-.89-.72-1.417-.923-.51-.198-1.09-.333-1.942-.372C10.445.008 10.173 0 8 0zm0 1.44c2.136 0 2.39.01 3.233.048.78.036 1.203.166 1.485.276.374.145.64.318.92.598.28.28.453.546.598.92.11.282.24.705.276 1.485.038.844.047 1.097.047 3.233s-.01 2.39-.05 3.233c-.04.78-.17 1.203-.28 1.485-.15.374-.32.64-.6.92-.28.28-.55.453-.92.598-.28.11-.71.24-1.49.276-.85.038-1.1.047-3.24.047s-2.39-.01-3.24-.05c-.78-.04-1.21-.17-1.49-.28-.38-.15-.64-.32-.92-.6-.28-.28-.46-.55-.6-.92-.11-.28-.24-.71-.28-1.49-.03-.84-.04-1.1-.04-3.23s.01-2.39.04-3.24c.04-.78.17-1.21.28-1.49.14-.38.32-.64.6-.92.28-.28.54-.46.92-.6.28-.11.7-.24 1.48-.28.85-.03 1.1-.04 3.24-.04zm0 2.452c-2.27 0-4.108 1.84-4.108 4.108 0 2.27 1.84 4.108 4.108 4.108 2.27 0 4.108-1.84 4.108-4.108 0-2.27-1.84-4.108-4.108-4.108zm0 6.775c-1.473 0-2.667-1.194-2.667-2.667 0-1.473 1.194-2.667 2.667-2.667 1.473 0 2.667 1.194 2.667 2.667 0 1.473-1.194 2.667-2.667 2.667zm5.23-6.937c0 .53-.43.96-.96.96s-.96-.43-.96-.96.43-.96.96-.96.96.43.96.96z"/></symbol> <symbol id="linkedin" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M13.632 13.635h-2.37V9.922c0-.886-.018-2.025-1.234-2.025-1.235 0-1.424.964-1.424 1.96v3.778h-2.37V6H8.51v1.04h.03c.318-.6 1.092-1.233 2.247-1.233 2.4 0 2.845 1.58 2.845 3.637v4.188zM3.558 4.955c-.762 0-1.376-.617-1.376-1.377 0-.758.614-1.375 1.376-1.375.76 0 1.376.617 1.376 1.375 0 .76-.617 1.377-1.376 1.377zm1.188 8.68H2.37V6h2.376v7.635zM14.816 0H1.18C.528 0 0 .516 0 1.153v13.694C0 15.484.528 16 1.18 16h13.635c.652 0 1.185-.516 1.185-1.153V1.153C16 .516 15.467 0 14.815 0z" fill-rule="nonzero"/></symbol> <symbol id="pinterest" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8 0C3.582 0 0 3.582 0 8c0 3.39 2.108 6.285 5.084 7.45-.07-.633-.133-1.604.028-2.295.146-.625.938-3.977.938-3.977s-.24-.48-.24-1.188c0-1.11.646-1.943 1.448-1.943.683 0 1.012.513 1.012 1.127 0 .687-.436 1.713-.662 2.664-.19.797.4 1.445 1.185 1.445 1.42 0 2.514-1.498 2.514-3.662 0-1.91-1.376-3.25-3.342-3.25-2.276 0-3.61 1.71-3.61 3.47 0 .69.263 1.43.593 1.83.066.08.075.15.057.23-.06.25-.196.8-.223.91-.035.15-.115.18-.268.11C3.516 10.46 2.89 9 2.89 7.82c0-2.52 1.834-4.84 5.287-4.84 2.774 0 4.932 1.98 4.932 4.62 0 2.76-1.74 4.98-4.16 4.98-.81 0-1.57-.42-1.84-.92l-.5 1.9c-.18.698-.67 1.57-1 2.1.75.23 1.54.357 2.37.357 4.41 0 8-3.58 8-8s-3.59-8-8-8z" fill-rule="nonzero"/></symbol> <symbol id="rss" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M12.8 16C12.8 8.978 7.022 3.2 0 3.2V0c8.777 0 16 7.223 16 16h-3.2zM2.194 11.61c1.21 0 2.195.985 2.195 2.196 0 1.21-.99 2.194-2.2 2.194C.98 16 0 15.017 0 13.806c0-1.21.983-2.195 2.194-2.195zM10.606 16h-3.11c0-4.113-3.383-7.497-7.496-7.497v-3.11c5.818 0 10.606 4.79 10.606 10.607z"/></symbol> <symbol id="stackoverflow" class="svg-icon" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M12.658 14.577v-4.27h1.423V16H1.23v-5.693h1.42v4.27h10.006zm-8.583-1.423h7.16V11.73h-7.16v1.424zm.173-3.235l6.987 1.46.3-1.38L4.55 8.54l-.302 1.38zm.906-3.37l6.47 3.02.602-1.3-6.47-3.02-.602 1.29zm1.81-3.19l5.478 4.57.906-1.08L7.87 2.28l-.9 1.078zM10.502 0L9.338.863l4.27 5.735 1.164-.862L10.5 0z"/></symbol> <symbol id="twitter" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M16 3.038c-.59.26-1.22.437-1.885.517.677-.407 1.198-1.05 1.443-1.816-.634.37-1.337.64-2.085.79-.598-.64-1.45-1.04-2.396-1.04-1.812 0-3.282 1.47-3.282 3.28 0 .26.03.51.085.75-2.728-.13-5.147-1.44-6.766-3.42C.83 2.58.67 3.14.67 3.75c0 1.14.58 2.143 1.46 2.732-.538-.017-1.045-.165-1.487-.41v.04c0 1.59 1.13 2.918 2.633 3.22-.276.074-.566.114-.865.114-.21 0-.41-.02-.61-.058.42 1.304 1.63 2.253 3.07 2.28-1.12.88-2.54 1.404-4.07 1.404-.26 0-.52-.015-.78-.045 1.46.93 3.18 1.474 5.04 1.474 6.04 0 9.34-5 9.34-9.33 0-.14 0-.28-.01-.42.64-.46 1.2-1.04 1.64-1.7z" fill-rule="nonzero"/></symbol> <symbol id="youtube" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M0 7.345c0-1.294.16-2.59.16-2.59s.156-1.1.636-1.587c.608-.637 1.408-.617 1.764-.684C3.84 2.36 8 2.324 8 2.324s3.362.004 5.6.166c.314.038.996.04 1.604.678.48.486.636 1.588.636 1.588S16 6.05 16 7.346v1.258c0 1.296-.16 2.59-.16 2.59s-.156 1.102-.636 1.588c-.608.638-1.29.64-1.604.678-2.238.162-5.6.166-5.6.166s-4.16-.037-5.44-.16c-.356-.067-1.156-.047-1.764-.684-.48-.487-.636-1.587-.636-1.587S0 9.9 0 8.605v-1.26zm6.348 2.73V5.58l4.323 2.255-4.32 2.24z"/></symbol> <symbol id="mastodon" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"> <path transform="scale(0.07)" d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915"/> <path transform="scale(0.07)" fill="#FFF" d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675"/> </symbol> </svg> ===================================================== == File: src/homepage/_site/assets/fonts/fontawesome-webfont.svg ===================================================== <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > <svg xmlns="http://www.w3.org/2000/svg"> <metadata></metadata> <defs> <font id="fontawesomeregular" horiz-adv-x="1536" > <font-face units-per-em="1792" ascent="1536" descent="-256" /> <missing-glyph horiz-adv-x="448" /> <glyph unicode=" " horiz-adv-x="448" /> <glyph unicode="	" horiz-adv-x="448" /> <glyph unicode=" " horiz-adv-x="448" /> <glyph unicode="¨" horiz-adv-x="1792" /> <glyph unicode="©" horiz-adv-x="1792" /> <glyph unicode="®" horiz-adv-x="1792" /> <glyph unicode="´" horiz-adv-x="1792" /> <glyph unicode="Æ" horiz-adv-x="1792" /> <glyph unicode="Ø" horiz-adv-x="1792" /> <glyph unicode=" " horiz-adv-x="768" /> <glyph unicode=" " horiz-adv-x="1537" /> <glyph unicode=" " horiz-adv-x="768" /> <glyph unicode=" " horiz-adv-x="1537" /> <glyph unicode=" " horiz-adv-x="512" /> <glyph unicode=" " horiz-adv-x="384" /> <glyph unicode=" " horiz-adv-x="256" /> <glyph unicode=" " horiz-adv-x="256" /> <glyph unicode=" " horiz-adv-x="192" /> <glyph unicode=" " horiz-adv-x="307" /> <glyph unicode=" " horiz-adv-x="85" /> <glyph unicode=" " horiz-adv-x="307" /> <glyph unicode=" " horiz-adv-x="384" /> <glyph unicode="™" horiz-adv-x="1792" /> <glyph unicode="∞" horiz-adv-x="1792" /> <glyph unicode="≠" horiz-adv-x="1792" /> <glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> <glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> <glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> <glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> <glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> <glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> <glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> <glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> <glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> <glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> <glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> <glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> <glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> <glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> <glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> <glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> <glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> ===================================================== == File: src/homepage/_site/assets/js/main.js ===================================================== /* Stellar by HTML5 UP html5up.net | @ajlkn Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) */ (function($) { skel.breakpoints({ xlarge: '(max-width: 1680px)', large: '(max-width: 1280px)', medium: '(max-width: 980px)', small: '(max-width: 736px)', xsmall: '(max-width: 480px)', xxsmall: '(max-width: 360px)' }); $(function() { var $window = $(window), $body = $('body'), $main = $('#main'); // Disable animations/transitions until the page has loaded. $body.addClass('is-loading'); $window.on('load', function() { window.setTimeout(function() { $body.removeClass('is-loading'); }, 100); }); // Fix: Placeholder polyfill. $('form').placeholder(); // Prioritize "important" elements on medium. skel.on('+medium -medium', function() { $.prioritize( '.important\\28 medium\\29', skel.breakpoint('medium').active ); }); // Nav. var $nav = $('#nav'); if ($nav.length > 0) { // Shrink effect. $main ===================================================== == File: src/homepage/_site/assets/js/github-fetch.js ===================================================== let repositoryInfo = {}; let allContributors = []; const repositoryUrl = "https://api.github.com/repos/apache/james-project"; function getAllCollaborators(callback) { if (allContributors.length > 0) { callback(allContributors); } else { $.get(repositoryInfo.contributors_url, function(contributors) { allContributors = contributors; callback(contributors); }); } } function getListContributorDom(contributors) { let list = ""; contributors.sort(function(a, b){ if(a.login.toLowerCase() < b.login.toLowerCase()) return -1; if(a.login.toLowerCase() > b.login.toLowerCase()) return 1; return 0; }); for (contributor of contributors) { list += `<li class="contributor-card"><a href="` + contributor.html_url + `" alt="` + contributor.login + ` github account"><span class="image contributor-avatar"><img src="` + contributor.avatar_url + `"></span><span class="icon fa-github"></span>` + contributor.login + `</a></li>`; } return list; } function getTotalCommit(callback) { $.get("https://api.github.com/repos/apache/james-project/stats/commit_activity", function(data) { let total = 0; for(week of data) { total += week.total; } callback(total); }); } $(document).ready(function () { $.get(repositoryUrl, function(repository) { repositoryInfo = repository; getAllCollaborators(function(collabs) { $('#contributor-num').append(collabs.length); let contributors = getListContributorDom(collabs); $('#contributor-list').append(contributors); }); getTotalCommit(function(commits) { $('#commit-num').append(commits); }); $('#fork-num').append(repositoryInfo.forks_count); ===================================================== == File: src/homepage/_site/assets/js/jquery.min.js ===================================================== /*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){ return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ub," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m}); ===================================================== == File: src/homepage/_site/assets/js/lightbox.js ===================================================== /*! * Lightbox v2.8.2 * by Lokesh Dhakar * * More info: * http://lokeshdhakar.com/projects/lightbox2/ * * Copyright 2007, 2015 Lokesh Dhakar * Released under the MIT license * https://github.com/lokesh/lightbox2/blob/master/LICENSE */ // Uses Node, AMD or browser globals to create a module. (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(require('jquery')); } else { // Browser globals (root is window) root.lightbox = factory(root.jQuery); } }(this, function ($) { function Lightbox(options) { this.album = []; this.currentImageIndex = void 0; this.init(); // options this.options = $.extend({}, this.constructor.defaults); this.option(options); } // Descriptions of all options available on the demo site: // http://lokeshdhakar.com/projects/lightbox2/index.html#options Lightbox.defaults = { albumLabel: 'Image %1 of %2', alwaysShowNavOnTouchDevices: false, fadeDuration: 500, fitImagesInViewport: true, // maxWidth: 800, // maxHeight: 600, positionFromTop: 50, resizeDuration: 700, showImageNumberLabel: true, ===================================================== == File: src/homepage/_site/assets/js/ie/PIE.htc ===================================================== <!-- PIE: CSS3 rendering for IE Version 1.0.0 http://css3pie.com Dual-licensed for use under the Apache License Version 2.0 or the General Public License (GPL) Version 2. --> <PUBLIC:COMPONENT lightWeight="true"> <!-- saved from url=(0014)about:internet --> <PUBLIC:ATTACH EVENT="oncontentready" FOR="element" ONEVENT="init()" /> <PUBLIC:ATTACH EVENT="ondocumentready" FOR="element" ONEVENT="init()" /> <PUBLIC:ATTACH EVENT="ondetach" FOR="element" ONEVENT="cleanup()" /> <script type="text/javascript"> var doc = element.document;var f=window.PIE; if(!f){f=window.PIE={F:"-pie-",nb:"Pie",La:"pie_",Ac:{TD:1,TH:1},cc:{TABLE:1,THEAD:1,TBODY:1,TFOOT:1,TR:1,INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,IMG:1,HR:1},fc:{A:1,INPUT:1,TEXTAREA:1,SELECT:1,BUTTON:1},Gd:{submit:1,button:1,reset:1},aa:function(){}};try{doc.execCommand("BackgroundImageCache",false,true)}catch(aa){}for(var ba=4,Z=doc.createElement("div"),ca=Z.getElementsByTagName("i"),ga;Z.innerHTML="<!--[if gt IE "+ ++ba+"]><i></i><![endif]--\>",ca[0];);f.O=ba;if(ba===6)f.F=f.F.replace(/^-/,"");f.ja= doc.documentMode||f.O;Z.innerHTML='<v:shape adj="1"/>';ga=Z.firstChild;ga.style.behavior="url(#default#VML)";f.zc=typeof ga.adj==="object";(function(){var a,b=0,c={};f.p={Za:function(d){if(!a){a=doc.createDocumentFragment();a.namespaces.add("css3vml","urn:schemas-microsoft-com:vml")}return a.createElement("css3vml:"+d)},Ba:function(d){return d&&d._pieId||(d._pieId="_"+ ++b)},Eb:function(d){var e,g,j,i,h=arguments;e=1;for(g=h.length;e<g;e++){i=h[e];for(j in i)if(i.hasOwnProperty(j))d[j]=i[j]}return d}, Rb:function(d,e,g){var j=c[d],i,h;if(j)Object.prototype.toString.call(j)==="[object Array]"?j.push([e,g]):e.call(g,j);else{h=c[d]=[[e,g]];i=new Image;i.onload=function(){j=c[d]={h:i.width,f:i.height};for(var k=0,n=h.length;k<n;k++)h[k][0].call(h[k][1],j);i.onload=null};i.src=d}}}})();f.Na={gc:function(a,b,c,d){function e(){k=j>=90&&j<270?b:0;n=j<180?c:0;m=b-k;p=c-n}function g(){for(;j<0;)j+=360;j%=360}var j=d.sa;d=d.zb;var i,h,k,n,m,p,r,t;if(d){d=d.coords(a,b,c);i=d.x;h=d.y}if(j){j=j.jd();g();e(); if(!d){i=k;h=n}d=f.Na.tc(i,h,j,m,p);a=d[0];d=d[1]}else if(d){a=b-i;d=c-h}else{i=h=a=0;d=c}r=a-i;t=d-h;if(j===void 0){j=!r?t<0?90:270:!t?r<0?180:0:-Math.atan2(t,r)/Math.PI*180;g();e()}return{sa:j,xc:i,yc:h,td:a,ud:d,Wd:k,Xd:n,rd:m,sd:p,kd:r,ld:t,rc:f.Na.dc(i,h,a,d)}},tc:function(a,b,c,d,e){if(c===0||c===180)return[d,b];else if(c===90||c===270)return[a,e];else{c=Math.tan(-c*Math.PI/180);a=c*a-b;b=-1/c;d=b*d-e;e=b-c;return[(d-a)/e,(c*d-b*a)/e]}},dc:function(a,b,c,d){a=c-a;b=d-b;return Math.abs(a===0? b:b===0?a:Math.sqrt(a*a+b*b))}};f.ea=function(){this.Gb=[];this.oc={}};f.ea.prototype={ba:function(a){var b=f.p.Ba(a),c=this.oc,d=this.Gb;if(!(b in c)){c[b]=d.length;d.push(a)}},Ha:function(a){a=f.p.Ba(a);var b=this.oc;if(a&&a in b){delete this.Gb[b[a]];delete b[a]}},xa:function(){for(var a=this.Gb,b=a.length;b--;)a[b]&&a[b]()}};f.Oa=new f.ea;f.Oa.Rd=function(){var a=this,b;if(!a.Sd){b=doc.documentElement.currentStyle.getAttribute(f.F+"poll-interval")||250;(function c(){a.xa();setTimeout(c,b)})(); a.Sd=1}};(function(){function a(){f.L.xa();window.detachEvent("onunload",a);window.PIE=null}f.L=new f.ea;window.attachEvent("onunload",a);f.L.ta=function(b,c,d){b.attachEvent(c,d);this.ba(function(){b.detachEvent(c,d)})}})();f.Qa=new f.ea;f.L.ta(window,"onresize",function(){f.Qa.xa()});(function(){function a(){f.mb.xa()}f.mb=new f.ea;f.L.ta(window,"onscroll",a);f.Qa.ba(a)})();(function(){function a(){c=f.kb.md()}function b(){if(c){for(var d=0,e=c.length;d<e;d++)f.attach(c[d]);c=0}}var c;if(f.ja<9){f.L.ta(window, "onbeforeprint",a);f.L.ta(window,"onafterprint",b)}})();f.lb=new f.ea;f.L.ta(doc,"onmouseup",function(){f.lb.xa()});f.he=function(){function a(h){this.Y=h}var b=doc.createElement("length-calc"),c=doc.body||doc.documentElement,d=b.style,e={},g=["mm","cm","in","pt","pc"],j=g.length,i={};d.position="absolute";d.top=d.left="-9999px";for(c.appendChild(b);j--;){d.width="100"+g[j];e[g[j]]=b.offsetWidth/100}c.removeChild(b);d.width="1em";a.prototype={Kb:/(px|em|ex|mm|cm|in|pt|pc|%)$/,ic:function(){var h= this.Jd;if(h===void 0)h=this.Jd=parseFloat(this.Y);return h},yb:function(){var h=this.ae;if(!h)h=this.ae=(h=this.Y.match(this.Kb))&&h[0]||"px";return h},a:function(h,k){var n=this.ic(),m=this.yb();switch(m){case "px":return n;case "%":return n*(typeof k==="function"?k():k)/100;case "em":return n*this.xb(h);case "ex":return n*this.xb(h)/2;default:return n*e[m]}},xb:function(h){var k=h.currentStyle.fontSize,n,m;if(k.indexOf("px")>0)return parseFloat(k);else if(h.tagName in f.cc){m=this;n=h.parentNode; return f.n(k).a(n,function(){return m.xb(n)})}else{h.appendChild(b);k=b.offsetWidth;b.parentNode===h&&h.removeChild(b);return k}}};f.n=function(h){return i[h]||(i[h]=new a(h))};return a}();f.Ja=function(){function a(e){this.X=e}var b=f.n("50%"),c={top:1,center:1,bottom:1},d={left:1,center:1,right:1};a.prototype={zd:function(){if(!this.ac){var e=this.X,g=e.length,j=f.v,i=j.qa,h=f.n("0");i=i.na;h=["left",h,"top",h];if(g===1){e.push(new j.ob(i,"center"));g++}if(g===2){i&(e[0].k|e[1].k)&&e[0].d in c&& e[1].d in d&&e.push(e.shift());if(e[0].k&i)if(e[0].d==="center")h[1]=b;else h[0]=e[0].d;else if(e[0].W())h[1]=f.n(e[0].d);if(e[1].k&i)if(e[1].d==="center")h[3]=b;else h[2]=e[1].d;else if(e[1].W())h[3]=f.n(e[1].d)}this.ac=h}return this.ac},coords:function(e,g,j){var i=this.zd(),h=i[1].a(e,g);e=i[3].a(e,j);return{x:i[0]==="right"?g-h:h,y:i[2]==="bottom"?j-e:e}}};return a}();f.Ka=function(){function a(b,c){this.h=b;this.f=c}a.prototype={a:function(b,c,d,e,g){var j=this.h,i=this.f,h=c/d;e=e/g;if(j=== "contain"){j=e>h?c:d*e;i=e>h?c/e:d}else if(j==="cover"){j=e<h?c:d*e;i=e<h?c/e:d}else if(j==="auto"){i=i==="auto"?g:i.a(b,d);j=i*e}else{j=j.a(b,c);i=i==="auto"?j/e:i.a(b,d)}return{h:j,f:i}}};a.Kc=new a("auto","auto");return a}();f.Ec=function(){function a(b){this.Y=b}a.prototype={Kb:/[a-z]+$/i,yb:function(){return this.ad||(this.ad=this.Y.match(this.Kb)[0].toLowerCase())},jd:function(){var b=this.Vc,c;if(b===undefined){b=this.yb();c=parseFloat(this.Y,10);b=this.Vc=b==="deg"?c:b==="rad"?c/Math.PI*180: b==="grad"?c/400*360:b==="turn"?c*360:0}return b}};return a}();f.Jc=function(){function a(c){this.Y=c}var b={};a.Qd=/\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d+|\d*\.\d+)\s*\)\s*/;a.Fb={aliceblue:"F0F8FF",antiquewhite:"FAEBD7",aqua:"0FF",aquamarine:"7FFFD4",azure:"F0FFFF",beige:"F5F5DC",bisque:"FFE4C4",black:"000",blanchedalmond:"FFEBCD",blue:"00F",blueviolet:"8A2BE2",brown:"A52A2A",burlywood:"DEB887",cadetblue:"5F9EA0",chartreuse:"7FFF00",chocolate:"D2691E",coral:"FF7F50",cornflowerblue:"6495ED", cornsilk:"FFF8DC",crimson:"DC143C",cyan:"0FF",darkblue:"00008B",darkcyan:"008B8B",darkgoldenrod:"B8860B",darkgray:"A9A9A9",darkgreen:"006400",darkkhaki:"BDB76B",darkmagenta:"8B008B",darkolivegreen:"556B2F",darkorange:"FF8C00",darkorchid:"9932CC",darkred:"8B0000",darksalmon:"E9967A",darkseagreen:"8FBC8F",darkslateblue:"483D8B",darkslategray:"2F4F4F",darkturquoise:"00CED1",darkviolet:"9400D3",deeppink:"FF1493",deepskyblue:"00BFFF",dimgray:"696969",dodgerblue:"1E90FF",firebrick:"B22222",floralwhite:"FFFAF0", forestgreen:"228B22",fuchsia:"F0F",gainsboro:"DCDCDC",ghostwhite:"F8F8FF",gold:"FFD700",goldenrod:"DAA520",gray:"808080",green:"008000",greenyellow:"ADFF2F",honeydew:"F0FFF0",hotpink:"FF69B4",indianred:"CD5C5C",indigo:"4B0082",ivory:"FFFFF0",khaki:"F0E68C",lavender:"E6E6FA",lavenderblush:"FFF0F5",lawngreen:"7CFC00",lemonchiffon:"FFFACD",lightblue:"ADD8E6",lightcoral:"F08080",lightcyan:"E0FFFF",lightgoldenrodyellow:"FAFAD2",lightgreen:"90EE90",lightgrey:"D3D3D3",lightpink:"FFB6C1",lightsalmon:"FFA07A", lightseagreen:"20B2AA",lightskyblue:"87CEFA",lightslategray:"789",lightsteelblue:"B0C4DE",lightyellow:"FFFFE0",lime:"0F0",limegreen:"32CD32",linen:"FAF0E6",magenta:"F0F",maroon:"800000",mediumauqamarine:"66CDAA",mediumblue:"0000CD",mediumorchid:"BA55D3",mediumpurple:"9370D8",mediumseagreen:"3CB371",mediumslateblue:"7B68EE",mediumspringgreen:"00FA9A",mediumturquoise:"48D1CC",mediumvioletred:"C71585",midnightblue:"191970",mintcream:"F5FFFA",mistyrose:"FFE4E1",moccasin:"FFE4B5",navajowhite:"FFDEAD", navy:"000080",oldlace:"FDF5E6",olive:"808000",olivedrab:"688E23",orange:"FFA500",orangered:"FF4500",orchid:"DA70D6",palegoldenrod:"EEE8AA",palegreen:"98FB98",paleturquoise:"AFEEEE",palevioletred:"D87093",papayawhip:"FFEFD5",peachpuff:"FFDAB9",peru:"CD853F",pink:"FFC0CB",plum:"DDA0DD",powderblue:"B0E0E6",purple:"800080",red:"F00",rosybrown:"BC8F8F",royalblue:"4169E1",saddlebrown:"8B4513",salmon:"FA8072",sandybrown:"F4A460",seagreen:"2E8B57",seashell:"FFF5EE",sienna:"A0522D",silver:"C0C0C0",skyblue:"87CEEB", slateblue:"6A5ACD",slategray:"708090",snow:"FFFAFA",springgreen:"00FF7F",steelblue:"4682B4",tan:"D2B48C",teal:"008080",thistle:"D8BFD8",tomato:"FF6347",turquoise:"40E0D0",violet:"EE82EE",wheat:"F5DEB3",white:"FFF",whitesmoke:"F5F5F5",yellow:"FF0",yellowgreen:"9ACD32"};a.prototype={parse:function(){if(!this.Ua){var c=this.Y,d;if(d=c.match(a.Qd)){this.Ua="rgb("+d[1]+","+d[2]+","+d[3]+")";this.Yb=parseFloat(d[4])}else{if((d=c.toLowerCase())in a.Fb)c="#"+a.Fb[d];this.Ua=c;this.Yb=c==="transparent"?0: 1}}},U:function(c){this.parse();return this.Ua==="currentColor"?c.currentStyle.color:this.Ua},fa:function(){this.parse();return this.Yb}};f.ha=function(c){return b[c]||(b[c]=new a(c))};return a}();f.v=function(){function a(c){this.$a=c;this.ch=0;this.X=[];this.Ga=0}var b=a.qa={Ia:1,Wb:2,z:4,Lc:8,Xb:16,na:32,K:64,oa:128,pa:256,Ra:512,Tc:1024,URL:2048};a.ob=function(c,d){this.k=c;this.d=d};a.ob.prototype={Ca:function(){return this.k&b.K||this.k&b.oa&&this.d==="0"},W:function(){return this.Ca()||this.k& b.Ra}};a.prototype={de:/\s/,Kd:/^[\+\-]?(\d*\.)?\d+/,url:/^url\(\s*("([^"]*)"|'([^']*)'|([!#$%&*-~]*))\s*\)/i,nc:/^\-?[_a-z][\w-]*/i,Yd:/^("([^"]*)"|'([^']*)')/,Bd:/^#([\da-f]{6}|[\da-f]{3})/i,be:{px:b.K,em:b.K,ex:b.K,mm:b.K,cm:b.K,"in":b.K,pt:b.K,pc:b.K,deg:b.Ia,rad:b.Ia,grad:b.Ia},fd:{rgb:1,rgba:1,hsl:1,hsla:1},next:function(c){function d(p,r){p=new a.ob(p,r);if(!c){k.X.push(p);k.Ga++}return p}function e(){k.Ga++;return null}var g,j,i,h,k=this;if(this.Ga<this.X.length)return this.X[this.Ga++];for(;this.de.test(this.$a.charAt(this.ch));)this.ch++; if(this.ch>=this.$a.length)return e();j=this.ch;g=this.$a.substring(this.ch);i=g.charAt(0);switch(i){case "#":if(h=g.match(this.Bd)){this.ch+=h[0].length;return d(b.z,h[0])}break;case '"':case "'":if(h=g.match(this.Yd)){this.ch+=h[0].length;return d(b.Tc,h[2]||h[3]||"")}break;case "/":case ",":this.ch++;return d(b.pa,i);case "u":if(h=g.match(this.url)){this.ch+=h[0].length;return d(b.URL,h[2]||h[3]||h[4]||"")}}if(h=g.match(this.Kd)){i=h[0];this.ch+=i.length;if(g.charAt(i.length)==="%"){this.ch++; return d(b.Ra,i+"%")}if(h=g.substring(i.length).match(this.nc)){i+=h[0];this.ch+=h[0].length;return d(this.be[h[0].toLowerCase()]||b.Lc,i)}return d(b.oa,i)}if(h=g.match(this.nc)){i=h[0];this.ch+=i.length;if(i.toLowerCase()in f.Jc.Fb||i==="currentColor"||i==="transparent")return d(b.z,i);if(g.charAt(i.length)==="("){this.ch++;if(i.toLowerCase()in this.fd){g=function(p){return p&&p.k&b.oa};h=function(p){return p&&p.k&(b.oa|b.Ra)};var n=function(p,r){return p&&p.d===r},m=function(){return k.next(1)}; if((i.charAt(0)==="r"?h(m()):g(m()))&&n(m(),",")&&h(m())&&n(m(),",")&&h(m())&&(i==="rgb"||i==="hsa"||n(m(),",")&&g(m()))&&n(m(),")"))return d(b.z,this.$a.substring(j,this.ch));return e()}return d(b.Xb,i)}return d(b.na,i)}this.ch++;return d(b.Wb,i)},D:function(){return this.X[this.Ga-- -2]},all:function(){for(;this.next(););return this.X},ma:function(c,d){for(var e=[],g,j;g=this.next();){if(c(g)){j=true;this.D();break}e.push(g)}return d&&!j?null:e}};return a}();var ha=function(a){this.e=a};ha.prototype= {Z:0,Od:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.x!==b.x||a.y!==b.y)},Td:function(){var a=this.qb,b;return!a||(b=this.o())&&(a.h!==b.h||a.f!==b.f)},hc:function(){var a=this.e,b=a.getBoundingClientRect(),c=f.ja===9,d=f.O===7,e=b.right-b.left;return{x:b.left,y:b.top,h:c||d?a.offsetWidth:e,f:c||d?a.offsetHeight:b.bottom-b.top,Hd:d&&e?a.offsetWidth/e:1}},o:function(){return this.Z?this.Va||(this.Va=this.hc()):this.hc()},Ad:function(){return!!this.qb},cb:function(){++this.Z},hb:function(){if(!--this.Z){if(this.Va)this.qb= this.Va;this.Va=null}}};(function(){function a(b){var c=f.p.Ba(b);return function(){if(this.Z){var d=this.$b||(this.$b={});return c in d?d[c]:(d[c]=b.call(this))}else return b.call(this)}}f.B={Z:0,ka:function(b){function c(d){this.e=d;this.Zb=this.ia()}f.p.Eb(c.prototype,f.B,b);c.$c={};return c},j:function(){var b=this.ia(),c=this.constructor.$c;return b?b in c?c[b]:(c[b]=this.la(b)):null},ia:a(function(){var b=this.e,c=this.constructor,d=b.style;b=b.currentStyle;var e=this.wa,g=this.Fa,j=c.Yc||(c.Yc= f.F+e);c=c.Zc||(c.Zc=f.nb+g.charAt(0).toUpperCase()+g.substring(1));return d[c]||b.getAttribute(j)||d[g]||b.getAttribute(e)}),i:a(function(){return!!this.j()}),H:a(function(){var b=this.ia(),c=b!==this.Zb;this.Zb=b;return c}),va:a,cb:function(){++this.Z},hb:function(){--this.Z||delete this.$b}}})();f.Sb=f.B.ka({wa:f.F+"background",Fa:f.nb+"Background",cd:{scroll:1,fixed:1,local:1},fb:{"repeat-x":1,"repeat-y":1,repeat:1,"no-repeat":1},sc:{"padding-box":1,"border-box":1,"content-box":1},Pd:{top:1,right:1, bottom:1,left:1,center:1},Ud:{contain:1,cover:1},eb:{Ma:"backgroundClip",z:"backgroundColor",da:"backgroundImage",Pa:"backgroundOrigin",S:"backgroundPosition",T:"backgroundRepeat",Sa:"backgroundSize"},la:function(a){function b(s){return s&&s.W()||s.k&k&&s.d in t}function c(s){return s&&(s.W()&&f.n(s.d)||s.d==="auto"&&"auto")}var d=this.e.currentStyle,e,g,j,i=f.v.qa,h=i.pa,k=i.na,n=i.z,m,p,r=0,t=this.Pd,v,l,q={M:[]};if(this.wb()){e=new f.v(a);for(j={};g=e.next();){m=g.k;p=g.d;if(!j.P&&m&i.Xb&&p=== "linear-gradient"){v={ca:[],P:p};for(l={};g=e.next();){m=g.k;p=g.d;if(m&i.Wb&&p===")"){l.color&&v.ca.push(l);v.ca.length>1&&f.p.Eb(j,v);break}if(m&n){if(v.sa||v.zb){g=e.D();if(g.k!==h)break;e.next()}l={color:f.ha(p)};g=e.next();if(g.W())l.db=f.n(g.d);else e.D()}else if(m&i.Ia&&!v.sa&&!l.color&&!v.ca.length)v.sa=new f.Ec(g.d);else if(b(g)&&!v.zb&&!l.color&&!v.ca.length){e.D();v.zb=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&h&&p===","){if(l.color){v.ca.push(l);l={}}}else break}}else if(!j.P&& m&i.URL){j.Ab=p;j.P="image"}else if(b(g)&&!j.$){e.D();j.$=new f.Ja(e.ma(function(s){return!b(s)},false))}else if(m&k)if(p in this.fb&&!j.bb)j.bb=p;else if(p in this.sc&&!j.Wa){j.Wa=p;if((g=e.next())&&g.k&k&&g.d in this.sc)j.ub=g.d;else{j.ub=p;e.D()}}else if(p in this.cd&&!j.bc)j.bc=p;else return null;else if(m&n&&!q.color)q.color=f.ha(p);else if(m&h&&p==="/"&&!j.Xa&&j.$){g=e.next();if(g.k&k&&g.d in this.Ud)j.Xa=new f.Ka(g.d);else if(g=c(g)){m=c(e.next());if(!m){m=g;e.D()}j.Xa=new f.Ka(g,m)}else return null}else if(m& h&&p===","&&j.P){j.Hb=a.substring(r,e.ch-1);r=e.ch;q.M.push(j);j={}}else return null}if(j.P){j.Hb=a.substring(r);q.M.push(j)}}else this.Bc(f.ja<9?function(){var s=this.eb,o=d[s.S+"X"],u=d[s.S+"Y"],x=d[s.da],y=d[s.z];if(y!=="transparent")q.color=f.ha(y);if(x!=="none")q.M=[{P:"image",Ab:(new f.v(x)).next().d,bb:d[s.T],$:new f.Ja((new f.v(o+" "+u)).all())}]}:function(){var s=this.eb,o=/\s*,\s*/,u=d[s.da].split(o),x=d[s.z],y,z,B,E,D,C;if(x!=="transparent")q.color=f.ha(x);if((E=u.length)&&u[0]!=="none"){x= d[s.T].split(o);y=d[s.S].split(o);z=d[s.Pa].split(o);B=d[s.Ma].split(o);s=d[s.Sa].split(o);q.M=[];for(o=0;o<E;o++)if((D=u[o])&&D!=="none"){C=s[o].split(" ");q.M.push({Hb:D+" "+x[o]+" "+y[o]+" / "+s[o]+" "+z[o]+" "+B[o],P:"image",Ab:(new f.v(D)).next().d,bb:x[o],$:new f.Ja((new f.v(y[o])).all()),Wa:z[o],ub:B[o],Xa:new f.Ka(C[0],C[1])})}}});return q.color||q.M[0]?q:null},Bc:function(a){var b=f.ja>8,c=this.eb,d=this.e.runtimeStyle,e=d[c.da],g=d[c.z],j=d[c.T],i,h,k,n;if(e)d[c.da]="";if(g)d[c.z]="";if(j)d[c.T]= "";if(b){i=d[c.Ma];h=d[c.Pa];n=d[c.S];k=d[c.Sa];if(i)d[c.Ma]="";if(h)d[c.Pa]="";if(n)d[c.S]="";if(k)d[c.Sa]=""}a=a.call(this);if(e)d[c.da]=e;if(g)d[c.z]=g;if(j)d[c.T]=j;if(b){if(i)d[c.Ma]=i;if(h)d[c.Pa]=h;if(n)d[c.S]=n;if(k)d[c.Sa]=k}return a},ia:f.B.va(function(){return this.wb()||this.Bc(function(){var a=this.e.currentStyle,b=this.eb;return a[b.z]+" "+a[b.da]+" "+a[b.T]+" "+a[b.S+"X"]+" "+a[b.S+"Y"]})}),wb:f.B.va(function(){var a=this.e;return a.style[this.Fa]||a.currentStyle.getAttribute(this.wa)}), qc:function(){var a=0;if(f.O<7){a=this.e;a=""+(a.style[f.nb+"PngFix"]||a.currentStyle.getAttribute(f.F+"png-fix"))==="true"}return a},i:f.B.va(function(){return(this.wb()||this.qc())&&!!this.j()})});f.Vb=f.B.ka({wc:["Top","Right","Bottom","Left"],Id:{thin:"1px",medium:"3px",thick:"5px"},la:function(){var a={},b={},c={},d=false,e=true,g=true,j=true;this.Cc(function(){for(var i=this.e.currentStyle,h=0,k,n,m,p,r,t,v;h<4;h++){m=this.wc[h];v=m.charAt(0).toLowerCase();k=b[v]=i["border"+m+"Style"];n=i["border"+ m+"Color"];m=i["border"+m+"Width"];if(h>0){if(k!==p)g=false;if(n!==r)e=false;if(m!==t)j=false}p=k;r=n;t=m;c[v]=f.ha(n);m=a[v]=f.n(b[v]==="none"?"0":this.Id[m]||m);if(m.a(this.e)>0)d=true}});return d?{J:a,Zd:b,gd:c,ee:j,hd:e,$d:g}:null},ia:f.B.va(function(){var a=this.e,b=a.currentStyle,c;a.tagName in f.Ac&&a.offsetParent.currentStyle.borderCollapse==="collapse"||this.Cc(function(){c=b.borderWidth+"|"+b.borderStyle+"|"+b.borderColor});return c}),Cc:function(a){var b=this.e.runtimeStyle,c=b.borderWidth, d=b.borderColor;if(c)b.borderWidth="";if(d)b.borderColor="";a=a.call(this);if(c)b.borderWidth=c;if(d)b.borderColor=d;return a}});(function(){f.jb=f.B.ka({wa:"border-radius",Fa:"borderRadius",la:function(b){var c=null,d,e,g,j,i=false;if(b){e=new f.v(b);var h=function(){for(var k=[],n;(g=e.next())&&g.W();){j=f.n(g.d);n=j.ic();if(n<0)return null;if(n>0)i=true;k.push(j)}return k.length>0&&k.length<5?{tl:k[0],tr:k[1]||k[0],br:k[2]||k[0],bl:k[3]||k[1]||k[0]}:null};if(b=h()){if(g){if(g.k&f.v.qa.pa&&g.d=== "/")d=h()}else d=b;if(i&&b&&d)c={x:b,y:d}}}return c}});var a=f.n("0");a={tl:a,tr:a,br:a,bl:a};f.jb.Dc={x:a,y:a}})();f.Ub=f.B.ka({wa:"border-image",Fa:"borderImage",fb:{stretch:1,round:1,repeat:1,space:1},la:function(a){var b=null,c,d,e,g,j,i,h=0,k=f.v.qa,n=k.na,m=k.oa,p=k.Ra;if(a){c=new f.v(a);b={};for(var r=function(l){return l&&l.k&k.pa&&l.d==="/"},t=function(l){return l&&l.k&n&&l.d==="fill"},v=function(){g=c.ma(function(l){return!(l.k&(m|p))});if(t(c.next())&&!b.fill)b.fill=true;else c.D();if(r(c.next())){h++; j=c.ma(function(l){return!l.W()&&!(l.k&n&&l.d==="auto")});if(r(c.next())){h++;i=c.ma(function(l){return!l.Ca()})}}else c.D()};a=c.next();){d=a.k;e=a.d;if(d&(m|p)&&!g){c.D();v()}else if(t(a)&&!b.fill){b.fill=true;v()}else if(d&n&&this.fb[e]&&!b.repeat){b.repeat={f:e};if(a=c.next())if(a.k&n&&this.fb[a.d])b.repeat.Ob=a.d;else c.D()}else if(d&k.URL&&!b.src)b.src=e;else return null}if(!b.src||!g||g.length<1||g.length>4||j&&j.length>4||h===1&&j.length<1||i&&i.length>4||h===2&&i.length<1)return null;if(!b.repeat)b.repeat= ===================================================== == File: src/homepage/_site/assets/js/ie/respond.min.js ===================================================== /*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2014 Scott Jehl * Licensed under MIT * http://j.mp/respondjs */ !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this); ===================================================== == File: src/homepage/_site/assets/js/ie/html5shiv.js ===================================================== /* HTML5 Shiv v3.6.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */ (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}</style>"; c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment(); for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document); ===================================================== == File: src/homepage/_site/assets/js/jquery.scrolly.min.js ===================================================== /* jquery.scrolly v1.0.0-dev | (c) @ajlkn | MIT licensed */ (function(e){function u(s,o){var u,a,f;if((u=e(s))[t]==0)return n;a=u[i]()[r];switch(o.anchor){case"middle":f=a-(e(window).height()-u.outerHeight())/2;break;default:case r:f=Math.max(a,0)}return typeof o[i]=="function"?f-=o[i]():f-=o[i],f}var t="length",n=null,r="top",i="offset",s="click.scrolly",o=e(window);e.fn.scrolly=function(i){var o,a,f,l,c=e(this);if(this[t]==0)return c;if(this[t]>1){for(o=0;o<this[t];o++)e(this[o]).scrolly(i);return c}l=n,f=c.attr("href");if(f.charAt(0)!="#"||f[t]<2)return c;a=jQuery.extend({anchor:r,easing:"swing",offset:0,parent:e("body,html"),pollOnce:!1,speed:1e3},i),a.pollOnce&&(l=u(f,a)),c.off(s).on(s,function(e){var t=l!==n?l:u(f,a);t!==n&&(e.preventDefault(),a.parent.stop().animate({scrollTop:t},a.speed,a.easing))})}})(jQuery); ===================================================== == File: src/homepage/_site/assets/js/skel.min.js ===================================================== /* skel.js v3.0.1 | (c) skel.io | MIT licensed */ var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),Array.prototype.indexOf?t.indexOf=function(t,e){return t.indexOf(e)}:t.indexOf=function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},Array.isArray?t.isArray=function(t){return Array.isArray(t)}:t.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},Object.keys?t.iterate=function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:t.iterate=function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},window.matchMedia?t.matchesMedia=function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?t.matchesMedia=function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?t.matchesMedia=function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:t.matchesMedia=function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;for(i=t.split(/\s+and\s+/),e=0;e<i.length;e++)n=i[e],"("==n.charAt(0)&&(n=n.substring(1,n.length-1),a=n.split(/:\s+/),2==a.length&&(r[a[0].replace(/^\s+|\s+$/g,"")]=parseInt(a[1]),o=!0));if(!o)return!1;var s=document.documentElement.clientWidth,c=document.documentElement.clientHeight;return null!==r["min-width"]&&s<r["min-width"]||null!==r["max-width"]&&s>r["max-width"]||null!==r["min-height"]&&c<r["min-height"]||null!==r["max-height"]&&c>r["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML=' <style type="text/css">'+t+"</style>",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel}); ===================================================== == File: src/homepage/_site/assets/js/lity.min.js ===================================================== /*! Lity - v2.2.2 - 2016-12-14 * http://sorgalla.com/lity/ * Copyright (c) 2015-2016 Jan Sorgalla; Licensed MIT */ !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(c){return b(a,c)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=b(a,require("jquery")):a.lity=b(a,a.jQuery||a.Zepto)}("undefined"!=typeof window?window:this,function(a,b){"use strict";function c(a){var b=B();return N&&a.length?(a.one(N,b.resolve),setTimeout(b.resolve,500)):b.resolve(),b.promise()}function d(a,c,d){if(1===arguments.length)return b.extend({},a);if("string"==typeof c){if("undefined"==typeof d)return"undefined"==typeof a[c]?null:a[c];a[c]=d}else b.extend(a,c);return this}function e(a){for(var b,c=decodeURI(a.split("#")[0]).split("&"),d={},e=0,f=c.length;e<f;e++)c[e]&&(b=c[e].split("="),d[b[0]]=b[1]);return d}function f(a,c){return a+(a.indexOf("?")>-1?"&":"?")+b.param(c)}function g(a,b){var c=a.indexOf("#");return-1===c?b:(c>0&&(a=a.substr(c)),b+a)}function h(a){return b('<span class="lity-error"/>').append(a)}function i(a,c){var d=c.opener()&&c.opener().data("lity-desc")||"Image with no description",e=b('<img src="'+a+'" alt="'+d+'"/>'),f=B(),g=function(){f.reject(h("Failed loading image"))};return e.on("load",function(){return 0===this.naturalWidth?g():void f.resolve(e)}).on("error",g),f.promise()}function j(a,c){var d,e,f;try{d=b(a)}catch(a){return!1}return!!d.length&&(e=b('<i style="display:none !important"/>'),f=d.hasClass("lity-hide"),c.element().one("lity:remove",function(){e.before(d).remove(),f&&!d.closest(".lity-content").length&&d.addClass("lity-hide")}),d.removeClass("lity-hide").after(e))}function k(a){var c=J.exec(a);return!!c&&o(g(a,f("https://www.youtube"+(c[2]||"")+".com/embed/"+c[4],b.extend({autoplay:1},e(c[5]||"")))))}function l(a){var c=K.exec(a);return!!c&&o(g(a,f("https://player.vimeo.com/video/"+c[3],b.extend({autoplay:1},e(c[4]||"")))))}function m(a){var c=M.exec(a);return!!c&&(0!==a.indexOf("http")&&(a="https:"+a),o(g(a,f("https://www.facebook.com/plugins/video.php?href="+a,b.extend({autoplay:1},e(c[4]||""))))))}function n(a){var b=L.exec(a);return!!b&&o(g(a,f("https://www.google."+b[3]+"/maps?"+b[6],{output:b[6].indexOf("layer=c")>0?"svembed":"embed"})))}function o(a){return'<div class="lity-iframe-container"><iframe frameborder="0" allowfullscreen src="'+a+'"/></div>'}function p(){return z.documentElement.clientHeight?z.documentElement.clientHeight:Math.round(A.height())}function q(a){var b=v();b&&(27===a.keyCode&&b.close(),9===a.keyCode&&r(a,b))}function r(a,b){var c=b.element().find(G),d=c.index(z.activeElement);a.shiftKey&&d<=0?(c.get(c.length-1).focus(),a.preventDefault()):a.shiftKey||d!==c.length-1||(c.get(0).focus(),a.preventDefault())}function s(){b.each(D,function(a,b){b.resize()})}function t(a){1===D.unshift(a)&&(C.addClass("lity-active"),A.on({resize:s,keydown:q})),b("body > *").not(a.element()).addClass("lity-hidden").each(function(){var a=b(this);void 0===a.data(F)&&a.data(F,a.attr(E)||null)}).attr(E,"true")}function u(a){var c;a.element().attr(E,"true"),1===D.length&&(C.removeClass("lity-active"),A.off({resize:s,keydown:q})),D=b.grep(D,function(b){return a!==b}),c=D.length?D[0].element():b(".lity-hidden"),c.removeClass("lity-hidden").each(function(){var a=b(this),c=a.data(F);c?a.attr(E,c):a.removeAttr(E),a.removeData(F)})}function v(){return 0===D.length?null:D[0]}function w(a,c,d,e){var f,g="inline",h=b.extend({},d);return e&&h[e]?(f=h[e](a,c),g=e):(b.each(["inline","iframe"],function(a,b){delete h[b],h[b]=d[b]}),b.each(h,function(b,d){return!d||(!(!d.test||d.test(a,c))||(f=d(a,c),!1!==f?(g=b,!1):void 0))})),{handler:g,content:f||""}}function x(a,e,f,g){function h(a){k=b(a).css("max-height",p()+"px"),j.find(".lity-loader").each(function(){var a=b(this);c(a).always(function(){a.remove()})}),j.removeClass("lity-loading").find(".lity-content").empty().append(k),m=!0,k.trigger("lity:ready",[l])}var i,j,k,l=this,m=!1,n=!1;e=b.extend({},H,e),j=b(e.template),l.element=function(){return j},l.opener=function(){return f},l.options=b.proxy(d,l,e),l.handlers=b.proxy(d,l,e.handlers),l.resize=function(){m&&!n&&k.css("max-height",p()+"px").trigger("lity:resize",[l])},l.close=function(){if(m&&!n){n=!0,u(l);var a=B();if(g&&(z.activeElement===j[0]||b.contains(j[0],z.activeElement)))try{g.focus()}catch(a){}return k.trigger("lity:close",[l]),j.removeClass("lity-opened").addClass("lity-closed"),c(k.add(j)).always(function(){k.trigger("lity:remove",[l]),j.remove(),j=void 0,a.resolve()}),a.promise()}},i=w(a,l,e.handlers,e.handler),j.attr(E,"false").addClass("lity-loading lity-opened lity-"+i.handler).appendTo("body").focus().on("click","[data-lity-close]",function(a){b(a.target).is("[data-lity-close]")&&l.close()}).trigger("lity:open",[l]),t(l),b.when(i.content).always(h)}function y(a,c,d){a.preventDefault?(a.preventDefault(),d=b(this),a=d.data("lity-target")||d.attr("href")||d.attr("src")):d=b(d);var e=new x(a,b.extend({},d.data("lity-options")||d.data("lity"),c),d,z.activeElement);if(!a.preventDefault)return e}var z=a.document,A=b(a),B=b.Deferred,C=b("html"),D=[],E="aria-hidden",F="lity-"+E,G='a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),iframe,object,embed,[contenteditable],[tabindex]:not([tabindex^="-"])',H={handler:null,handlers:{image:i,inline:j,youtube:k,vimeo:l,googlemaps:n,facebookvideo:m,iframe:o},template:'<div class="lity" role="dialog" aria-label="Dialog Window (Press escape to close)" tabindex="-1"><div class="lity-wrap" data-lity-close role="document"><div class="lity-loader" aria-hidden="true">Loading...</div><div class="lity-container"><div class="lity-content"></div><button class="lity-close" type="button" aria-label="Close (Press escape to close)" data-lity-close>×</button></div></div></div>'},I=/(^data:image\/)|(\.(png|jpe?g|gif|svg|webp|bmp|ico|tiff?)(\?\S*)?$)/i,J=/(youtube(-nocookie)?\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?([\w-]{11})(.*)?/i,K=/(vimeo(pro)?.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/,L=/((maps|www)\.)?google\.([^\/\?]+)\/?((maps\/?)?\?)(.*)/i,M=/(facebook\.com)\/([a-z0-9_-]*)\/videos\/([0-9]*)(.*)?$/i,N=function(){var a=z.createElement("div"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return b[c];return!1}();return i.test=function(a){return I.test(a)},y.version="2.2.2",y.options=b.proxy(d,y,H),y.handlers=b.proxy(d,y,H.handlers),y.current=v,b(z).on("click.lity","[data-lity]",y),y}); ===================================================== == File: src/homepage/_site/assets/js/util.js ===================================================== (function($) { /** * Generate an indented list of links from a nav. Meant for use with panel(). * @return {jQuery} jQuery object. */ $.fn.navList = function() { var $this = $(this); $a = $this.find('a'), b = []; $a.each(function() { var $this = $(this), indent = Math.max(0, $this.parents('li').length - 1), href = $this.attr('href'), target = $this.attr('target'); b.push( '<a ' + 'class="link depth-' + indent + '"' + ( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') + ( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') + '>' + '<span class="indent-' + indent + '"></span>' + $this.text() + '</a>' ); }); return b.join(''); }; /** * Panel-ify an element. * @param {object} userConfig User config. * @return {jQuery} jQuery object. */ $.fn.panel = function(userConfig) { // No elements? if (this.length == 0) return $this; // Multiple elements? if (this.length > 1) { ===================================================== == File: src/homepage/_site/assets/js/jquery.scrollex.min.js ===================================================== /* jquery.scrollex v0.2.1 | (c) @ajlkn | github.com/ajlkn/jquery.scrollex | MIT licensed */ !function(t){function e(t,e,n){return"string"==typeof t&&("%"==t.slice(-1)?t=parseInt(t.substring(0,t.length-1))/100*e:"vh"==t.slice(-2)?t=parseInt(t.substring(0,t.length-2))/100*n:"px"==t.slice(-2)&&(t=parseInt(t.substring(0,t.length-2)))),t}var n=t(window),i=1,o={};n.on("scroll",function(){var e=n.scrollTop();t.map(o,function(t){window.clearTimeout(t.timeoutId),t.timeoutId=window.setTimeout(function(){t.handler(e)},t.options.delay)})}).on("load",function(){n.trigger("scroll")}),jQuery.fn.scrollex=function(l){var s=t(this);if(0==this.length)return s;if(this.length>1){for(var r=0;r<this.length;r++)t(this[r]).scrollex(l);return s}if(s.data("_scrollexId"))return s;var a,u,h,c,p;switch(a=i++,u=jQuery.extend({top:0,bottom:0,delay:0,mode:"default",enter:null,leave:null,initialize:null,terminate:null,scroll:null},l),u.mode){case"top":h=function(t,e,n,i,o){return t>=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n<this.length;n++)t(this[n]).unscrollex();return e}var i,l;return(i=e.data("_scrollexId"))?(l=o[i],window.clearTimeout(l.timeoutId),delete o[i],e.removeData("_scrollexId"),l.options.terminate&&l.options.terminate.apply(this),e):e}}(jQuery); ===================================================== == File: src/homepage-docker/Dockerfile ===================================================== FROM ruby:2.6.8-buster RUN apt-get update \ && apt-get install -y \ nodejs \ python-pygments \ && apt-get clean \ && rm -rf /var/lib/apt/lists/ RUN gem install \ github-pages \ jekyll \ jekyll-feed \ jekyll-redirect-from \ jekyll-seo-tag \ kramdown \ rdiscount \ rouge # Copy the script COPY compile.sh /root/compile.sh # Define the entrypoint WORKDIR /james-project ENTRYPOINT ["/root/compile.sh"] ===================================================== == File: src/homepage-docker/compile.sh ===================================================== #!/bin/sh -e # printUsage() { echo "Usage : " echo "./compile.sh SHA1" echo " SHA1: SHA1 to build (optional)" exit 1 } ORIGIN=/origin DESTINATION=/destination for arg in "$@" do case $arg in -*) echo "Invalid option: -$OPTARG" printUsage ;; *) if ! [ -z "$1" ]; then SHA1=$1 fi ;; esac if [ "0" -lt "$#" ]; then shift fi done if [ -z "$SHA1" ]; then SHA1=master fi # Sources retrieval git clone $ORIGIN/. git checkout $SHA1 # Compilation /james-project/src/jekyll/_site jekyll build --source src/homepage --destination $DESTINATION ===================================================== == File: src/site-docker/Dockerfile ===================================================== # Build James # # VERSION 1.0 FROM eclipse-temurin:11-jdk-focal # Install git RUN apt-get update RUN apt-get install -y git wget unzip # Install Maven WORKDIR /root RUN wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz RUN tar -xvf apache-maven-3.6.3-bin.tar.gz RUN ln -s /root/apache-maven-3.6.3/bin/mvn /usr/bin/mvn # Copy the script COPY compile.sh /root/compile.sh # Define the entrypoint WORKDIR /james-project ENTRYPOINT ["/root/compile.sh"] ===================================================== == File: src/site-docker/compile.sh ===================================================== #!/bin/sh -e # printUsage() { echo "Usage : " echo "./compile.sh SHA1" echo " SHA1: SHA1 to build (optional)" exit 1 } ORIGIN=/origin DESTINATION=/destination for arg in "$@" do case $arg in -*) echo "Invalid option: -$OPTARG" printUsage ;; *) if ! [ -z "$1" ]; then SHA1=$1 fi ;; esac if [ "0" -lt "$#" ]; then shift fi done if [ -z "$SHA1" ]; then SHA1=master fi # Sources retrieval git clone $ORIGIN/. git checkout $SHA1 # Compilation export MAVEN_OPTS="-Xmx7168m -Xms2048m -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit" mvn clean install -DskipTests mvn site:site -Dmaven.javadoc.skip=true -DskipTests -pl .,mpt/core mkdir /tmp/website-generation mvn site:stage -DstagingDirectory=/tmp/website-generation -pl .,mpt/core cp -r /tmp/website-generation/* $DESTINATION/ ===================================================== == File: src/adr/0026-removing-configured-additional-mailboxListeners.md ===================================================== # 26. Removing a configured additional MailboxListener Date: 2020-04-03 ## Status Accepted (lazy consensus) Not implemented yet. Superseded by [35. Distributed Mailbox Listener Configuration](0035-distributed-listeners-configuration.md) ## Context James enables a user to register additional mailbox listeners. The distributed James server is handling mailbox event processing (mailboxListener execution) using a RabbitMQ work-queue per listener. The distributed James server then declares a queue upon start for each one of these user registered listeners, that it binds to the main event exchange. More information about this component, and its distributed, RabbitMQ based implementation, can be found in [ADR 0036](0037-eventbus.md). If the user unconfigures the listener, the queue and the binding are still present but not consumed. This results in unbounded queue growth eventually causing RabbitMQ resource exhaustion and failure. ## Vocabulary A **required group** is a group configured within James additional mailbox listener or statically binded via Guice. We should have a queue for that mailbox listener binded to the main exchange. A **registered group** is a group whose queue exists in RabbitMQ and is bound to the exchange, independently of its James usage. If it is required, a consumer will consume the queue. Otherwise the queue might grow unbounded. ## Decision We need a clear consensus and auditability across the James cluster about **required groups** (and their changes). Thus Event sourcing will maintain an aggregate tracking **required groups** (and their changes). Audit will be enabled by adding host and date information upon changes. A subscriber will perform changes (binds and unbinds) in registered groups following the changes of the aggregate. Event sourcing is desirable as it allows: - Detecting previously removed MailboxListener upon start - Audit of unbind decisions - Enables writing more complex business rules in the future The event sourcing system will have the following command: ===================================================== == File: src/adr/0032-distributed-mail-queue-cleanup.md ===================================================== # 32. Distributed Mail Queue Cleanup Date: 2020-04-13 ## Status Accepted (lazy consensus) and implemented ## Context Read [Distributed Mail Queue](0031-distributed-mail-queue.md) for full context. **enqueuedMailsV3** and **deletedMailsV2** is never cleaned up and the corresponding blobs are always referenced. This is not ideal both from a privacy and space storage costs point of view. Note that **enqueuedMailsV3** and **deletedMailsV2** rely on timeWindowCompactionStrategy. ## Decision Add a new `contentStart` table referencing the point in time from which a given mailQueue holds data, for each mail queue. The values contained between `contentStart` and `browseStart` can safely be deleted. We can perform this cleanup upon `browseStartUpdate`: once finished we can browse then delete content of **enqueuedMailsV3** and **deletedMailsV2** contained between `contentStart` and the new `browseStart` then we can safely set `contentStart` to the new `browseStart`. Content before `browseStart` can safely be considered deletable, and is applicatively no longer exposed. We don't need an additional grace period mechanism for `contentStart`. Failing cleanup will lead to the content being eventually updated upon next `browseStart` update. We will furthermore delete blobStore content upon dequeue, also when the mail had been deleted or purged via MailQueue management APIs. ## Consequences All Cassandra SSTable before `browseStart` can safely be dropped as part of the timeWindowCompactionStrategy. Updating browse start will then be two times more expensive as we need to unreference passed slices. Eventually this will allow reclaiming Cassandra disk space and enforce mail privacy by removing dandling metadata. ## Alternative A [proposal](https://github.com/linagora/james-project/pull/3291#pullrequestreview-393501339) was made to piggy back cleanup upon dequeue/delete operations. The dequeuer/deleter then directly removes the related metadata from `enqueuedMailsV3` and `deletedMailsV2`. This simpler design however have several flaws: - if the cleanup fails for any reason then it cannot be retried in the future. There will be no way of cleaning up the ===================================================== == File: src/adr/0007-distributed-task-cancellation.md ===================================================== # 7. Distributed Task cancellation Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented ## Context A `Task` could be run on any node of the cluster. To interrupt it we need to notify all nodes of the cancel request. ## Decision * We will add an EventHandler to broadcast the `CancelRequested` event to all the workers listening on a RabbitMQ broadcasting exchange. * The `TaskManager` should register to the exchange and will apply `cancel` on the `TaskManagerWorker` if the `Task` is waiting or in progress on it. ## Consequences * The task manager's event system should be bound to the RabbitMQ exchange which publish the `TerminationEvent`s ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0043-avoid-elasticsearch-on-critical-reads.md ===================================================== # 43. Avoid ElasticSearch on critical reads Date: 2020-11-11 ## Status Accepted (lazy consensus) & implemented Scope: Distributed James ## Context A user willing to use a webmail powered by the JMAP protocol will end up doing the following operations: - `Mailbox/get` to retrieve the mailboxes. This call is resolved against metadata stored in Cassandra. - `Email/query` to retrieve the list of emails. This call is nowadays resolved on ElasticSearch for Email search after a right resolution pass against Cassandra. - `Email/get` to retrieve various levels of details. Depending on requested properties, this is either retrieved from Cassandra alone or from ObjectStorage. So, ElasticSearch is queried on every JMAP interaction for listing emails. Administrators thus need to enforce availability and good performance for this component. Relying on more services for every read also harms our resiliency as ElasticSearch outages have major impacts. Also we should mention our ElasticSearch implementation in Distributed James suffers the following flaws: - Updates of flags lead to updates of the all Email object, leading to sparse segments - We currently rely on scrolling for JMAP (in order to ensure messageId uniqueness in the response while respecting limit & position) - We noticed some very slow traces against ElasticSearch, even for simple queries. Regarding Distributed James data-stores responsibilities: - Cassandra is the source of truth for metadata, its storage needs to be adapted to known access patterns. - ElasticSearch allows resolution of arbitrary queries, and performs full text search. ## Decision Provide an optional view for most common `Email/query` requests both on Draft and RFC-8621 implementations. This includes filters and sorts on 'sentAt'. This view will be stored into Cassandra, and updated asynchronously via a MailboxListener. ## Consequences A migration task will be provided for new adopters. Administrators would be offered a configuration option to turn this view on and off as needed. If enabled, given clients following well defined Email/query requests, administrators would no longer need to ensure high availability and good performances for ElasticSearch to ensure availability of basic usages (mailbox content listing). ===================================================== == File: src/adr/0068-mutualize-cassandra-storge-for-quota.md ===================================================== # 68. Mutualize Cassandra storage for Quota Date: 2023-08-18 ## Status Accepted (lazy consensus). Implemented. ## Context One generic threat is resource abuse. Meaning a user uses an unfair amount of resources. Similarily resource limitation is a way to decrease operating costs. Quota, standardized in IMAP via [RFC-9208](https://www.rfc-editor.org/rfc/rfc9208.html) and in JMAP via [RFC-9425](https://datatracker.ietf.org/doc/rfc9425/) are a mechanism designed to keep track of user current usage of the resource and match it against the stored limit. Resource limitation is a broad use case that we might want to better enforce in Apache James. This is especially important when operating in SaaS mode, and actual users might be badly intentionned. See [ADR-67 Quota for JMAP uploads](0067-quota-for-jmap-uploads.md). As such, there is duplication, especially at the storage layers. Similar features might benefit from mutualized storage. Especially, it is worth mentionning that Cassandra tables do not come for free: we have a strong incentive to reduce their count. See [The Last Pickle blog post on this topic](https://thelastpickle.com/blog/2020/11/25/impacts-of-many-tables-on-cassandra.html). In particular (quote from the above article): ``` If some tables share the same columns, it could be interesting to merge them into a single one, adding a column to the partition key to distinguish data belonging to different tables. ``` ## Decision Add Cassandra storage helpers, exposing a generic interface for Cassandra quota implementation of various services to mutualize their storage. This relies on a part of the primary key allowing to distinguish the component.  The helper will consist of 2 tables: - One composed of counters to track current value - One composed of regular `long` to track limits (one can not mix counters and regular values in the same table in Cassandra). Port exising Cassandra implementations of quota for various services to use those helpers. Namely the Cassandra mailbox, Sieve storage. Use those ===================================================== == File: src/adr/0066-modular-user-data-deletion.md ===================================================== # 66. Deleting user data Date: 2023-05-11 ## Status Accepted (lazy consensus). Implemented. ## Context Regulation like European GDPR involves being able to delete all user data upon requests. Currently there exist some APIs for deleting some data relative for the users but the overall process is complex, requires a good knowlege of James data structures. The data is scattered across the database and some sensible items might not be deletable. ## Decision Define a single endpoint to delete all data relative to a user. James being modular, we decided to form it under a webadmin task with a modular design. Each feature storing user data would then implement `UserDeletionTaskStep`. This modular design for migration steps could help developers easier to manage/test each step, and help other tailor James servers can implement their own steps as well. Today, implemented deletion steps are: - `RecipientRewriteTableUserDeletionTaskStep`: deletes all rewriting rules related to this user. - `FilterUserDeletionTaskStep`: deletes all filters belonging to the user. - `DelegationUserDeletionTaskStep`: deletes all delegations from / to the user. - `MailboxUserDeletionTaskStep`: deletes mailboxes of this user, all ACLs of this user, as well as his subscriptions. - `WebPushUserDeletionTaskStep`: deletes push data registered for this user. - `IdentityUserDeletionTaskStep`: deletes identities registered for this user. - `VacationUserDeletionTaskStep`: deletes vacations registered for this user. We introduce `fromStep` query parameter that allows skipping previous steps, allowing the operator to resume the user deletion from a failed step. This option could ease operators in case the data migration fails in the middle. ## Consequences - Makes it easier to claim GDPR compliance on top of James. - Modular design for deleting users is extension friendly for tailor James servers. ## Alternatives Only deleting the user from the UsersRepository only "disable" the user without affecting the underlying data. ===================================================== == File: src/adr/0039-distributed-blob-garbage-collector.md ===================================================== # 39. Distributed blob garbage collector Date: 2020-02-18 ## Status Proposed, not implemented yet. Work had been started on this topic. An alternative is proposed in [Deduplicated blobs GC with bloom filters](0049-deduplicated-blobs-gs-with-bloom-filters.md) and implemented. ## Context The body, headers, attachments of the mails are stored as blobs in a blob store. In order to save space in those stores, those blobs are de-duplicated using a hash of their content. To attain that the current blob store will read the content of the blob before saving it, and generate its id based on a hash of this content. This way two blobs with the same content will share the same id and thus be saved only once. This makes the safe deletion of one of those blobs a non trivial problem as we can't delete one blob without ensuring that all references to it are themselves deleted. For example if two messages share the same blob, when we delete one message there is at the time being no way to tell if the blob is still referenced by another message. ## Decision To address this issue, we propose to implement a distributed blob garbage collector built upon the previously developed Distributed Task Manager. The de-duplicating blob store will keep track of the references pointing toward a blob in a `References` table. It will also keep track of the deletion requests for a blob in a `Deletions` table. When the garbage collector algorithm runs it will fetch from the `Deletions` table the blobs considered to be effectively deleted, and will check in the `References` table if there are still some references to them. If there is no more reference to a blob, it will be effectively deleted from the blob store. To avoid concurrency issues, where we could garbage collect a blob at the same time a new reference to it appear, a `reference generation` notion will be added. The de-duplicating id of the blobs which before where constructed using only the hash of their content, will now include this `reference generation` too. At a given interval a new `reference generation` will be emitted, since then all new blobs will point to this new generation. So a `garbage collection iteration` will run only on the `reference generation` `n-2` to avoid concurrency issues. The switch of generation will be triggered by a task running on the distributed task manager. This task will emit an event into the event sourcing system to increment the `reference generation`. ## Alternatives Not de-duplicating the blobs' content, this simple approach which involves storing the same blob a lot of times can in some scenario be really slow and costly. Albeit it can in some case be preferred for the sake of simplicity, data security... ===================================================== == File: src/adr/0030-separate-attachment-content-and-metadata.md ===================================================== # 30. Separate attachment content and metadata Date: 2020-04-13 ## Status Accepted (lazy consensus) & implemented ## Context Some mailbox implementations of James store already parsed attachments for faster retrieval. This attachment storage capabilities are required for two features: - JMAP attachment download - JMAP message search "attachment content" criteria Only Memory and Cassandra backends can be relied upon as a JMAP backend. Other protocols relies on dynamic EML parsing to expose message subparts (IMAP) Here are the POJOs related to these attachments: - **Attachment** : holds an attachmentId, the attachment content, as well as the content type - **MessageAttachment** : composes an attachment with its disposition within a message (cid, inline and name) - **Message** exposes its list of MessageAttachment when it is read with FetchType Full. - **Blob** represents some downloadable content, and can be either an attachment or a message. Blob has a byte array payload too. The following classes work with the aforementioned POJOs: - **AttachmentMapper** and **AttachmentManager** are responsible of storing and retrieving an attachment content. - **BlobManager** is used by JMAP to allow blob downloads. - Mailbox search exposes attachment content related criteria. These criteria are used by the JMAP protocol. This organisation causes attachment content to be loaded every time a message is fully read (which happens for instance when you open a message using JMAP) despite the fact that it is not needed, as attachments are downloadable through a separate JMAP endpoint, their content is not attached to the JMAP message JSON. Also, the content being loaded "at once", we allocate memory space to store the whole attachment, which is sub-optimal. We want to keep the consumed memory low per-message because a given server should be able to handle a high number of messages at a given time. To be noted that JPA and maildir mailbox implementations do not support attachment storage. To retrieve attachments of a message, these implementations parse the messages to extract their attachments. Cassandra mailbox prior schema version 4 stored attachment and its metadata in the same table, but from version 5 relies on the blobStore to store the attachment content. ## Decision ===================================================== == File: src/adr/0055-rspamd-spam-filtering.md ===================================================== # 55. RSPAMD Date: 2022-08-10 ## Status Accepted (lazy consensus). Implemented. ## Context In order to detect spam, James provide 3 mechanisms: - SMTP Hook: decide to reject or not before spooling on the SMTP level - Mailet: custom the mailet pipeline for changing the mail processing when detect spam mail. - Mailbox listener: based on user action, eg: move in/out the message to Inbox/Spam mailbox, then decide to report spam or not to separate Spam filtering system. For basic, we can base on username, DSN filter, domains, IP... for configuring black or grey list. If we want to analyse deeper in each message content, we need a more complex system. Currently, James is integrated with [SpamAssassin](https://spamassassin.apache.org/) to tackle this problem. We found it hard to operate SpamAssassin, and we had a performance issue. For more selection, James's repository provides the Rspamd extension, which provides the same way as SpamAssassin but another system - [Rspamd](https://github.com/rspamd/rspamd) A quick introduction about Rspamd: ``` Rspamd is an advanced spam filtering system and email processing framework that allows evaluation of messages by a number of rules including regular expressions, statistical analysis and custom services such as URL black lists. Each message is analysed by Rspamd and given a verdict that might be used by MTA for further processing (e.g. to reject a message, or add a special header indicating spam) along with other information, such as possible DKIM signature or modifications suggested for a message. Rspamd can act as a Milter allowing direct interaction with popular MTA systems, such as Postfix or Sendmail. Rspamd is designed to process hundreds of messages per second simultaneously, and provides a number of useful features including a comprehensive Lua API that allows access to messages processing in various aspects as well as asynchronous network API to access external resources, such as DNS, HTTP or even generic TCP/UDP services. ``` ## Decision Set up a new maven project dedicated to rspamd extension. This allows to be embedded in a James server as a soft dependency using the external-jar loading mechanism. With this way, the extension could be dropped in one's James installation, and not a runtime dependency. Based on James' support for custom mailets, listeners, web admin routes, Rspamd extension can be done via: - `RspamdScanner` mailet: with each mail income, this mailet will query to Rspamd for getting a spam or ham result, then append new headers to the mail with status/flag spam. By setting up with `IsMarkedAsSpam` matcher, the mail will be rejected or not. This mailet will be configured in [mailetcontainer.xml](/server/apps/distributed-app/sample-configuration/mailetcontainer.xml). - Web admin route: to create feeding ham/spam messages task (batch mechanism). It helps spam classify learning. - `RspamdListener`: the listener will handle mailbox events, based on `MessageMoveEvent`, `MailboxEvents.Added` to detect if the mail is spam or ham, then report to Rspamd, enrich data to Rspamd, thus we will get more exact results in the next query. ===================================================== == File: src/adr/0044-against-the-use-of-cassandra-lightweight-transactions.md ===================================================== # 44. Against the use of Lightweight Transaction in Cassandra code base Date: 2020-11-11 ## Status Accepted (lazy consensus). Scope: Distributed James Implemented. ## Context As any kind of server James needs to provide some level of consistencies. Strong consistency can be achieved with Cassandra by relying on LightWeight transactions. This enables optimistic transactions on a single partition key. Under the hood, Cassandra relies on the PAXOS algorithm to achieve consensus across replica allowing us to achieve linearizable consistency at the entry level. To do so, Cassandra tracks consensus in a system.paxos table. This `system.paxos` table needs to be checked upon reads as well in order to ensure the latest state of the ongoing consensus is known. This can be achieved by using the SERIAL consistency level. Experiments on a distributed James cluster (4 James nodes, having 4 CPU and 8 GB of RAM each, and a 3 node Cassandra cluster of 32 GB of RAM, 8 CPUs, and SSD disks) demonstrated that the system.paxos table was by far the most read and compacted table (ratio 5). The table triggering the most reads to the `system.paxos` table was the `acl` table. Deactivating LWT on this table alone (lightweight transactions & SERIAL consistency level) enabled an instant 80% throughput, latencies reductions as well as softer degradations when load breaking point is exceeded. ## Decision Rely on `event sourcing` to maintain a projection of ACLs that do not rely on LWT or SERIAL consistency level. Event sourcing is thus responsible for handling concurrency and race conditions as well as governing denormalization for ACLs. It can be used as a source of truth to re-build ACL projections. Note that the ACL projection tables can end up being out of synchronization from the aggregate but we still have a non-questionable source of truth handled via event sourcing. ## Consequences We expect a better load handling, better response time, and cheaper operation costs for Distributed James while not compromising the data safety of ACL operations. ACL updates being a rare operation, we do not expect significant degradation of write performance by relying on `eventSourcing`. ===================================================== == File: src/adr/0050-jmap-web-push.md ===================================================== # 50. Implement web push for JMAP Date: 2021-10-18 ## Status Accepted (lazy consensus). Implemented. ## Context **Notification for newly received emails** is a common feature of modern mail applications. Furthermore, **real time** updates across devices are a common feature. We wish to provide support for this on top of Apache James JMAP implementation for a large variety of devices. Dealing with mobile devices yield a unique set of challenges at the protocol level, including low bandwidth connection, long latencies, and the need to save battery. As such, mobile devices operating systems tend to limit background connections for applications. Thus, in order to receive notifications when the application is running on the background, one cannot rely on [ADR 0047](0047-jmap-push-over-websockets.md) (JMAP websocket push) - as it would imply the application maintaining a persistent connection to the server, which is battery/network consuming. As such, [RFC-8620 section 7.2](https://jmap.io/spec-core.html#pushsubscription) `JMAP specification for web push` introduces the use of [RFC-8030](https://datatracker.ietf.org/doc/html/rfc8030) `Generic Event Delivery Using HTTP Push` using an intermediate push server: a Push Gateway is used by the device to multiplex all push of all applications on a single connection. The device then register the URL of its push gateway on the application server (here JMAP server) for it to forward `StateChange` events to the push gateway. ## Decision Implement [RFC-8620 section 7.2](https://jmap.io/spec-core.html#pushsubscription) `JMAP specification for web push`. We will store StateChanges, provide a Cassandra implementation of this storage for the Distributed application. We will implement a PushClient based on reactor-netty to send events to the push gateway. We will rely on a Group listener plugged on the JMAP event bus to handle the web push - See [ADR 37: Event bus](0037-eventbus.md). We will implement the `PushSubscription/get` and `PushSubscription/set` JMAP methods. We will also implement the verification code mechanism (a first round-trip to verify the push gateway works well). We also decided to allow a single push subscription per devideId (which includes device and APP identifier...) ## Consequences The notification traffic transits by some third party infrastructure which can both be a security and privacy risk. ===================================================== == File: src/adr/0002-make-taskmanager-distributed.md ===================================================== # 2. Make TaskManager Distributed Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented ## Context In order to have a distributed version of James we need to have an homogeneous way to deal with `Task`. Currently, every James nodes of a cluster have their own instance of `TaskManager` and they have no knowledge of others, making it impossible to orchestrate task execution at the cluster level. Tasks are scheduled and ran on the same node they are scheduled. We are also unable to list or access to the details of all the `Task`s of a cluster. ## Decision Create a distribution-aware implementation of `TaskManager`. ## Consequences * Split the `TaskManager` part dealing with the coordination (`Task` management and view) and the `Task` execution (located in `TaskManagerWorker`) * The distributed `TaskManager` will rely on RabbitMQ to coordinate and the event system to synchronize states ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0012-jmap-partial-reads.md ===================================================== # 12. Projections for JMAP Messages Date: 2019-10-09 ## Status Accepted (lazy consensus) & implemented ## Context JMAP core RFC8620 requires that the server responds only properties requested by the client. James currently computes all of the properties regardless of their cost, and if it had been asked by the client. Clearly we can save some latencies and resources by avoiding reading/computing expensive properties that had not been explicitly requested by the client. ## Decision Introduce two new datastructures representing JMAP messages: - One with only metadata - One with metadata + headers Given the properties requested by the client, the most appropriate message datastructure will be computed, on top of existing message storage APIs that should remain unchanged. Some performance tests will be run in order to evaluate the improvements. ## Consequences GetMessages with a limited set of requested properties no longer result necessarily in full database message read. We thus have a significant improvement, for instance when only metadata are requested. Given the following scenario played by 5000 users per hour (constant rate) - Authenticate - List mailboxes - List messages in one of their mailboxes - Get 10 times the mailboxIds and keywords of the given messages We went from: - A 20% failure and timeout rate before this change to no failure - Mean time for GetMessages went from 27 159 ms to 27 ms (1000 time improvment), for all operation from 27 591 ms to 60 ms (460 time improvment) - P99 is a metric that did not make sense because the initial simulation exceeded Gatling (the performance measuring tool we use) timeout (60s) at the p50 percentile. After this proposal p99 for the entire scenario is of 1 383 ms ## References - /get method: https://tools.ietf.org/html/rfc8620#section-5.1 - [JIRA](https://issues.apache.org/jira/browse/JAMES-2919) * [PR discussing this ADR](https://github.com/apache/james-project/pull/170) ===================================================== == File: src/adr/0038-distributed-eventbus.md ===================================================== # 38. Distributed Event bus Date: 2020-05-25 ## Status Accepted (lazy consensus) & implemented ## Context Read [Event Bus ADR](0037-eventbus.md) for context. Given several James servers, we need them to share a common EventBus. This: - Ensures a better load balancing for `group mailbox listners`. - Is required for correctness of notifications (like IMAP IDLE). ## Decision Provide a distributed implementation of the EventBus leveraging RabbitMQ. Events are emitted to a single Exchange. Each group will have a corresponding queue, bound to the main exchange, with a default routing key. Each eventBus will consume this queue and execute the relevant listener, ensuring at least once execution at the cluster level. Retries are managed via a dedicated exchange for each group: as we need to count retries, the message headers need to be altered and we cannot rely on rabbitMQ build in retries. Each time the execution fails locally, a new event is emitted via the dedicated exchange, and the original event is acknowledged. Each eventBus will have a dedicated exclusive queue, bound to the main exchange with the `registrationKeys` used by local notification mailboxListeners (to only receive the corresponding subset of events). Errors are not retried for notifications, failures are not persisted within `DeadLetter`, achieving at most once event delivery. ## Related ADRs The implementation of the the distributed EventBus suffers from the following flows: - [Removing a configured additional MailboxListener](0026-removing-configured-additional-mailboxListeners.md) - [Distributed Mailbox Listeners Configuration](0035-distributed-listeners-configuration.md) also covers more in details topology changes and supersedes ADR 0026. The following enhancement have furthermore been contributed: - [EventBus error handling upon dispatch](0027-eventBus-error-handling-upon-dispatch.md) ## References * [JIRA 1](https://issues.apache.org/jira/browse/MAILBOX-367) ===================================================== == File: src/adr/0031-distributed-mail-queue.md ===================================================== # 31. Distributed Mail Queue Date: 2020-04-13 ## Status Accepted (lazy consensus) & implemented ## Context MailQueue is a central component of SMTP infrastructure allowing asynchronous mail processing. This enables a short SMTP reply time despite a potentially longer mail processing time. It also works as a buffer during SMTP peak workload to not overload a server. Furthermore, when used as a Mail Exchange server (MX), the ability to add delays to be observed before dequeing elements allows, among others: - Delaying retries upon MX delivery failure to a remote site. - Throttling, which could be helpful for not being considered a spammer. A mailqueue also enables advanced administration operations like traffic review, discarding emails, resetting wait delays, purging the queue, etc. Spring implementation and non distributed implementations rely on an embedded ActiveMQ to implement the MailQueue. Emails are being stored in a local file system. An administrator wishing to administrate the mailQueue will thus need to interact with all its James servers, which is not friendly in a distributed setup. Distributed James relies on the following third party softwares (among other): - **RabbitMQ** for messaging. Good at holding a queue, however some advanced administrative operations can't be implemented with this component alone. This is the case for `browse`, `getSize` and `arbitrary mail removal`. - **Cassandra** is the metadata database. Due to **tombstone** being used for delete, queue is a well known anti-pattern. - **ObjectStorage** (Swift or S3) holds byte content. ## Decision Distributed James should ship a distributed MailQueue composing the following softwares with the following responsibilities: - **RabbitMQ** for messaging. A rabbitMQ consumer will trigger dequeue operations. - A time series projection of the queue content (order by time list of mail metadata) will be maintained in **Cassandra** (see later). Time series avoid the aforementioned tombstone anti-pattern, and no polling is performed on this projection. - **ObjectStorage** (Swift or S3) holds large byte content. This avoids overwhelming other softwares which do not scale as well in term of Input/Output operation per seconds. Here are details of the tables composing Cassandra MailQueue View data-model: - **enqueuedMailsV3** holds the time series. The primary key holds the queue name, the (rounded) time of enqueue designed as a slice, and a bucketCount. Slicing enables listing a large amount of items from a given point in time, in an fashion that is not achievable with a classic partition approach. The bucketCount enables sharding and avoids all writes ===================================================== == File: src/adr/0004-distributed-tasks-listing.md ===================================================== # 4. Distributed Tasks listing Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented ## Context By switching the task manager to a distributed implementation, we need to be able to `list` all `Task`s running on the cluster. ## Decision * Read a Cassandra projection to get all `Task`s and their `Status` ## Consequences * A Cassandra projection has to be done * The `EventSourcingSystem` should have a `Listener` updating the `Projection` ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0027-eventBus-error-handling-upon-dispatch.md ===================================================== # 27. EventBus error handling upon dispatch Date: 2020-04-03 ## Status Accepted (lazy consensus) & implemented ## Context James allows asynchronous processing for mailbox events via MailboxListener. This processing is abstracted by the EventBus. If the processing of an event via a mailbox listener fails, it is retried, until it succeeds. If a maxRetries parameter is exceeded, the event is stored in deadLetter and no further processing is attended. The administrator can then look at the content of deadLetter to diagnose processing issues and schedule a reDelivery in order to retry their processing via webAdmin APIs. However no such capabilities are supported upon dispatching the event on the eventbus. A failed dispatch will result in message loss. More information about this component can be found in [ADR 0036](0037-eventbus.md). ## Decision Upon dispatch failure, the eventBus should save events in dead letter using a dedicated group. Reprocessing this group an admin can re-trigger these events dispatch. In order to ensure auto healing, James will periodically check the corresponding group in deadLetter is empty. If not a re-dispatching of these events will be attempted. ## Consequence In distributed James Guice project an administrator have a way to be eventually consistent upon rabbitMQ failure. ## References - [JIRA](https://issues.apache.org/jira/browse/JAMES-3139) ===================================================== == File: src/adr/0021-cassandra-acl-inconsistency.md ===================================================== # 21. Cassandra ACL inconsistencies Date: 2020-02-27 ## Status Proposed Not implemented yet. ## Context Mailboxes ACLs are denormalized in Cassandra in order to: - given a mailbox, list its ACL (enforcing rights for example) - discover which mailboxes are delegated to a given user (used to list mailboxes) Here is the tables organisation: - `acl` stores the ACLs of a given mailbox - `UserMailboxACL` stores which mailboxes had been delegated to which user Failures during the denormalization process will lead to inconsistencies between the two tables. This can lead to the following user experience: ``` ALICE delegates her INBOX mailbox to BOB The denormalisation process fails ALICE INBOX does not appear in BOB mailbox list Given a delegated mailbox INBOX.delegated ALICE undo the sharing of her INBOX.delegated mailbox The denormalisation process fails ALICE INBOX.delegated mailbox still appears in BOB mailbox list When BOB tries to select it, he is being denied ``` ## Decision We can adopt a retry policy of the `UserMailboxACL` projection update as a mitigation strategy. Using `acl` table as a source of truth, we can rebuild the `UserMailboxACL` projection: - Iterating `acl` entries, we can rewrite entries in `UserMailboxACL` - Iterating `UserMailboxACL` we can remove entries not referenced in `acl` - Adding a delay and a re-check before the actual fix can decrease the occurrence of concurrency issues We will expose a webAdmin task for doing this. ===================================================== == File: src/adr/0023-cassandra-mailbox-counters-inconsistencies.md ===================================================== # 23. Cassandra Mailbox Counters inconsistencies Date: 2020-03-07 ## Status Accepted (lazy consensus) & implemented ## Context Cassandra maintains a per mailbox projection for message count and unseen message count. As with any projection, it can go out of sync, leading to inconsistent results being returned to the client, which is not acceptable. Here is the table organisation: - `mailbox` Lists the mailboxes - `messageIdTable` Holds mailbox and flags for each message, lookup by mailbox ID + UID - `imapUidTable` Holds mailbox and flags for each message, lookup by message ID and serves as a source of truth - `mailboxCounters` Holds messages count and unseen message count for each mailbox. Failures during the denormalization process will lead to inconsistencies between the counts and the content of `imapUidTable` This can lead to the following user experience: - Invalid message count can be reported in the Mail User Agent (IMAP & JMAP) - Invalid message unseen count can be reported in the Mail User Agent (IMAP & JMAP) ## Decision Implement a webadmin exposed task to recompute mailbox counters. This endpoints will: - List existing mailboxes - List their messages using `messageIdTable` - Check them against their source of truth `imapUidTable` - Compute mailbox counter values - And reset the value of the counter if needed in `mailboxCounters` ## Consequences This endpoint is subject to data races in the face of concurrent operations. Concurrent increments & decrements will be ignored during a single mailbox processing. However the source of truth is unaffected hence, upon rerunning the task, the result will be eventually correct. To be noted that Cassandra counters can't be reset in an atomic manner anyway. We rely on the "listing messages by mailbox" projection (that we recheck). Missing entries in there will be ignored until the given projection is healed (currently unsupported). We furthermore can piggy back a partial check of the message denormalization described in ===================================================== == File: src/adr/0063-temporary-file-leaks.md ===================================================== # 63. Prevent temporary file leaks Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. ## Context In order to reduce memory allocation, Apache James buffers big emails into temporary files, in both SMTP and during the email processing. This means that all James entities relying on `Mail` object needs to have resource management in place to prevent temporary file leaks. If not this can result in both unreasonable disk occupation and file descriptor leaks. Core components were found to badly manage those resources. Some mailets (bounce), mail queue APIs, mail repository APIs were found to be causing temporary file leaks. James allows users to define custom mailets, that them too can badly manage emails. If insiders tend to commit such errors, then we should expect our users to commit them too. This points toward the need of a systematic approach to detect and mitigate temporary file leaks. Similar leak detection is performed by other libraries. One can mention here Netty buffer libraries, which relies on phantom references to detect leaks. Phantom references allows the Java garbage collector to report recently GCed object. Upon phantom reference allocation, a check can then be done to check recently GCed object, and release related resources if need be. ## Decision Implement a leak detector "a la Netty" using phantom references. Allow several modes: - Off: does nothing which is James 3.6.x behaviour. - Simple: logs leaks and deletes associated files - Advanced: Same as simple but with the allocation stack trace which comes at a performance cost. Useful for diagnostic. - Testing: Assertion errors upon leaks. Can be used to streangthen test suite and detect leaks as part of a build. ## Consequences Makes James core components "leak proofed". Allows user to safely write extensions involving emails (eg duplication / sending). ===================================================== == File: src/adr/0069-crowdsec-IP-filtering.md ===================================================== # 69. Crowdsec Date: 2022-10-26 ## Status Accepted (lazy consensus). Implemented. ## Context Currently, there is no mechanism to check harmful IP addresses implementing attacks like bruteforce attacks, dictionary attacks, etc. - Bruteforce attack: A hacker attempts to guess the user's login credentials. - Dictionary attacks: A dictionary attack tries to find out the list of valid mail addresses. ## Decision To that end, we will integrate James with [Crowdsec](https://www.crowdsec.net/). Crowdsec will check James logs, based on defined scenarios, Crowdsec can detect malevolent behaviors, and block them from accessing James at various levels (infrastructure - firewall, system, applicative). To ease end user configuration, and propose a bundled experience independent from end user infrastructure, we implement Crowdsec remediations at application level. Willing users can very well set up remediations based on their underlying infrastructure. A quick introduction about Crowdsec: ``` CrowdSec Security Engine is an open-source and lightweight software that allows you to detect peers with malevolent behaviors and block them from accessing your systems at various levels (infrastructural, system, applicative). To achieve this, the Security Engine reads logs from different sources (files, streams ...) to parse, normalize and enrich them before matching them to threats patterns called scenarios. ``` CrowdSec ships by default with scenarios (brute force, port scan, web scan, etc.) adapted for most contexts, but we can easily extend it by picking more of them from the [HUB](https://app.crowdsec.net/hub/collections). It is also easy to adapt an existing one or create one ourselves. Set up a new maven project dedicated to Crowdsec extension. This allows to be embedded in a James server as a soft dependency using the external-jar loading mechanism. With this way, the extension could be dropped in one's James installation, and not a runtime dependency. ### How does Crowdsec apply? - Many attacks on James via IMAP, SMTP, JMAP can be detected by Crowdsec - Crowdsec analyzes logs from James, then based on their patterns in parsers, it can detect each behavior in James. - Scenarios are YAML files that allow to detect a specific behavior, usually an attack. With James, we detect bruteforce login attack and Dictionary attack. - Each line log is an event in Crowdsec. If an event triggers the condition in Crowdsec, Crowdsec will send an alert to the Local API, and make a decision (ban) - James connects to Crowdsec via https protocol with reactor http client to query the decision from Crowdsec ## Consequences - James will be more secure by blocking threats at various levels (applicative, system, infrastructural). - We can document and share Crowdsec scenario thus allowing users to benefit from each other decisions. Also we can get dangerous IP detected by community via using Central API - Crowdsec natively supports distributed deployments (reference: ) by setting up an agent per node gathering logs of local containers and forwarding them to the crowdsec API that decides if remediations should be applied. - This architecture is not horizontally scalable in itself but should already be able to analyse over 1000 relevant logs per seconds (metric obtained by discussing with Crowdsec team), which should allow leveraging very large scale James deployments. ## Alternatives ===================================================== == File: src/adr/0037-eventbus.md ===================================================== # 37. Event bus Date: 2020-05-05 ## Status Accepted (lazy consensus) & implemented ## Context Many features rely on behaviors triggered by interactions with the mailbox API main interfaces (`RightManager`, `MailboxManager`, `MessageManager`, `MessageIdManager`). We need to provide a convenient extension mechanism for organizing the execution of these behaviours, provide retries and advanced error handling. Also, protocols enable notifications upon mailbox modifications. This is for instance the case for `RFC-2177 IMAP IDLE`, leveraged for `RFC-3501 IMAP unsolicitated notifications` when selecting a Mailbox, as well as maintaining the `IMAP Message Sequence Number <-> Unique IDentifier` MSN <-> UID mapping. Changes happening for a specific entity (mailbox) need to be propagated to the relevant listeners. ## Decision James mailbox component, a core component of James handling the storage of mails and mailboxes, should use an event driven architecture. It means every meaningful action on mailboxes or messages triggers an event for any component to react to that event. `MailboxListener` allows executing actions upon mailbox events. They could be used for a wide variety of purposes, like enriching mailbox managers features or enabling user notifications upon mailboxes operations performed by other devices via other protocol sessions. Interactions happen via the managers (`RightManager`, `MailboxManager`, `MessageManager`, `MessageIdManager`) which emit an event on the `EventBus`, which will ensure the relevant `MailboxListener`s will be executed at least once. `MailboxListener` can be registered in a work queue fashion on the `EventBus`. Each work queue corresponds to a given MailboxListener class with the same configuration, identified by their group. Each event is executed at least once within a James cluster, errors are retried with an exponential back-off delay. If the execution keeps failing, the event is stored in `DeadLetter` for later reprocessing, triggered via WebAdmin. Guice products enable the registration of additional mailbox listeners. A user can furthermore define its own mailboxListeners via the use of `extension-jars`. MailboxListener can also be registered to be executed only on events concerning a specific entity (eg. a mailbox). The `registrationKey` is identifying entities concerned by the event. Upon event emission, the manager will indicate the `registrationKey` this event should be sent to. A mailboxListener will thus only receive the event for the registration key it is registered to, in an at least once fashion. ## Consequences We need to provide an `In VM` implementation of the EventBus for single server deployments. ===================================================== == File: src/adr/0049-deduplicated-blobs-gs-with-bloom-filters.md ===================================================== # 49. Deduplicated blobs garbage collection with bloom filters Date: 2021-07-21 ## Status Accepted (lazy consensus). Implemented. Proposes a simple way to implement an alternative to [39. Distributed blob garbage collector](0039-distributed-blob-garbage-collector.md) ### Changes 2021-08-25: Edited to mention Cuckoo filters (Alternative). ## Context The body, headers, attachments of the mails are stored as blobs in a blob store. In order to save space in those stores, those blobs are de-duplicated using a hash of their content. To attain that the current blob store will read the content of the blob before saving it, and generate its id based on a hash of this content. This way two blobs with the same content will share the same id and thus be saved only once. This makes the safe deletion of one of those blobs a non-trivial problem as we can't delete one blob without ensuring that all references to it are themselves deleted. For example if two messages share the same blob, when we delete one message there is at the time being no way to tell if the blob is still referenced by another message. ## Decision To solve this, we will propose a simple two steps algorithms to provide a background deduplication job. The **first step** consists in building a bloom filter using the entities referencing the blobs. In the **second step** we iterate over blobs and check in the bloom filter to predict if they are referenced on not. **Bloom filters** are probabilistic data structures. Here the reference prediction can produce false positives: we might skip some non referenced blobs that should have been garbage collected. However, the associated probability can be tuned and by adding a salt we can ensure subsequent runs will have different sets of false positives and thus that all blobs is eventually garbage collected. To avoid concurrency issues, where we could garbage collect a blob at the same time a new reference to it appear, a `reference generation` notion will be added. The de-duplicating id of the blobs which before where constructed using only the hash of their content, will now include this `reference generation` too. To avoid synchronization issues, the `generation` will be time based. So only blobs belonging to the `reference generation` `n-2` will be eligible for garbage collection to avoid concurrency issues, and allow for a clock skew. ===================================================== == File: src/adr/0024-polyglot-strategy.md ===================================================== # 24. Polyglot codebase Date: 2020-03-17 ## Status Proposed We rely on scala in parts of the code base. ## Context & Problem Statement James is written in Java for a very long time. In recent years, Java modernized a lot after a decade of slow progress. However, in the meantime, most software relying on the JVM started supporting alternative JVM languages to keep being relevant. It includes Groovy, Clojure, Scala and more recently Kotlin, to name a few. Not being open to those alternative languages can be a problem for James adoption. ## Decision drivers Nowadays, libraries and framework targeting the JVM are expected to support usage of one or several of these alternative languages. James being not only a mail server but also a development framework needs to reach those expectations. At the same time, more and more developers and languages adopt Function Programming (FP) idioms to solve their problems. ## Considered options ### Strategies 1. Let the users figure out how to make polyglot setups 2. Document the usage of polyglot mailets for some popular languages 3. Document the usage of polyglot components for some popular languages 4. Actually implement some mailets in some popular languages 5. Actually implement some components in some popular languages ### Languages: [upperroman] I. Clojure II. Groovy III. Kotlin IV. Scala ## Decision We decide for options 4, 5 and IV. ===================================================== == File: src/adr/0060-adopt-bounded-elastic.md ===================================================== # 60. Adopt bounded elastic Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. ## Context See description of blocking vs reactive programming odel described in [ADR-57](0057-reactive-imap.md). Sometimes reactive code needs to execute blocking tasks. - This is the case when inter-operating with blocking libraries - James reactive adoption is progressive, some parts of our application are thus not reactive yet, which can result in reactive code calling blocking code calling reactive code. Historically James used the elastic scheduler for scheduling such blocking calls. This scheduler starts a thread for each task submitted (and attempt to reuse threads when possible) and results in high thread count. That is why project reactor deprecated the elastic scheduler in favor of bounded-elastic (similar to a thread pool). ## Decision Migrate from elastic scheduler to bounded-elastic scheduler. ## Consequences We expect a reduction in used threads under load from such a change. Also, getting rid of elastic scheduler might be a requirement to upgrade to reactor 3.5 upward. Associated risk: - In some places, James protocol code is reactive, calls blocking intermediates API, to end up calling reactive data access code. This results in nested blocking calls. Nested blocking calls, when using the same scheduler with a bounded thread cap, can result in a dead lock. To prevent such a dead-lock code executed on bounded-elastic should not depend on scheduling nested blocking call on bounded-elastic scheduler for its completion. We can thus avoid such a situation by using a scheduler dedicated by nested blocking calls. ## Alternatives Alternatives to the "blocking call wrapper" scheduler described above includes a full reactive ===================================================== == File: src/adr/0058-upgrade-to-netty-4.md ===================================================== # 58. Upgrade to netty 4 Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. ## Context James 3.7.0 uses Netty 3 for its TCP stacks (IMAP, SMTP, LMTP, MANAGESIEVE, POP3). Latests Netty 3 minor releases dates from 20XX. This brings concerns regarding security (unmaintained dependency). Netty 4 delivers many enhancements compared to Netty 3. - We can mention here the buffer APIs - Netty 4 empowers the use of native SSL, native event loops ## Decision Upgrade James to Netty 4. ## Consequences Significant rewrite of the protocol stack. Though the count of lines of code involved is low, the code is tricky and would need several iteration to be stabilized. For this reason, James 3.7.0 was released prior the Netty 4 adoption. Associated risk: - Buffer leaks. Manual buffer management can be error prone. Netty project includes relevant tooling. - We encountered issues with write ordering (when execute on, or outside of, the event loop) Benefits: Netty 4 natively supports graceful shutdown, which enables easily implementing such a feature in James. Netty 4 upgrades was also the opportunity to significantly improve test coverage for IMAP protocol stacks and IMAP 4 extensions, which allowed fixing numerous bugs. To be mentioned: - COMPRESSION - STARTTLS and SSL - IMAP IDLE - QRESYNC and CONDSTORE To be noted that Netty version used by James needs to be aligned with those of our dependencies: - S3 driver ===================================================== == File: src/adr/0042-applicative-read-repairs.md ===================================================== # 42. Applicative read repairs (POC mailbox & mailbox-counters) Date: 2020-09-25 ## Status Adopted (lazy consensus) & implemented Completes [20. Cassandra Mailbox object consistency](0020-cassandra-mailbox-object-consistency.md), [23. Cassandra Mailbox Counters inconsistencies](0023-cassandra-mailbox-counters-inconsistencies.md) ## Context Cassandra eventual consistency is all about "replication", but "denormalization" consistency needs to be handled at the applicative layer (due to the lack of transactions in a NoSQL database). In the past we did set up "Solve inconsistency" tasks that can be assimilated to Cassandra repairs. Such tasks, after being scheduled, ensure that the according entity denormalization is correctly denormalized. However, the inconsistencies persist between runs. We experienced inconsistencies in some production platform for both the mailbox entity, and the mailbox counter entity (whose table structure is exposed in [these](0020-cassandra-mailbox-object-consistency.md), [ADRs](0023-cassandra-mailbox-counters-inconsistencies.md)). Monitoring is required to detect when to run them and is time consuming for the platform administrator. Given a large dataset, it could even be impossible to run such tasks in a timely fashion. Another classic eventual consistency mechanism, that enables auto-healing is read-repair. Randomly piggy back upon reads synchronous or asynchronous consistency checks. If missed a repair is performed. In order to achieve denormalization auto-healing, we thus need to implement "applicative read repairs". ## Decision Provide a Proof of concept for "Applicative read repairs" for the mailbox and mailbox-counters entities. This enables read path simplification (and performance enhancements) for the mailbox object. IMAP LIST should not read mailbox counters. This information is uneeded and we should avoid paying the price of read repairs for this operation. Provide a comprehensive documentation page regarding "Distributed James consistency model". ## Consequences The expected **auto-healing** inconsistencies on existing deployments (at a limited configuration cost). This should ease operation of the Distributed James server. A configuration for James Distributed server will be added to control read repairs, per entity. ## Alternatives ===================================================== == File: src/adr/0048-cleanup-jmap-uploads.md ===================================================== # 48. Cleanup of JMAP uploads Date: 2021-07-21 ## Status Accepted (lazy consensus). Implemented. Overridden by [Quota for JMAP uploads](0067-quota-for-jmap-uploads.md) ## Context JMAP allows users to upload binary content called blobs to be later referenced via method calls. This includes but is not limited to `Email/set` for specifying the blobId of attachments and `Email/import`. The [specification](https://jmap.io/spec-core.html#binary-data) strongly encourages enforcing the cleanup of these uploads: ``` A blob that is not referenced by a JMAP object (e.g., as a message attachment) MAY be deleted by the server to free up resources. Uploads (see below) are initially unreferenced blobs. [...] An unreferenced blob MUST NOT be deleted for at least 1 hour from the time of upload; if reuploaded, the same blobId MAY be returned, but this SHOULD reset the expiry time. ``` Deleting such uploads in a timely manner is important as: - It enables freeing server resources. - failing to do so may compromise privacy: content the user have uploaded and long forgotten might still be accessible in the underlying data-store. Failing to delete uploads in a timely fashion may jeopardize for instance GDPR compliance. Today, uploads are stored along side email attachments. This means: - We can hardly apply a specific lifecycle that cleans up uploads, as distinguishing attachment from uploads is not trivial. - We currently have a complex right resolution system on attachment, handling both the upload case (were the attachment is linked to a user) and the 'true' attachment case (linked to a message, those who can access the message can access the attachment). This leads to sub-optimal code (slow). ## Decision We need to create a separate interface `UploadRepository` in `data-jmap` to store uploads for each user. We would provide a memory implementation as well as a distributed implementation of it. The distributed implementation would host metadata of the upload in Cassandra, and the content using the BlobStore API, so object storage. This `UploadRepository` would be used by JMAP RFC-8620 to back uploads (instead of the attachment manager), we will provide a `BlobResolver` to enable interactions with the uploaded blob. Similarly, we will use the `UploadRepository` to ===================================================== == File: src/adr/0072-postgresql-flags-update-concurrency-control.md ===================================================== # 72. Postgresql flags update concurrency control mechanism Date: 2023-12-19 ## Status Not-Implemented ## Context We are facing a concurrency issue when update flags concurrently. The multiple queries from clients simultaneously access the `user_flags` column of the `message_mailbox` table in PostgreSQL. Currently, the James fetches the current data, performs changes, and then updates to database. However, this approach does not ensure thread safety and may lead to concurrency issues. CRDT (conflict-free replicated data types) principles semantic can lay the ground to solving concurrency issues in a lock-free manner, and could thus be used for the problem at hand. This explores a different paradigm for addressing concurrency challenges without resorting to traditional transactions. ## Decision To address the concurrency issue when clients make changes to the user_flags column, we decide to use PostgreSQL's built-in functions to perform direct operations on the `user_flags` array column (without fetching the current data and recalculating on James application). Specifically, we will use PostgreSQL functions such as `array_remove`, `array_cat`, or `array_append` to perform specific operations as requested by the client (e.g., add, remove, replace elements). Additionally, we will create a custom function, say `remove_elements_from_array`, for removing elements from the array since PostgreSQL does not support `array_remove` with an array input. ## Consequences Pros: - This solution reduces the complexity of working with the evaluate new user flags on James. - Eliminates the step of fetching the current data and recalculating the new value of user_flags before updating. - Ensures thread safety and reduces the risk of concurrency issues. Cons: - The performance will depend on the performance of the PostgreSQL functions. ## Alternatives - Optimistic Concurrency Control (OCC): Using optimistic concurrency control to ensure that only one version of the data is updated at a time. However, this may increase the complexity of the code and require careful management of data versions. The chosen solution using PostgreSQL functions was preferred for its simplicity and direct support for array operations. - Read-Then-Write Logic into Transactions: Transactions come with associated costs, including extra locking, coordination overhead, and dependency on connection pooling. By avoiding the use of transactions, we aim to reduce these potential drawbacks and explore other mechanisms for ensuring data consistency. ## References ===================================================== == File: src/adr/0015-objectstorage-blobid-list.md ===================================================== # 15. Persist BlobIds for avoiding persisting several time the same blobs within ObjectStorage Date: 2019-10-09 ## Status Rejected (leads to concurrency issues) Adoption needs to be backed by some performance tests. ## Context A given mail is often written to the blob store by different components. And mail traffic is heavily duplicated (several recipients receiving similar email, same attachments). This causes a given blob to often be persisted several times. Cassandra was the first implementation of the blobStore. Cassandra is a heavily write optimized NoSQL database. One can assume writes to be fast on top of Cassandra. Thus we assumed we could always overwrite blobs. This usage pattern was also adopted for BlobStore on top of ObjectStorage. However writing in Object storage: - Takes time - Is billed by most cloud providers Thus choosing a right strategy to avoid writing blob twice is desirable. However, ObjectStorage (OpenStack Swift) `exist` method was not efficient enough to be a real cost and performance saver. ## Decision Rely on a StoredBlobIdsList API to know which blob is persisted or not in object storage. Provide a Cassandra implementation of it. Located in blob-api for convenience, this it not a top level API. It is intended to be used by some blobStore implementations (here only ObjectStorage). We will provide a CassandraStoredBlobIdsList in blob-cassandra project so that guice products combining object storage and Cassandra can define a binding to it. - When saving a blob with precomputed blobId, we can check the existence of the blob in storage, avoiding possibly the expensive "save". - When saving a blob too big to precompute its blobId, once the blob had been streamed using a temporary random blobId, copy operation can be avoided and the temporary blob could be directly removed. Cassandra is probably faster doing "write every time" rather than "read before write" so we should not use the stored blob projection for it Some performance tests will be run in order to evaluate the improvements. ## Consequences We expect to reduce the amount of writes to the object storage. This is expected to improve: - operational costs on cloud providers - performance improvement - latency reduction under load As id persistence in StoredBlobIdsList will be done once the blob successfully saved, inconsistencies in StoredBlobIdsList will lead to duplicated saved blobs, which is the current behaviour. ===================================================== == File: src/adr/0017-file-mail-queue-deprecation.md ===================================================== # 17. FileMailQueue deprecation Date: 2019-12-04 ## Status Accepted (lazy consensus) & removed ## Context James offers several implementation for MailQueue, a component allowing asynchronous mail processing upon smtp mail reception. These includes: - Default embedded ActiveMQ mail queue implementation, leveraging the JMS APIs and using the filesystem. - RabbitMQMailQueue allowing several James instances to share their MailQueue content. - And FileMailQueue directly leveraging the file system. We introduced a junit5 test contract regarding management features, concurrency issues, and FileMailQueue do not meet this contract. This results in some tests being disabled and in an unstable test suite. FileMailQueue tries to implement a message queue within James code, which does not really makes sense as some other projects already provides one. ## Decision Deprecate FileMailQueue components. Disable FileMailQueue tests. Target a removal as part of 3.6.0. ## Consequences FileMailQueue is not exposed to the end user, be it over Spring or Guice, the impact of this deprecation + removal should be limited. We also expect our test suite to be more stable. ## Reference Issues listing FileMailQueue defects: - https://issues.apache.org/jira/browse/JAMES-2298 Unsupported remove management feature - https://issues.apache.org/jira/browse/JAMES-2954 Incomplete browse implementation + Mixing concurrent operation might lead to a deadlock and missing fields - https://issues.apache.org/jira/browse/JAMES-2979 dequeue is not thread safe ===================================================== == File: src/adr/0020-cassandra-mailbox-object-consistency.md ===================================================== # 20. Cassandra Mailbox object consistency Date: 2020-02-27 ## Status Accepted (lazy consensus) & implemented ## Context Mailboxes are denormalized in Cassandra in order to access them both by their immutable identifier and their mailbox path (name): - `mailbox` table stores mailboxes by their immutable identifier - `mailboxPathV2` table stores mailboxes by their mailbox path We furthermore maintain two invariants on top of these tables: - **mailboxPath** unicity. Each mailbox path can be used maximum once. This is ensured by writing the mailbox path first using Lightweight Transactions. - **mailboxId** unicity. Each mailbox identifier is used by only a single path. We have no real way to ensure a given mailbox is not referenced by two paths. Failures during the denormalization process will lead to inconsistencies between the two tables. This can lead to the following user experience: ``` BOB creates mailbox A Denormalization fails and an error is returned to A BOB retries mailbox A creation BOB is being told mailbox A already exist BOB tries to access mailbox A BOB is being told mailbox A does not exist ``` ## Decision We should provide an offline (meaning absence of user traffic via for exemple SMTP, IMAP or JMAP) webadmin task to solve mailbox object inconsistencies. This task will read `mailbox` table and adapt path registrations in `mailboxPathV2`: - Missing registrations will be added - Orphan registrations will be removed - Mismatch in content between the two tables will require merging the two mailboxes together. ## Consequences As an administrator, if some of my users reports the bugs mentioned above, I have a way to sanitize my Cassandra ===================================================== == File: src/adr/0047-jmap-push-over-websockets.md ===================================================== # 47. JMAP PUSH over WebSockets Date: 2021-01-26 ## Status Accepted (lazy consensus). Implemented. Relates to [45. Support JMAP Push with Mailbox/changes implementation](0045-support-jmap-push-with-mailbox-changes-implementation.md) Requires [46. Generalize EventBus](0046-generalize-event-bus.md) ## Context JMAP Push notifications allow clients to efficiently update (almost) instantly to stay in sync with data changes on the server. In order to support this, we need to have the server emit newest state changes to the client over a PUSH channel. ## Decision We will implement [RFC-8887 - A JSON Meta Application Protocol (JMAP) Subprotocol for WebSocket](https://tools.ietf.org/html/rfc8887) as a transport mechanism for PUSH notifications. We will [generalize EventBus](0046-generalize-event-bus.md) in order to achieve an out-of-the box Publish-Subscribe system for JMAP related events, that does not fit in the mailbox API. We will implement listeners registered on the JMAP event bus for WebSocket clients in order to carry over state changes to the client. ## Consequences We expect clients using the PUSH to lead to a drastic performance enhancement, as less data needs to be transmitted upon resynchronisation. As mentioned in RFC-8887 the usage of webSockets allows other performance optimizations: - Requests can easily be compressed, which is not doable over HTTP for most available implementation (HTTP request compression is not ubiquitous). - WebSockets being connected, authentication can be performed once, when establishing the connection. This can allow to reduce the load, if needed, on authentication systems. It might ease the use for instance of custom OpenId connect providers. People deploying JMAP need to be aware that load-balancing webSockets requires session stickiness. ## Sequence 1. Bob authenticates against the `ws://` endpoints. Upgrade to websockets is granted. 2. Bob registers Email and Mailbox updates. A listener listens for state changes related to Bob account. 3. Bob receives a mail. The MailboxManager adds it to Bob's mailbox. An `Added` event is fired on the mailbox event bus. ===================================================== == File: src/adr/0009-disable-elasticsearch-dynamic-mapping.md ===================================================== # 9. Disable ElasticSearch dynamic mapping Date: 2019-10-10 ## Status Accepted (lazy consensus) & implemented ## Context We rely on dynamic mappings to expose our mail headers as a JSON map. Dynamic mapping is enabled for adding not yet encountered headers in the mapping. This causes a serie of functional issues: - Maximum field count can easily be exceeded - Field type 'guess' can be wrong, leading to subsequent headers omissions [1] - Document indexation needs to be paused at the index level during mapping changes to avoid concurrent changes, impacting negatively performance. ## Decision Rely on nested objects to represent mail headers within a mapping ## Consequences The index needs to be re-created. Document reIndexation is needed. This solves the aforementionned bugs [1]. Regarding performance: - Default message list performance is unimpacted - We noticed a 4% performance improvment upon indexing throughput - We noticed a 7% increase regarding space per message ## References - [1]: https://github.com/linagora/james-project/pull/2726 JAMES-2078 Add an integration test to prove that dynamic mapping can lead to ignored header fields - [JIRA](https://issues.apache.org/jira/browse/JAMES-2078) * [PR discussing this ADR](https://github.com/apache/james-project/pull/171) ===================================================== == File: src/adr/0006-task-serialization.md ===================================================== # 6. Task serialization Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented ## Context By switching the task manager to a distributed implementation, we need to be able to execute a `Task` on any node of the cluster. We need to have a way to describe the `Task` to be executed and serialize it in order to be able to store it in the `Created` event. Which will be persisted in the Event Store, and will be send in the event bus. At this point in time a `Task` can contain any arbitrary code. It's not an element of a finite set of actions. ## Decision * Create a `Factory` for one `Task` * Inject a `Factory` `Registry` via a Guice Module * The `Task` `Serialization` will be done in JSON, We will get inspired by `EventSerializer` * Every `Task`s should have a specific integration test demonstrating that serialization works * Each `Task` is responsible of eventually dealing with the different versions of the serialized information ## Consequences * Every `Task`s should be serializable. * Every `Task`s should provide a `Factory` which would be responsible to deserialize the task and instantiate it. * Every `Factory` should be registered through a Guice module to be created for each project containing a `Factory` ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0057-reactive-imap.md ===================================================== # 57. Reactive IMAP Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. ## Context Classic java programming involves doing some blocking calls. When performing some input-output, the thread performing the tasks at hand will hang until a response is received. This means that a server performing IOs, which is the case of James, would end up with a high number of threads: for an IMAP server, one IMAP request in flight equals one thread. The widely documented issue with such an approach is that, in Java threads correspond to system threads, and are expensive. Typically, each thread takes up to ~1MB of memory. To cap the count of threads at hand, the Thread Pool model is used to cap the count of threads. Process at most N IMAP requests with N threads, and queue requests that cannot yet be handled. The blocking thread pool model was the concurrency paradigm used by James IMAP implementation in 3.7.x. Reactive programming instead does not perform blocking operation, thus one thread can handle several IO tasks. This can be seen as callbacks executed once the request is received. Reactive programming model, amongst others, leads to efficient resource usage. It helps keeping the count of applicative threads low, helps reduce context switches. James have been, among the past few years, transitioning to a reactive programming model using the Reactor library. Migrated components involves: - Cassandra/Distributed storage - JMAP protocol stacks - Some (webadmin) tasks also relies on Reactor It is to be noted that our IMAP network stack uses Netty 4.x library that allows handling requests asynchronously. ## Decision Migrate IMAP to a reactive model. Implement a way to limit IMAP concurrency to protect James server from bursts. ## Consequences Significant rewrite of the IMAP stack. Going reactive on the IMAP stacks yields the following improvements: - Reduced thread count. IMAP request handling can now be dealt with from the Netty IO threads. ===================================================== == File: src/adr/0051-oidc.md ===================================================== # 51. Integrate James with OIDC Date: 2021-12-06 ## Status Accepted (lazy consensus). Implemented. Complemented by [ADR-62](0062-oidc-token-introspection.md). ## Context Authentication is a critical item regarding security. The overall internet community have been refining authentication standards in order to improve overall safety. We can mention here [OIDC standard](https://openid.net/specs/openid-connect-core-1_0.html), based on OAUTH, that [RFC-7628](https://datatracker.ietf.org/doc/html/rfc7628) allows applying on IMAP and SMTP. Regarding HTTP applications (including JMAP clients) the industry commonly requires "Single Sign On" and "Single Log Out" features. Nowadays, James only supports plain auth for IMAP, SMTP. In JMAP, we do support HTTP basic authentication, and a set of custom authentication methods, one being based on custom JWT. None matches the constraints mentioned above. We believe having more control on authentication methods, and the option to choose state-of-the-art authentication methods would ultimately increase the overall security of the James server and ease adoption. ## Decision Provide OIDC integration for the following email protocols: IMAP, SMTP, JMAP. Regarding JMAP, we propose ourselves to make authentication methods extensible and configurable. We will provide a simple authentication method blindly following the value of the `X-User` header. This would allow us to configure an API gateway in front of James and delegate it the OIDC management. Regarding IMAP and SMTP we will implement RFC-7628 within James. We will validate the validity of the Authorization Bearer token against the public exposed by the JWKS endpoint. We will document such a setup, and provide a working example under the form of a docker-compose using [Keycloack](https://www.keycloak.org/) as an OIDC provider and [Krakend](https://www.krakend.io/) as an API gateway. We will allow configuring and un-configuring any of the configuration mechanism. For instance, it will be possible to operate an OIDC-only James server. ## Consequences The `X-User` authentication mechanism should be enabled with care as it allows the API gateway to bypass authentication with the James server. Given such an OIDC setup, an attacker gaining direct access to the James server would trivially access user accounts. Client headers propagation furthermore needs to be done with care. ===================================================== == File: src/adr/0019-reactor-netty-adoption.md ===================================================== # 19. Reactor-netty adoption for JMAP server implementation Date: 2020-02-28 ## Status Accepted (lazy consensus) & implemented ## Context After adopting the last specifications of JMAP (see [new JMAP specifications adoption ADR](https://github.com/apache/james-project/blob/master/src/adr/0018-jmap-new-specs.md)), it was agreed that we need to be able to serve both `jmap-draft` and the new `jmap` with a reactive server. The current outdated implementation of JMAP in James is currently using a non-reactive [Jetty server](https://www.eclipse.org/jetty/). There are many possible candidates as reactive servers. Among the most popular ones for Java: * [Spring](https://spring.io) * [Reactor-netty](https://github.com/reactor/reactor-netty) * [Akka HTTP](https://doc.akka.io/docs/akka-http/current/introduction.html) * ... ## Decision We decide to use `reactor-netty` for the following reasons: * It's a reactive server * It's using [Reactor](https://projectreactor.io/), which is the same technology that we use in the rest of our codebase * Implementing JMAP does not require high level HTTP server features ## Consequences * Porting current `jmap-draft` to use a `reactor-netty` server instead of a Jetty server * The `reactor-netty` server should serve as well the new `jmap` implementation * We will be able to refactor and get end-to-end reactive operations for JMAP, unlocking performance gains ## References * JIRA: [JAMES-3078](https://issues.apache.org/jira/browse/JAMES-3078) * JMAP new specifications adoption ADR: https://github.com/apache/james-project/blob/master/src/adr/0018-jmap-new-specs.md ===================================================== == File: src/adr/0054-elasticsearch-search-overrides.md ===================================================== # 54. ElasticSearch search overrides Date: 2022-05-16 ## Status Accepted (lazy consensus). Implemented. ## Context IMAP SEARCH requests can of course be used for user searches. But many applications (eg Samsung email client) also uses IMAP SEARCH for resynchronization. The use of ElasticSearch in the context of resynchronization is a problem as: - Resynchronization incurs many requests that ElasticSearch is not made to cope with. - This has a performance impact, and some 60+ seconds can be spotted. - ElasticSearch indexing is asynchronous which is not ideal for resynchronization - An ElasticSearch downtime would imply a full downtime for these clients. Those resynchronization queries would better be served by the metadata database ## Decision Define an API, `SearchOverride` that can be called on matching search queries and thus offload ElasticSearch. Provide an extension mechanism for search overrides, where potentially custom implementations can be loaded from the configuration. Provide well targeted `SearchOverride`, implemented on top of `Cassandra` database. ## Consequences We expect to : - Observe less IMAP SEARCH slow requests - ElasticSearch downtime should not impact IMAP clients using IMAP SEARCH like IMAP Samsung application - Thus also be able to support a higher IMAP workload as Cassandra is more suited to resynchronisation requests ## Sample IMAP requests ``` SearchOperation{key=SearchKey{type=TYPE_UID, date=null, size=0, value=null, seconds=-1, modSeq=-1, uids=[IdRange : TYPE: FROM UID: MessageUid{uid=1}:MessageUid{uid=9223372036854775807}], sequences=null, keys=Optional.empty}, options=[]} ``` ``` SearchOperation{key=SearchKey{type=TYPE_AND, date=null, size=0, value=null, seconds=-1, modSeq=-1, uids=null, sequences=null, keys=Optional[[ ===================================================== == File: src/adr/0040-quality-levels-definitions.md ===================================================== # 40. Quality levels definition Date: 2020-06-21 ## Status Accepted (lazy consensus) ## Context We hereby define as an artifact compiled artifact that external people consumes. This includes: - libraries - Mail servers - Extensions for James Mail Servers - Command line tools We designate as a feature an optional, opt-in behaviour of a James server that can be configured by user willing to rely on it. James as a project delivers several artifacts, and features. In order for project users to better understand the underlying quality of the artifact they use, as well as the level of risk associated, we need to better define some quality levels. ## Decision For a given artifact or feature, by **mature** we mean that: - *interfaces* in components need a contract test suite - *interfaces* have several implementations - *implementation* of these interfaces need to pass this contract test suite which provides unit tests - Decent integration tests coverage is needed - Performance tests need to be conducted out - Quality Assurance with external clients needs to be conducted out - known existing production deployments/usages - usable documentation This is the maximum quality level delivered by the James project. Users should feel confident using these artifacts or features. By **experimental** we designate an artifact or feature not matching yet the above requirements. However some active contributors are willing to raise the quality level of this component, and eventually make it mature. Or at least are willing to support users. Users should have low expectations regarding experimental artifacts or features. They are encouraged to contribute to them in order to raise its quality. By **unsupported** we mean that an artifact or feature do not match most of the *mature* quality conditions. Active contributors do not feel confident delivering support for it. This artifact or feature might be deprecated and removed from future James releases. Users are strongly encouraged to contribute to the artifact development. ===================================================== == File: src/adr/0056-opensearch-migration.md ===================================================== # 56. OpenSearch migration Date: 2022-08-11 ## Status Accepted (lazy consensus). Implemented. Migration from OpenSearch high-level-rest-client to OpenSearch rest-client remains to be done. ## Context James distributed server historically uses ElasticSearch software to empower search features. As off Apache James 3.7.0, we relied on ElasticSearch 7.10. However, [ElasticSearch changed their licenses terms](https://www.elastic.co/pricing/faq/licensing), both for the servers and driver libraries, choosing the SSPL (Server Side Public License), a [non-OSI compliant license](https://opensource.org/node/1099). As such, this clashes from a requirement for Apache projects to rely on ASF v2 compatible client libraries. Similarly, requiring a non-free software as a dependency would have been allowed but is a clear infringement to the ASF philosophy when free-er alternatives are available. Alternative forks have emerged from ElasticSearch 7.10, one could mention [Open Distro for ElasticSearch](https://opendistro.github.io/for-elasticsearch/) which was renamed [OpenSearch](https://opensearch.org/), whose 1.x release line is fully compatible with ElasticSearch 7.10 driver, meaning that Apache James 3.7.0 users can use OpenSearch as an alternative to OpenSearch. However, to fix security issues in its dependencies, we need to upgrade the ElasticSearch driver, which cannot be done without license infringement and hurting OpenSearch compatibility. Similarly, OpenSearch 2.x introduces subtle differences that makes its driver no longer compatible with ElasticSearch 7.10. ## Decision Switch to OpenSearch drivers and fully adopt OpenSearch as the search backend for the Distributed James server. First, conduct the easy migration toward OpenSearch high-level-rest-client (with dependencies to the whole openSearch eco-system), then conduct the more expensive migration to the rest-client (only dependencies to an http client and JSON parsing libraries). ## Consequences Users are expected to deploy and use OpenSearch. Configuration need to be adapted too. Users will not be able to use James Distributed server on top of ElasticSearch product anymore. ## Alternatives Not upgrading exposes us to security vulnerabilities and as such is not an option. ===================================================== == File: src/adr/0042-james-cli-based-on-webadmin.md ===================================================== # 42. James CLI based on webadmin API Date: 2020-10-05 ## Status Accepted (lazy consensus). Partially implemented. ## Context James servers offer a command-line interface in order to interact with the server. However, it relies on the JMX protocol, which is known to be insecure. The JMX server embedded in Apache James, also used by the command line client is exposed to a java de-serialization issue according to [NVD-CVE-2017-12628 Detail](https://nvd.nist.gov/vuln/detail/CVE-2017-12628), and thus can be used to execute arbitrary commands. Besides, the current CLI interface is also not optimal for users. It places actions in front of entities with contiguous syntax, making it harder for the user to remember the command (for example, which entity the GET action command can interact with). If we design to place the entity first and the outgoing actions can interact with that entity afterward, the user will easily imagine what he/she can do with each entity. This creates an intuitive interface that is easier to remember. Webadmin APIs use HTTP protocol, which is more secure than JMX protocol to interact with James servers. Webadmin command-line interface is an upcoming replacement for the outdated, security-vulnerable JMX command-line interface. ## Decision We decided to write a new CLI client, running on top of the JVM, communicating with James via the webadmin protocol, using http. * What libraries will we use? * http client: ***Feign library***. We used it as an http client in other parts of James so we continue to use it. * CLI: ***Picocli library***. Picocli is a one-file command line parsing framework written in Java that allows us to create command line applications with almost no code. It allows mixing Options with positional Parameters (Eg: no need to the follow order Options then Parameters), [automatic type conversion](https://picocli.info/#_strongly_typed_everything) of command line arguments to the type of the annotated field, provide Automatic Help and better Subcommand Support, easily handle Exceptions. * How will we limit breaking changes this new CLI will cause? * Work on a wrapper to adapt the old CLI API. * Where will we locate this cli code? * server/protocols/webadmin-cli * Write a man page. * Picocli generates beautiful documentation for our CLI (HTML, PDF and Unix man pages). * We decided to adopt a more modern, modular CLI syntax: ``` $ ./james-cli [OPTION] ENTITY ACTION {ARGUMENT} ``` where OPTION: optional parameter when running the command line, ===================================================== == File: src/adr/0003-distributed-workqueue.md ===================================================== # 3. Distributed WorkQueue Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented Superceded by [16. Distributed WorkQueue](0016-distributed-workqueue.md) ## Context By switching the task manager to a distributed implementation, we need to be able to run a `Task` on any node of the cluster. ## Decision For the time being we will keep the sequential execution property of the task manager. This is an intermediate milestone toward the final implementation which will drop this property. * Use a RabbitMQ queue as a workqueue where only the `Created` events are pushed into. This queue will be exclusive and events will be consumed serially. Technically this means the queue will be consumed with a `prefetch = 1`. The queue will listen to the worker on the same node and will ack the message only once it is finished (`Completed`, `Failed`, `Cancelled`). ## Consequences * It's a temporary and not safe to use in production solution: if the node promoted to exclusive listener of the queue dies, no more tasks will be run * The serial execution of tasks does not leverage cluster scalability. ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0009-java-11-migration.md ===================================================== # 9. Migration to Java Runtime Environment 11 Date: 2019-10-24 ## Status Accepted & implemented ## Context Java 11 is the only "Long Term Support" java release right now so more and more people will use it exclusively. James is known to build with Java Compiler 11 for some weeks. ## Decision We adopt Java Runtime Environment 11 for James as a runtime to benefits from a supported runtime and new features of the languages and the platform. ## Consequences * It requires the upgrade of Spring to 4.3.x. * All docker images should be updated to adoptopenjdk 11. * The documentation should be updated accordingly. ## References * [Mailing list thread](https://www.mail-archive.com/server-dev@james.apache.org/msg62611.html) * [Mailing list thread](https://www.mail-archive.com/server-dev@james.apache.org/msg61335.html) * [PR discussing this ADR](https://github.com/apache/james-project/pull/171) ===================================================== == File: src/adr/0065-changing-username.md ===================================================== # 65. Changing username Date: 2023-03-17 ## Status Accepted (lazy consensus). Implemented. ## Context Changing username is a desired feature for an email server. It is a common practice especially when a user marries or divorces. For example: Alice MARTINEZ have an email address `alice.martinez@domain.tld` and gets married to Bob ERNANDEZ. She thus wants to change her email address to `alice.ernandez@domain.tld` while preserving her email data. Nowadays, James uses username as an identifier for user data. Therefore, this feature is hard to implement because of changing directly identifier to another value is difficult and could break data consistency if we do not do it carefully. ## Decision We decided to do changing username with two steps: first, create new username, then migrate the old user's data to the new account - the way we expect that is less dangerous to current data consistency. The data in the old account need to be truncated after migrating to the new account. For the data migration step, we decided to form it under a webadmin task with a modular design. A big data migration task contains many small tasks that implement `UsernameChangeTaskStep` interface. This modular design for migration steps could help developers easier to manage/test each step, and help other tailor James servers can implement their own steps as well. Today, implemented migration steps are: - `ForwardUsernameChangeTaskStep`: creates forward from the old user to the new user and migrates existing forwards - `FilterUsernameChangeTaskStep`: migrates users filtering rules - `DelegationUsernameChangeTaskStep`: migrates delegations where the impacted user is either delegatee or delegator - `MailboxUsernameChangeTaskStep`: migrates mailboxes belonging to the old user to the account of the new user. It also migrates users' mailbox subscriptions. - `ACLUsernameChangeTaskStep`: migrates ACLs on mailboxes the migrated user has access to and updates subscriptions accordingly. We introduce `fromStep` query parameter that allows skipping previous steps, allowing the operator to resume the username change from a failed step. This option could ease operators in case the data migration fails in the middle. ## Consequences - Add one more useful feature to James rich feature set: Users can change their name while preserving their email data. - Modular design for changing username is extension friendly for tailor James servers. - Users would be aware that they have a new account through a new username/password. No implicit migration without user attention is archived today. - JMAP Identity data is not migrated because they are tightly coupled to the old username, users should create identities again themselves. - Some data considered not critical like Push subscription, Vacation response,... are not migrated today. Contributions for them are welcome. ## Alternatives We could have another choice for implementing this topic: create an account identifier not linked directly to the username (e.g a hash value points to a username), so changing the pointer value would be easier than changing the pointer itself. However, that approach has two great concerns: - Huge refactoring/breaking change is required: nowadays username as an identifier is used everywhere in tables schema and code. ===================================================== == File: src/adr/0025-cassandra-blob-store-cache.md ===================================================== # 25. Cassandra Blob Store Cache Date: 2020-04-03 ## Status Accepted (lazy consensus) & implemented Supercedes [14. Add storage policies for BlobStore](0014-blobstore-storage-policies.md) ## Context James exposes a simple BlobStore API for storing raw data. However such raw data often vary in size and access patterns. As an example: - Mailbox message headers are expected to be small and frequently accessed - Mailbox message body are expected to have sizes ranging from small to big but are unfrequently accessed - DeletedMessageVault message headers are expected to be small and unfrequently accessed The access pattern of some of these kind of blobs does not fit Object Storage characteristics: good at storing big blobs, but it induces high latencies for reading small blobs. We observe latencies of around 50-100ms while Cassandra latency is of 4ms. This gets some operations slow (for instance IMAP FETCH headers, or listing JMAP messages). ## Decision Implement a write through cache to have better read latency for smaller objects. Such a cache needs to be distributed in order to be more efficient. Given that we don't want to introduce new technologies, we will implement it using Cassandra. The cache should be implemented as a key-value table on a dedicated 'cache' keyspace, with a replication factor of 1, and be queried with a consistency level of ONE. We will leverage a configurable TTL as an eviction policy. Cache will be populated upon writes and missed read, if the blob size is below a configurable threashold. We will use the TimeWindow compaction strategy. Failure to read the cache, or cache miss will result in a read in the object storage. ## Consequences Metadata queries are expected not to query the object storage anymore. [Performance tests](https://github.com/linagora/james-project/pull/3031#issuecomment-572865478) proved such strategies to be highly effective. We expect comparable performance improvements compared to an un-cached ObjectStorage blob store. HybridBlobStore should be removed. ===================================================== == File: src/adr/0029-Cassandra-mailbox-deletion-cleanup.md ===================================================== # 29. Cassandra mailbox deletion cleanup Date: 2020-04-12 ## Status Accepted (lazy consensus) & implemented ## Context Cassandra is used within distributed James product to hold messages and mailboxes metadata. Cassandra holds the following tables: - mailboxPathV2 + mailbox allowing to retrieve mailboxes informations - acl + UserMailboxACL hold denormalized information - messageIdTable & imapUidTable allow to retrieve mailbox context information - messageV2 table holds message metadata - attachmentV2 holds attachments for messages - References to these attachments are contained within the attachmentOwner and attachmentMessageId tables Currently, the deletion only deletes the first level of metadata. Lower level metadata stay unreachable. The data looks deleted but references are actually still present. Concretely: - Upon mailbox deletion, only mailboxPathV2 & mailbox content is deleted. messageIdTable, imapUidTable, messageV2, attachmentV2 & attachmentMessageId metadata are left undeleted. - Upon mailbox deletion, acl + UserMailboxACL are not deleted. - Upon message deletion, only messageIdTable & imapUidTable content are deleted. messageV2, attachmentV2 & attachmentMessageId metadata are left undeleted. This jeopardize efforts to regain disk space and privacy, for example through blobStore garbage collection. ## Decision We need to cleanup Cassandra metadata. They can be retrieved from dandling metadata after the delete operation had been conducted out. We need to delete the lower levels first so that upon failures undeleted metadata can still be reached. This cleanup is not needed for strict correctness from a MailboxManager point of view thus it could be carried out asynchronously, via mailbox listeners so that it can be retried. ## Consequences Mailbox listener failures lead to eventBus retrying their execution, we need to ensure the result of the deletion to be idempotent. ## References - [JIRA](https://issues.apache.org/jira/browse/JAMES-3148) ===================================================== == File: src/adr/0064-account-delegation.md ===================================================== # 64. Account Delegation Date: 2022-11-15 ## Status Accepted (lazy consensus). Implemented. ## Context The account delegation is a feature that gives another permission to access your account. The user that had been granted access begin accessing that account then read, send, respond to, and delete email messages... on your behalf. This feature is useful for VIP (who have secretaries), admins, etc... James currently supports account delegation in IMAP / SMTP through SASL OIDC as well as SASL AUTH PLAIN (https://github.com/apache/james-project/blob/master/src/adr/0061-delegation.md) Current now James support `urn:apache:james:params:jmap:mail:shares extension`, but it only affects the mailbox scope. ## Decision Based on DelegationStore API, provide a James specific JMAP extension for managing delegation. - Provide JMAP methods: - Delegate/get: list email addresses can the user access - Delegate/set (create/delete): please note that only the owner of the account should be able to interact with the delegation settings + Delegate my account to other people + Revoke delegation of my account on another person's account (revoke a right given to me) + Revoke delegation of another people's account on my account (revoke a right given to others) - DelegatedAccount/get: the method for getting delegated accounts - DelegatedAccount/set-delete: the method for delete delegated account JMAP endpoints should support being called with accountIds of delegated accounts and needs to proceed authorization logic according to delegations. ## Consequences The account delegation will help owner and delegated account: - Multi-users can use a shared account - Can give different limited access to each user - Bring some commonly expected collaborative features - We would need a way to "list accounts delegated to me" in the delegation store. We could use Cassandra LOGGED batch to keep this eventually consistent - The mailboxSession needs to cary over information regarding logged-in user to allow restricting access to the delegation JMAP methods to only the account owner. ## References - [JIRA](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-3756) - [JMAP Sharing](https://datatracker.ietf.org/doc/draft-ietf-jmap-sharing/) - [James Delegation](https://github.com/apache/james-project/blob/master/src/adr/0061-delegation.md) ===================================================== == File: src/adr/0046-generalize-event-bus.md ===================================================== #46. Generalize EventBus Date: 2020-06-11 ## Status Implemented, used for JMAP notifications, however not yet used on top of the user entity as described in this document. ## Context User email storage usage is limited both in size and count via quotas (IMAP RFC-2087). In order to ease administrating large user bases, the quota search extension allows administrator to retrieve all users whose email usages are exceeding a given occupation ratio. When searching for users by quota ratio if we set the value of the parameters to 0, for example: `/quotas/users?minOccupationRatio=0&maxOccupationRatio=0`, the search feature is supposed to return newly created users who have not received any email yet at that point. However, this is not the case because the quotas are currently being initialized only after a user has received the first email. We need to initialize user quotas upon user creation time. The problem is: there is currently no event at user creation and since the quota-search feature is a plugin of James, it cannot be hardwired into the domain logic of user management to initialize the quota for a just created user. ## Decision For quota-search to be initialized/removed for a given user while keeping this feature as a plugin, we decided to adopt the Event Driven pattern we already use in Mailbox-api. We can create new events related to user management (UserCreated, UserRemoved and so on). To achieve that, we will extract the EventBus out of mailbox-api in order to make it a utility component (eventbus-api), then we will make both mailbox-api and data-api depend on that new module. ## Consequences Mailbox-api would leverage the EventBus to keep exposing the mailbox-listener-api without changes on top of the generified EventBus. We need to define a common Event interface in eventbus-api, then each EventBus usage will define its own sealed event hierarchy implementing Event. DeadLetter storage needs to be reworked in order to store events of various EventBus separately (which is needed for knowing which EventBus the event should be reprocessed on and knowing which sealed hierarchy an event belongs to.) As a consequence, we will need a Cassandra data migration to add the EventBus name as part of the EventDeadLetter primary key. We could rely on the EventBus reliability for building any feature in James. ===================================================== == File: src/adr/0001-record-architecture-decisions.md ===================================================== # 1. [JAMES-2909] Record architecture decisions Date: 2019-10-02 ## Status Proposed ## Context In order to be more community-oriented, we should adopt a process to have a structured way to have open architectural decisions. Using an Architectural Decision Records-based process as a support of discussion on the developers mailing-lists. ## Decision We will use Architecture Decision Records, as [described by Michael Nygard](https://web.archive.org/web/20190824074401/http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). Each ADR will be discussed on the Apache James' developers mailing-list before being accepted. Following [Apache Decision Making process](https://community.apache.org/committers/decisionMaking.html), we provide the following possible status, with their associated meaning: - `Proposed`: The decision is being discussed on the mailing list. - `Accepted (lazy consensus)` : the architecture decision was proposed on the mailing list, and a consensus emerged from people involved in the discussion on the mailing list. - `Accepted (voted)` : the architecture undergo a voting process. - `Rejected` : Consensus built up against that proposal. ## Consequences See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools). We should provide in a mutable `References` section links to related JIRA meta-ticket (not necessarily to all related sub-tickets) as well as a link to the mail archive discussion thread. JIRA tickets implementing that architecture decision should also link the related Architecture Decision Record. ## References * [JAMES-2909](https://jira.apache.org/jira/browse/JAMES-2909) * [PR discussing this ADR](https://github.com/apache/james-project/pull/166) ===================================================== == File: src/adr/0034-mailbox-api-visibility-and-usage.md ===================================================== # 34. Mailbox API visibility and usage Date: 2020-04-27 ## Status Accepted (lazy consensus) & implemented ## Context All mailboxes implementations rely on `mailbox-store` module that defines some common tools to implement the `mailbox-api` (representing the API defining how to use a mailbox). For example, a `CassandraMailboxmanager` has to extend `StoreMailboxManager` (that implements `Mailboxmanager` from the `mailbox-api`) that requires the implementation of some `Mapper`s. `Mapper`s are designed to provide low-level functions and methods on mailboxes. It's recurrent that we are tempted in James, outside of the `mailbox` modules, to rely on some of those common tools located in `mailbox-store` to have an easier access on some user's mailboxes or messages. Like for example, using a `Mapper` outside to be able to retrieve a message with only its `MessageId`, which is not currently possible at the `Manager`'s level, which tends to violate `mailbox-api`'s role and primary mission. As a matter of fact, we have currently such uses of `mailbox-store` in James: * `mailbox-adapter` because `Authenticator` and `Authorizator` are part of the `mailbox-store` The manager layer do further validation including right checking, event dispatching (resulting in message search index indexing, current quota calculation mainly), quota validation. Not relying on the manager layer is thus error prone and can lead to security vulnerabilities. ## Decision We should never rely on classes defined in `mailbox-store` outside of the `mailbox` modules (except on some cases limited to the test scope). The right way would be to always rely on the `Manager`s defined in `mailbox-api` module to access mailboxes and messages, as the `mailbox-api` module defines the API on how to use a mailbox. We should ensure the correctness of `Manager`s implementations by providing contract tests and not by sharing abstract classes. Regarding the modules wrongly relying already on `mailbox-store`, we can: * `mailbox-adapter`: move `Authenticator` and `Authorizator` to `mailbox-api` ## Consequences We need to introduce some refactorings to be able to rely fully on `mailbox-api` in new emerging cases. For example, our `mailbox-api` still lacks APIs to handle messages by their MessageId. It creates some issues for rebuilding a single message fast view projection, or the reindexation of a single message. ===================================================== == File: src/adr/0018-jmap-new-specs.md ===================================================== # 18. New JMAP specifications adoption Date: 2020-02-06 ## Status Accepted (lazy consensus) & partially implemented ## Context Historically, James has been an early adopter for the JMAP specification, and a first partial implementation was conducted when JMAP was just a draft. But with time, the IETF draft went with radical changes and the community could not keep this implementation up to date with the spec changes. As of summer 2019, JMAP core ([RFC 8620](https://tools.ietf.org/html/rfc8620)) and JMAP mail ([RFC 8621](https://tools.ietf.org/html/rfc8621)) have been officially published. Thus we should implement these new specifications to claim JMAP support. We need to keep in mind though that part of the community actively relies on the actual 'draft' implementation of JMAP existing in James. ## Decision We decided to do as follow: * Rename packages `server/protocols/jmap*` and guice packages `server/container/guice/protocols/jmap*` to `jmap-draft`. `JMAPServer` should also be renamed to `JMAPDraftServer` (this has already been contributed [here](https://github.com/apache/james-project/pull/164), thanks to @cketti). * Port `jmap-draft` to be served with a reactive technology * Implement a JMAP meta project to select the JMAP version specified in the accept header and map it to the correct implementation * Create a new `jmap` package * Implement the new JMAP request structure with the [echo](https://jmap.io/spec-core.html#the-coreecho-method) method * Implement authentication and session of the new JMAP protocol * Implement protocol-level error handling * Duplicate and adapt existing mailbox methods of `jmap-draft` to `jmap` * Duplicate and adapt existing email methods of `jmap-draft` to `jmap` * Duplicate and adapt existing vacation methods of `jmap-draft` to `jmap` * Support uploads/downloads Then when we finish to port our existing methods to the new JMAP specifications, we can implement these new features: * Accounts * Identities * EmailSubmission * Push and queryChanges * Threads We decided to support `jmap` on top of memory-guice and distributed-james products for now. We should ensure no changes is done to `jmap-draft` while implementing the new `jmap` one. Regarding the versioning in the accept headers: * `Accept: application/json;jmapVersion=draft` would redirect to `jmap-draft` * `Accept: application/json;jmapVersion=rfc-8621` would redirect to `jmap` ===================================================== == File: src/adr/0035-distributed-listeners-configuration.md ===================================================== # 35. Distributed Mailbox Listeners Configuration Date: 2020-04-23 ## Status Proposed Supercedes [26. Removing a configured additional MailboxListener](0026-removing-configured-additional-mailboxListeners.md) Not implemented yet. ## Context James enables a user to register additional mailbox listeners. The distributed James server is handling mailbox event processing (mailboxListener execution) using a RabbitMQ work-queue per listener. Mailbox listeners can be registered to be triggered every time an event is generated by user interaction with their mailbox. They are being executed in a distributed fashion following the workqueue messaging pattern. The "group" is an attribute of the mailbox listener identifying to which work queue they belong. More information about this component can be found in [ADR 0036](0037-eventbus.md). Currently, mailbox listeners are determined by the guice bindings of the server and additional mailbox listeners defined via configuration files. While the configuration might be specific for each James server, what actually is defined in RabbitMQ is common. Heterogeneous configuration might then result in unpredictable RabbitMQ resource status. This was left as a limitation of [26. Removing a configured additional MailboxListener](0026-removing-configured-additional-mailboxListeners.md). ## Decision We need to centralize the definition of mailbox listeners. An event sourcing system will track the configured mailbox listeners. It will have the following commands: - **AddListener**: Add a given listener. This should be rejected if the group is already used. - **RemoveListener**: Remove a given listener. Configuration changes are not supported. The administrator is expected to remove the given listener, then add it again. It will have the following events: - **ListenerAdded**: A mailbox listener is added - **ListenerRemoved**: A mailbox listener is removed ===================================================== == File: src/adr/0062-oidc-token-introspection.md ===================================================== # 62. OIDC token introspection Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. Complements [ADR 51](0051-oidc.md). ## Context [ADR 51](0051-oidc.md) describes work required for OIDC adoption within James. This work enables the uses of an OIDC access token to authenticate using IMAP and SMTP. It validates the signature of the token using cryptographic materials exposes by the Identity Provider server through the mean of a JWKS endpoint. Yet no effort is made to see if the access token in question was revoked or not, which can pause a security threat. OIDC ecosystem can support the following mechanisms to determine if an access token had been revoked: - Use of an introspection endpoint: the application asks the OIDC server to validate the token through an HTTP call. This result in load on the identity provider, which becomes central to the authentication process. This can be assimilated to a 'synchronous' mode. - Use of back-channel upon token revocation. The OIDC provider is then responsible to call an applicative endpoint to invalidate a token. Invalidated tokens are then stored by the application and access token are challenged against that storage. This approach scales better yet is harder to implement and can be seen as less secure (a network incident can prevent revoked token propagation to applications for instance). This can be seen as an 'asynchronous' mode. Also, we need to keep in mind that OIDC validation is only done upon establishing the connection in IMAP/SMTP (as they are connected protocols) which defers from stateless protocols like HTTP. Performance impact of token introspection is thus lower for connected protocols. ## Decision Allow opt-in use of an introspection endpoint to further secure IMAP/SMTP OIDC implementation. ## Consequences Security gains for the IMAP/SMTP OIDC implementation in James. ## References - [JIRA JAMES-3755](https://issues.apache.org/jira/browse/JAMES-3755) - [RFC-7628](https://www.rfc-editor.org/rfc/rfc7628.html) SASL OATH mechanism for SMTP and IMAP: https://datatracker.ietf.org/doc/html/rfc7628 - [RFC-7662](https://datatracker.ietf.org/doc/html/rfc7662) OAUTH token introspection ===================================================== == File: src/adr/0041-replace-jcloud-with-s3.md ===================================================== # 41. Replace JCloud-based ObjectStorage backend with AWS-S3 SDK backend Date: 2020-02-11 ## Status Accepted (lazy consensus) & implemented Adoption had been backed by some performance tests. ## Context James has an interface called blob-store that allows to choose how Blobs are stored between several implementations. For Distributed product, the default backend is Cassandra because it's fast and it doesn't require yet another server. When storage cost concerns are more important than raw performances, James can store Blobs in S3 or Swift Object Storage technologies. Object Storage is known to be cheap and yet offers guarantee about durability. When we implemented Object Storage blob-store in the past, we decided to implement it with [Apache jcloud library](https://jclouds.apache.org/) because we wanted to target both S3 and Swift API. However, we found that our implementation was complex and it didn't fit the Reactive style we now have in the codebase. It also contribute negatively to the project build time. At the same time, we figured out Swift was providing a good compatibility layer for S3 and that we may drop our Swift code without dropping Swift support at the same time. ## Decision * Use AWS S3 v2 SDK to implement a Reactive S3 blob-store (`blobstore-s3`). * Replace current `blob-store-objectstorage` with `blobstore-s3` * Run load tests to ensure there's no penalty when switching from Swift to S3 over Swift ## Consequences * We have to document carefully how to transition from `blob-store-objectstorage` with `blobstore-s3` in the configuration and how to handle existing data * We need to work on a new implementation of blob encryption. ## References * [JAMES](https://issues.apache.org/jira/browse/JAMES-3028) * [Pull request tree](https://github.com/linagora/james-project/pull/3773) ===================================================== == File: src/adr/0036-against-use-of-conditional-statements-in-guice-modules.md ===================================================== # 36. Against the use of conditional statements in Guice modules Date: 2019-12-29 ## Status Accepted (lazy consensus) & implemented ## Context James products rely historically on Spring for dependency injection. It doesn't use last major Spring version (4.x instead of 5.x). James uses Spring in a way that enables overriding any class via a configuration file thus endangering overall correctness by giving too much power to the user. James proposes several implementations for each of the interfaces it defines. The number of possible combinations of implementations is thus really high (like factorial(n) with n > 10). It makes it unpractical to run tests for each possible component combination. We run integration tests for combinations that we decide brings the more value to the users. Spring product defeats this testing logic by allowing the user arbitrary classes combination, which is likely not being tested. Instead of having a single product allowing all component combination, we rather have several products each one exposing a single component combination. Components are defined by code in a static fashion. We thus can provide a decent level of QA for these products. Overriding components requires explicit code modification and recompilation, warning the user about the impact of the choices he does, and lowering the project's responsibility. Guice had been enacted as a way to reach that goal. With Guice we expose only supported, well tested combinations of components, thus addressing the combination issue. Spring application often bring dependencies conflicts, for example between Lucene and ElasticSearch components, leading to potential runtime or compile time issues. Instead of having a single big application being able to instantiate each and every component application, we have several products defining their dependencies in a minimalistic way, relying only on the components implementation that are needed. Here is the list of products we provide: - In-Memory: A memory based James server, mainly for testing purposes - Distributed James: A scalable James server, storing data in various data stores. Cassandra is used for metadata, ElasticSearch for search, RabbitMQ for messaging, and ObjectStorage for blobs. - Cassandra: An implementation step toward Distributed James. It does not include messaging and ObjectStorage and should not be run in a cluster way but is still relevant for good performance. - JPA: A JPA and Lucene based implementation of James. Only Derby driver is currently supported. - JPA with SMTP only using Derby: A minimalist SMTP server based on JPA storage technology and Derby driver - JPA with SMTP only using MariaDB: A minimalist SMTP server based on JPA storage technology and MariaDB driver Some components however do have several implementations a user can choose from in a given product. This is the case for: - BlobExport: Exporting a blob from the blobStore to an external user. Two implementations are currently supported: localFiles and LinShare. - Text extraction: Extracting text from attachment to enable attachment search. There is a Tika implementation, but lighter JSOUP based, as well as no text extraction options are also available. ===================================================== == File: src/adr/0011-remove-elasticsearch-document-source.md ===================================================== # 11. Disable ElasticSearch source Date: 2019-10-17 ## Status Rejected The benefits do not outweigh the costs. ## Context Though very handy to have around, the source field does incur storage overhead within the index. ## Decision Disable `_source` for ElasticSearch indexed documents. ## Consequences Given a dataset composed of small text/plain messages, we notice a 20% space reduction of data stored on ElasticSearch. However, patch updates can no longer be performed upon flags updates. Upon flag update we need to fully read the mail content, then mime-parse it, potentially html parse it, extract attachment content again and finally index again the full document. Without `_source` field, flags update is two times slower, 99 percentile 4 times slower, and this impact negatively other requests. Note please that `_source` allows admin flexibility like performing index level changes without downtime, amongst others: - Increase shards - Modifying replication factor - Changing analysers (IE allows an admin to configure FR analyser instead of EN analyser) ## References - https://www.elastic.co/guide/en/elasticsearch/reference/6.3/mapping-source-field.html - [JIRA](https://issues.apache.org/jira/browse/JAMES-2906) - [PR discussing this ADR](https://github.com/apache/james-project/pull/171) ===================================================== == File: src/adr/0059-upgrade-to-cassadra-driver-4.md ===================================================== # 59. Upgrade to Cassandra driver 4 Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. ## Context Cassandra driver 3 latest release took pace in 201X. An outdated dependency pauses a security risk. Moreover Cassandra driver 4: - Have prime reactive support and do not need to pass through an intermediate "CompletableFuture" representation which is more optimised. - In Cassandra driver 3, paging is blocking. Handling paging the reactive way means we do not need to aggressively switch the processing to an elastic thread, which helps keeping the count of threads low. - Cassandra driver 4 has built in support for advanced driver configuration tuning without the need for the application to programmatically configure the driver. This means great flexibility without the need for the application to proxy the driver configuration parameters. ## Decision Upgrade James to Cassandra driver 4. Handle Cassandra requests callbacks on the Cassandra driver thread. ## Consequences We expect a performance enhancement for native reactive support from the Cassandra driver, as well as a better thread handling which translate to improved latencies/throughput. This code change needs a rewrite of all the Cassandra data access layer. Associated risk: - Blocking on the Cassandra driver thread is prohibited. Tools like Blockhound can be adapted to mitigate this. - Blocking a Cassandra request from within a Cassandra driver thread result in a request timeout. - Long running computation should be switched to other threads as it can prevent other Cassandra requests from being executed. Mechanisms related to Cassandra driver configuration will need to be reworked. This leads to a breaking change but our Cassandra driver configuration will be simpler and more standard. ## References - [JIRA JAMES-3774](https://issues.apache.org/jira/browse/JAMES-3774) ===================================================== == File: src/adr/0071-postgresql-mailbox-tables-structure.md ===================================================== # 71. Postgresql Mailbox tables structure Date: 2023-12-14 ## Status Implemented ## Context As described in [ADR-70](link), we are willing to provide a Postgres implementation for Apache James. The current document is willing to detail the inner working of the mailbox of the target implementation. ## Decision  Table list: - mailbox - mailbox_annotations - message - message_mailbox - subscription Indexes in table message_mailbox: - message_mailbox_message_id_index (message_id) - mailbox_id_mail_uid_index (mailbox_id, message_uid) - mailbox_id_is_seen_mail_uid_index (mailbox_id, is_seen, message_uid) - mailbox_id_is_recent_mail_uid_index (mailbox_id, is_recent, message_uid) - mailbox_id_is_delete_mail_uid_index (mailbox_id, is_deleted, message_uid) Indexes are used to find records faster. The table structure is mostly normalized which mitigates storage costs and achieves consistency easily. Foreign key constraints (mailbox_id in mailbox_annotations, message_id in message_mailbox) help to ensure data consistency. For example, message_id 1 in table message_mailbox could not exist if message_id 1 in table message does not exist For some fields, hstore data type are used. Hstore is key-value hashmap data structure. Hstore allows us to model complex data types without the need for complex joins. Special postgres clauses such as RETURNING, ON CONFLICT are used to ensure consistency without the need of combining multiple queries in a single transaction. ## Consequences Pros: - Indexes could increase query performance significantly Cons: - Too many indexes in a table could reduce the performance of updating data in the table ## Alternatives ===================================================== == File: src/adr/0016-distributed-workqueue.md ===================================================== # 16. Distributed WorkQueue Date: 2019-12-03 ## Status Accepted (lazy consensus) & implemented Supercedes [3. Distributed WorkQueue](0003-distributed-workqueue.md) ## Context By switching the task manager to a distributed implementation, we need to be able to run a `Task` on any node of the cluster. ## Decision For the time being we will keep the sequential execution property of the task manager. This is an intermediate milestone toward the final implementation which will drop this property. * Use a RabbitMQ queue as a workqueue where only the `Created` events are pushed into. Instead of using the brittle exclusive queue mechanism described in [3. Distributed WorkQueue](0003-distributed-workqueue.md), we will now use the natively supported [Single Active Consumer](https://www.rabbitmq.com/consumers.html#single-active-consumer) mechanism. ## Consequences * This solution is safer to use in production: if the active consumer dies, an other one is promoted instead. * This change needs RabbitMQ version to be at least 3.8.0. * The serial execution of tasks still does not leverage cluster scalability. ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) * [PR discussing this ADR](https://github.com/apache/james-project/pull/259) ===================================================== == File: src/adr/0052-pulsar-mailqueue.md ===================================================== # 52. Pulsar MailQueue Date: 2022-01-07 ## Status Accepted (lazy consensus). Implemented. Provides an alternative to [ADR-31 Distributed MailQueue (RabbitMQ + Cassandra)](0031-distributed-mail-queue.md). ## Context ### Mail Queue MailQueue is a central component of SMTP infrastructure allowing asynchronous mail processing. This enables a short SMTP reply time despite a potentially longer mail processing time. It also works as a buffer during SMTP peak workload to not overload a server. Furthermore, when used as a Mail Exchange server (MX), the ability to add delays being observed before dequeing elements allows, among others: - Delaying retries upon MX delivery failure to a remote site. - Throttling, which could be helpful for not being considered a spammer. A mailqueue also enables advanced administration operations like traffic review, discarding emails, resetting wait delays, purging the queue, etc. ### Existing distributed MailQueue Distributed James currently ships a distributed MailQueue composing the following software with the following responsibilities: - **RabbitMQ** for messaging. A rabbitMQ consumer will trigger dequeue operations. - A time series projection of the queue content (order by time list of mail metadata) will be maintained in **Cassandra** . Time series avoid the aforementioned tombstone anti-pattern, and no polling is performed on this projection. - **ObjectStorage** (Swift or S3) holds large byte content. This avoids overwhelming other software which do not scale as well in term of Input/Output operation per seconds. This implementation suffers from the following pitfall: - **RabbitMQ** is hard to reliably operate in a cluster. Cluster queues were only added in the 3.8 release line. Consistency guaranties for exchanges are unclear. - The RabbitMQ Java driver is boiler plate and error prone. Things like retries, exponential back-offs, dead-lettering do not come out of the box. Publish confirms are tricky. Blocking calls are often performed. The driver is not cluster aware and would operate connected to a single host. - The driver reliability is questionable: we experienced some crashed consumers that are never restarted. - Throughput and scalability of RabbitMQ is questionable. - The current implementation does not support priorities, delays. ===================================================== == File: src/adr/0014-blobstore-storage-policies.md ===================================================== # 14. Add storage policies for BlobStore Date: 2019-10-09 ## Status Accepted Adoption had been backed by some performance tests, as well as data repartition between Cassandra and object storage shifts. ## Context James exposes a simple BlobStore API for storing raw data. However such raw data often vary in size and access patterns. As an example: - Mailbox message headers are expected to be small and frequently accessed - Mailbox message body are expected to have sizes ranging from small to big but are unfrequently accessed - DeletedMessageVault message headers are expected to be small and unfrequently accessed Also, the capabilities of the various implementations of BlobStore have different strengths: - CassandraBlobStore is efficient for small blobs and offers low latency. However it is known to be expensive for big blobs. Cassandra storage is expensive. - Object Storage blob store is good at storing big blobs, but it induces higher latencies than Cassandra for small blobs for a cost gain that isn't worth it. Thus, significant performance and cost ratio refinement could be unlocked by using the right blob store for the right blob. ## Decision Introduce StoragePolicies at the level of the BlobStore API. The proposed policies include: - SizeBasedStoragePolicy: The blob underlying storage medium will be chosen depending on its size. - LowCostStoragePolicy: The blob is expected to be saved in low cost storage. Access is expected to be unfrequent. - PerformantStoragePolicy: The blob is expected to be saved in performant storage. Access is expected to be frequent. An HybridBlobStore will replace current UnionBlobStore and will allow to choose between Cassandra and ObjectStorage implementations depending on the policies. DeletedMessageVault, BlobExport & MailRepository will rely on LowCostStoragePolicy. Other BlobStore users will rely on SizeBasedStoragePolicy. Some performance tests will be run in order to evaluate the improvements. ## Consequences We expect small frequently accessed blobs to be located in Cassandra, allowing ObjectStorage to be used mainly for large costly blobs. In case of a less than 5% improvement, the code will not be added to the codebase and the proposal will get the status 'rejected'. We expect more data to be stored in Cassandra. We need to quantify this for adoption. ===================================================== == File: src/adr/0008-distributed-task-await.md ===================================================== # 8. Distributed Task await Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented ## Context By switching the task manager to a distributed implementation, we need to be able to `await` a `Task` running on any node of the cluster. ## Decision * Broadcast `Event`s in `RabbitMQ` ## Consequences * `RabbitMQTaskManager` should broadcast termination `Event`s (`Completed`|`Failed`|`Canceled`) * `RabbitMQTaskManager.await` should: first, check the `Task`'s state; and if it's not terminated, listen to RabbitMQ * The await should have a timeout limit ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0053-email-rate-limiting.md ===================================================== # 53. Email rate limiting Date: 2021-01-10 ## Status Accepted (lazy consensus). Implemented. ## Context Rate limiting is one of the common features expected from an email system. Examples: SaaS is one https://www.fastmail.help/hc/en-us/articles/1500000277382-Account-limits#sending/receiving , https://support.google.com/mail/answer/22839 They limit how many emails users can send/receive from/to each email account over a given period of time. We believe the rate-limiting will help James to have more benefits: - Control of the resources - Easy to configure dynamically the user policy. - Complements the storage quota - Can be a security requirement for SaaS deployments. - Minimise impacts of Open-relay types of compression. - Limiting the amount of emails sent to third parties can also prevent them from considering you as an open relay and can be beneficial as well. ## Decision Set up a new maven project dedicated to rating limiting. This allows the rate limiting mailets to be embedded in a James server as a soft dependency using the external-jar loading mechanism. Please note that this will take the form of an extension jar, that could be dropped in one's James installation, and thus is optional, and not a runtime dependency. Rate limiting will be enabled per sender, per receiver and globally. For each we will provide options for email size and email count. - This can be done via mailets: - PerSenderRateLimit is per sender - PerRecipientRateLimit is per recipient - GlobalRateLimit is for everyone. Depending on the position in the pipeline this could allow rate limiting all emails in transit, relayed emails or locally delivered emails. The rate limit will be configured in [mailetcontainer.xml](/server/apps/distributed-app/sample-configuration/mailetcontainer.xml). - Those mailets will be based on a generic RateLimiter interface. We will propose two implementations for it: - In memory implementation: suitable for single instance deployments. - [Redis](https://redis.io) based implementation: suitable for distributed deployments. We will base on [RateLimitJ](https://github.com/mokies/ratelimitj) to provide the implementation. It is a Java library for rate limiting, assembled using extensible storage (Redis) and application framework adaptors. ===================================================== == File: src/adr/0013-precompute-jmap-preview.md ===================================================== # 13. Precompute JMAP Email preview Date: 2019-10-09 ## Status Accepted (lazy consensus) & implemented ## Context JMAP messages have a handy preview property displaying the firsts 256 characters of meaningful test of a message. This property is often displayed for message listing in JMAP clients, thus it is queried a lot. Currently, to get the preview, James retrieves the full message body, parse it using MIME parsers, removes HTML and keep meaningful text. ## Decision We should pre-compute message preview. A MailboxListener will compute the preview and store it in a MessagePreviewStore. We should have a Cassandra and memory implementation. When the preview is precomputed then for these messages we can consider the "preview" property as a metadata. When the preview is not precomputed then we should compute the preview for these messages, and save the result for later. We should provide a webAdmin task allowing to rebuild the projection. The computing and storing in MessagePreviewStore is idempotent and the task can be run in live without any concurrency problem. Some performance tests will be run in order to evaluate the improvements. ## Consequences Given the following scenario played by 2500 users per hour (constant rate) - Authenticate - List mailboxes - List messages in one of their mailboxes - Get 8 times the properties expected to be fast to fetch with JMAP We went from: - A 7% failure and timeout rate before this change to almost no failure - Mean time for GetMessages went from 9 710 ms to 434 ms (22 time improvment), for all operation from 12 802 ms to 407 ms (31 time improvment) - P99 is a metric that did not make sense because the initial simulation exceeded Gatling (the performance measuring tool we use) timeout (60s) at the p95 percentile. After this proposal p99 for the entire scenario is of 1 747 ms As such, this changeset significantly increases the JMAP performance. ===================================================== == File: src/adr/0067-quota-for-jmap-uploads.md ===================================================== # 67. Quota for JMAP uploads Date: 2023-08-17 ## Status Accepted (lazy consensus). Implemented. Overrides [ADR-48 Cleaup JMAP uploads](0048-cleanup-jmap-uploads.md). ## Context The [JMAP] protocol offers a distinct API to upload blobs, that can later be referenced when creating emails. The specification mentions that implementers `SHOULD` enforce a quota for this use case. For security reason this quota is set by user, and exceeded his quota should result in older data being deleted. Apache James currently do not implement limitations on data being uploaded by users, meaning that authenticated user can essentially store unlimited amount of binary data. This is especially problematic for deployments whose users can be attackers (eg SAAS). ## Decision Implement quota for JMAP uploads. We need a generic interface for JMAP upload quota current values that existing implementation can implement. Store current values on a per user basis. Current value is increased upon uploads, and decreased when a blob is deleted. Limit is set globally via the JMAP configuration. Default value: 10MB. ## Consequences Improved security for SaaS operation. Storing such values in Cassandra incurs a cost as it needs extra tables. The count of tables shall be limited (memory and operational overhead per table.) We plan complementary work to expose a technical Cassandra storage interface for quota, that can be used to implement arbitrary quota-like use cases. Cassandra counters that would be used to keep track of users current space usage are easy to get out of synchronisation (namely because of counters consistency level ONE usage and non-idempotence causing the driver not to retry failed updates). We thus need a corrective task in order to recompute the current values. Care needs to be taken with concurrency. Given the nature of the quota, we expect data races (because 100MB of storage space is not much, exceeding the quota should be considered a regular operation. Clients uploading files parallely might trigger data races upon older data deletion). In practice this means: - Be eventually consistent and cleanup data after the upload returns as upfront quota validation with JMAP upload constraints on to of Cassandra counter data model is especially prone to data races - Upon cleanup, free at least 50% of the space: this would decrease the frequency of updates - Expose a configurable probability of recomputing the upload quota ===================================================== == File: src/adr/0028-Recompute-mailbox-quotas.md ===================================================== # 28. Recompute mailbox quotas Date: 2020-04-03 ## Status Accepted (lazy consensus) & implemented ## Context JMAP custom quota extension, as well as IMAP [RFC-2087](https://tools.ietf.org/html/rfc2087) enables a user to monitor the amount of space and message count he is allowed to use, and that he is effectively using. To track the quota values a user is effectively using, James relies on the [eventBus](../site/markdown/server/manage-guice-distributed-james.md#mailbox-event-bus) to increment a Cassandra counter corresponding to this user. However, upon Cassandra failure, this value can be incorrect, hence the need of correcting it. ## Data model details Table: imapUidTable: Holds mailbox and flags for each message, lookup by message ID Table: messageV2: Holds message metadata, independently of any mailboxes. Content of messages is stored in `blobs` and `blobparts` tables. Table: currentQuota: Holds per quota-root current values. Quota-roots defines groups of mailboxes which share quotas limitations. Operation: - Quota updates are done asynchronously (event bus + listener) for successful mailbox operations. - If the quota update is not applied, then we are inconsistent - EventBus errors are retried upon errors, counters being non-indempotent, this can result in inconsistent quotas ## Decision We will implement a generic corrective task exposed via webadmin. This task can reuse the `CurrentQuotaCalculator` and call it for each and every quotaRoot of each user. This way, non-Cassandra implementation will also benefit from this task. ## Consequences This task is not concurrent-safe. Concurrent operations will result in an invalid quota to be persisted. However, as the source of truth is not altered, re-running this task will eventually return the correct result. ## References ===================================================== == File: src/adr/0070-postgresql-adoption.md ===================================================== # 70. Native PostgreSQL adoption Date: 2023-10-31 ## Status Accepted (lazy consensus). Not implemented yet. ## Context Today, Apache James is mostly developed towards [the Distributed variant](https://james.staged.apache.org/james-distributed-app/3.8.0/index.html) which targets big enterprises/organizations with a big and scalable deployment. Meanwhile, there are still great needs for small/medium mail server deployments in the market. However, nowadays, Apache James is not really great at serving that small/medium deployments. Obviously, Distributed James with the shiny big data technologies like Apache Cassandra, OpenSearch, RabbitMQ... is too costly for that size of deployment. JPA James should be the feasible variant that could fit those deployments. Despite the JPA implementation allowing to deploy James on top of various popular RDBMS which is useful, JPA with the Object Relational Mapping nature which makes optimizing SQL queries hard and a backed JDBC blocking driver is usually a bad fit for applications requiring high performance like a mail server. Besides that, JPA as an abstraction layer prevents James from using advanced features of a given RDBMS e.g. search engine, or blob storage... From a development aspect, bad developing experience with JPA also limited James community from contributing more to JPA James e.g. JMAP is not supported for JPA James. It has been [a long-term desire of the James community](https://issues.apache.org/jira/browse/JAMES-2586) to have a James variant that fit small/medium deployments without relying on JPA. ## Decision We would implement a PostgresSQL-specific backend. PostgreSQL is a rock-solid well-known, proven, and mature open source relational database with great adoption on the market. Besides a traditional SQL database, PostgreSQL could serve as [a blob storage](https://www.postgresql.org/docs/current/largeobjects.html), [a search engine](https://www.postgresql.org/docs/current/textsearch.html) and [a message queue](https://www.postgresql.org/docs/current/sql-notify.html). We would start implementing James mailbox backed by PostgreSQL: - We implement it step by step on a feature branch of James called `postgresql`. - We start from a copy of JPA modules into new Postgres ones, then migrate code step by step from JPA to Postgresql implementation. This means that during the dev process, both JPA and Postgresql implementation will cohabit until we finally get rid of the JPA code. - The [r2dbc-postgresql](https://github.com/pgjdbc/r2dbc-postgresql) reactive client would be used, alongside [jOOQ](https://www.jooq.org/) (which supports `r2dbc-postgresql` under the hood) for higher level SQL queries. - We at first would start with a simple connection pool implementation: 1 fixed Postgresql connection per domain. The connection pool implementation could be backed by [r2dbc-pool](https://github.com/r2dbc/r2dbc-pool). - Row Level Security usage would be optional, which enforces strict tenant isolation: domain A won't access domain B data even if we screw up James access control layer. - We would need to do some benchmarks along the road to prove the gains we get from the Postgres implementation compared to the JPA one. Once the Postgres mailbox implementation is stable, we will continue to invest in using Postgres on other blocks: - Blob storage implementation - Full-text search implementation - Message queue implementation ## Consequences ===================================================== == File: src/adr/0022-cassandra-message-inconsistency.md ===================================================== # 22. Cassandra Message inconsistencies Date: 2020-02-27 ## Status Accepted (lazy consensus) & implemented ## Context Messages are denormalized in Cassandra in order to: - access them by their unique identifier (messageId), for example through the JMAP protocol - access them by their mailbox identifier and Unique IDentifier within that mailbox (mailboxId + uid), for example through the IMAP protocol Here is the table organisation: - `messageIdTable` Holds mailbox and flags for each message, lookup by mailbox ID + UID - `imapUidTable` Holds mailbox and flags for each message, lookup by message ID Failures during the denormalization process will lead to inconsistencies between the two tables. This can lead to the following user experience: ``` BOB receives a message The denormalization process fails BOB can read the message via JMAP BOB cannot read the message via IMAP BOB marks a message as SEEN The denormalization process fails The message is SEEN in JMAP The message is UNSEEN in IMAP ``` ### Current operations - Adding a message: - (CassandraMessageMapper) First reference the message in `messageIdTable` then in `imapUidTable`. - (CassandraMessageIdMapper) First reference the message in `imapUidTable` then in `messageIdTable`. - Deleting a message: - (CassandraMessageMapper) First delete the message in `imapUidTable` then in `messageIdTable`. - (CassandraMessageIdMapper) Read the message metadata using `imapUidTable`, then first delete the message in `imapUidTable` then in `messageIdTable`. - Copying a message: - (CassandraMessageMapper) Read the message first, then first reference the message in `messageIdTable` then in `imapUidTable`. - Moving a message: ===================================================== == File: src/adr/0005-distributed-task-termination-ackowledgement.md ===================================================== # 5. Distributed Task termination ackowledgement Date: 2019-10-02 ## Status Accepted (lazy consensus) & implemented ## Context By switching the task manager to a distributed implementation, we need to be able to execute a `Task` on any node of the cluster. We need a way for nodes to be signaled of any termination event so that we can notify blocking clients. ## Decision * Creating a `RabbitMQEventHandler` which publish `Event`s pushed to the task manager's event system to RabbitMQ * All the events which end a `Task` (`Completed`, `Failed`, and `Canceled`) have to be transmitted to other nodes ## Consequences * A new kind of `Event`s should be created: `TerminationEvent` which includes `Completed`, `Failed`, and `Canceled` * `TerminationEvent`s will be broadcasted on an exchange which will be bound to all interested components later * `EventSourcingSystem.dipatch` should use `RabbitMQ` to dispatch `Event`s instead of triggering local `Listener`s * Any node can be notified when a `Task` emits a termination event ## References * [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813) ===================================================== == File: src/adr/0033-use-scala-in-event-sourcing-modules.md ===================================================== # 33. Use scala in event sourcing modules Date: 2019-12-13 ## Status Accepted (lazy consensus) & implemented ## Context At the time being James use the scala programming language in some parts of its code base, particularily for implementing the Distributed Task Manager, which uses the event sourcing modules. The module `event-store-memory` already uses Scala. ## Decision What is proposed here, is to convert in Scala the event sourcing modules. The modules concerned by this change are: - `event-sourcing-core` - `event-sourcing-pojo` - `event-store-api` - `event-store-cassandra` ## Rationales This will help to standardize the `event-*` modules as `event-store-memory` is already written in Scala. This change will avoid interopability concerns with the main consumers of those modules which are already written in Scala: see the distributed task manager. In the long run this will allow to have a stronger typing in those parts of the code and to have a much less verbose code. ## Consequences We will have to mitigate the pervading of the Scale API in the Java code base by implementing Java facade. ## References * [JIRA](https://issues.apache.org/jira/browse/JAMES-3009) ===================================================== == File: src/adr/0061-delegation.md ===================================================== # 61. Delegation Date: 2022-09-13 ## Status Accepted (lazy consensus). Implemented. ## Context Delegation is a common feature for email servers: ``` As user A I want to access mailbox of user B. ``` James currently supports a similar feature called impersonation: ``` As an administrator I want to acces mailbox of user B. ``` Impersonation can for instance be used to perform migrations with tools like IMAP-Sync. ## Decision Implement delegation in Apache James (opt in). Reuse APIs used for impersonation to also back delegation up. Technically if user B delegates his account to user A then user A can impersonate user B. Stored delegated access in a Cassandra database and expose it through webadmin. Support delegation while logging in IMAP/SMTP. Both LOGIN/PLAIN authentication and OIDC authentication are supported. ## Consequences Logging traces belongs to the target user and not the user that really authenticated though an intermediate log upon logging should allow a correlation. Associated risk: - Special care needs to be paid to delegation as it can fall into the `improper authorization` attack class and might result in data leaks / modification / deletion. However, as delegation is performed upon logging the attack surface is limited, and typically simpler than traditional right management systems. ## Follow-up work ===================================================== == File: src/adr/0071-objectstorage-sse-c.md ===================================================== # 71. SSE-C for S3 Object Storage Date: 2024-11-15 ## Status Accepted (lazy consensus) ## Context To enhance data security for users, Apache James currently supports client-side encryption through AESBlobStoreDAO. However, this solution consumes significant CPU resources for encryption and decryption, impacting overall system performance. Moreover, it pushes synchronous concepts like `InputStream` into an otherwise reactive interface. Some object storage providers offer Server-Side Encryption with Customer-provided keys (SSE-C), where users supply their own encryption keys, while the service performs encryption and securely stores the data. ## Decision We have decided to integrate SSE-C option for James S3 Object Storage implement. James will manage the master key and salt, using them to create customer keys when calling S3 APIs, such as PUT, GET, and HEAD on objects. In order to provide the customer key, we have made it an interface to allow for potential variations in key and salt derivation. The default implementation will be: - Single customer key: A single master key and salt will be used across all objects in the system. These values will be configured in the configuration file, similar to the current `AESBlobStoreDAO` approach. The current library (`awssdk s3`), fully supports the required APIs for this feature, enabling seamless integration of SSE-C without any compatibility issues. Enabling SSE-C is fully optional. By default, it is disabled and requires configuration changes to activate, allowing users to retain their existing configuration without enabling SSE-C automatically. ## Consequences ### Benefits - Potential Performance Improvement: SSE-C leverages S3’s security capabilities, potentially reducing CPU load on James servers by offloading encryption and decryption tasks to S3. - Security: Provides robust security without fully shifting encryption to the client or to S3 alone. ### Limitations - Data Migration Challenges: Currently, S3 APIs do not support migrating encrypted data from AESBlobStoreDAO (client-side encryption) to the new SSE-C endpoint. - Replication: Some object storage provider does not support bucket replication when enable SSE-C. Eg: OVH Object Storage, S3-Minio only support from version 2024-03-30. - SSE-C may be considered less secure than AESBlobStoreDAO (Client-Side Encryption) because the encryption key must be provided to the S3 service for encryption and decryption operations. Even if the S3 storage provider do not persist the keys. ## Alternatives - Continue using client-side encryption with AESBlobStoreDAO. - Using SSE-S3 (Server-Side Encryption with S3-managed keys) for enhanced security eliminates the need for client-side key management. However, this trade-off means SSE-S3 relies entirely on Object storage provider for key management, which may not satisfy stricter security or compliance requirements. ## References - [AWS SSE-C Documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html) ===================================================== == File: src/adr/0045-support-jmap-push-with-mailbox-changes-implementation.md ===================================================== # 45. Support JMAP Push with Mailbox/changes implementation Date: 2020-12-08 ## Status Accepted (lazy consensus). Implemented. ## Context JMAP Push notifications allow clients to efficiently update (almost) instantly to stay in sync with data changes on the server. In order to support this, we need to handle the **state** property that comes with JMAP get/set request. This means that James needs to be able to record a new state for objects whenever a change happens as well as return the most recent state to the client when fetching objects. First step is to implement Mailbox/changes. ## Decision We will implement a mechanism to record all the changes happening to Mailbox objects in the form of a list of **mailboxId**. When an event such as created/updated/destroyed occur, or when message is appended to a mailbox we will store their **mailboxIds** along with a **state** object in a Cassandra table. Each state will have a list of changes, and all the **mailboxId** will be stored as separated lists corresponding to the change which they represent: **created**, **updated**, **destroyed**. For the case when messages are appended to a mailbox, it will be counted as an updated event and that mailboxId should be stored in **updated** list. Leveraging the **MailboxChanges** table, we can now fetch all the changes that have occurred since a particular **state**. States are stored in Cassandra as time based UUID (**TimeUUID**). This ensures that no conflicting changes will happen in the case when two or more events occur at the same point in time. **TimeUUID** also allows **state** to be sorted in chronological order. Components that need to be implemented: - MailboxChangesRepository: Allows storing and fetching the **state** along with the lists of **mailboxId** in **MailboxChanges** table. - MailboxChangeListener: Listens to changes and triggers the record creation in **MailboxChanges** table. - MailboxChangeMethod: Handles the **state** property, allowing client to fetch the changes since a particular state. - MailboxSetMethod/MailboxGetMethod needs to query the MailboxChangesRepository for their states properties. ## Example of a Mailbox/changes request/response **Request** ``` [["Mailbox/changes", { "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", "sinceState": "dd3721a6-b3ee-4884-8762-fccc0c576438" }, "t0"]] ``` ===================================================== == File: src/adr/0010-enable-elasticsearch-routing.md ===================================================== # 10 Enable ElasticSearch routing Date: 2019-10-17 ## Status Accepted (lazy consensus) & implemented Additional performance testing is required for adoption. ## Context Our queries are mostly bounded to a mailbox or a user. We can easily limit the number of ElasticSearch nodes involved in a given query by grouping the underlying documents on the same node using a routing key. Without a routing key, each shard needs to execute the query. The coordinator needs also to be waiting for the slowest shard. Using the routing key unlocks significant throughput enhancement (proportional to the number of shards) and also a possible high percentile latency enhancement. As most requests are restricted to a single coordination, most search requests will hit a single shard, as opposed to non routed searches which would have hit each shards (each shard would return the number of searched documents, to be ordered and limited again in the coordination node). This allows to be more linearly scalable. ## Decision Enable ElasticSearch routing. Messages should be indexed by mailbox. Quota Ratio should be indexed by user. ## Consequences A data reindex is needed. On a single ElasticSearch node with 5 shards, we noticed latency reduction for mailbox search (2x mean time and 3x 99 percentile reduction) ## References - https://www.elastic.co/guide/en/elasticsearch/reference/6.3/mapping-routing-field.html - [JIRA](https://issues.apache.org/jira/browse/JAMES-2917) - [PR discussing this ADR](https://github.com/apache/james-project/pull/171) ===================================================== == File: protocols/smtp/src/test/resources/a50.eml ===================================================== Subject: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Message-ID: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa X-Sender: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa User-Agent: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ===================================================== == File: server/README.crypto ===================================================== This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See <http://www.wassenaar.org/> for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: Apache James Server uses third party cryptography software including bcjmail and bcprov libraries by "The Legion of the Bouncy Castle" http://www.bouncycastle.org, jasypt library by "Jasypt.org" http://www.jasypt.org/ and the Java Runtime Environment. ===================================================== == File: server/queue/queue-pulsar/README.adoc ===================================================== = Apache James Pulsar MailQueue This project offers an implementation of the james mailqueue backed by https://pulsar.apache.org/[apache pulsar]. == Overview This implementation honors both - MailQueue - ManageableMailQueue. == Implementation notes === Reactive The implementation is built on top of reactive streams and is therefore natively reactive. The blocking dequeue semantics are achieved by an explicit await on the reactive version of the method. === Storage Pulsar is not well suited to store arbitrarily large messages. Since email sizes can quickly inflate, especially with attachments, we chose to store the actual content of the mail in a blob storage of some kind, while only storing metadata in Pulsar. When browsing or dequeueing, the implementation will fetch the corresponding blob and combine it with the necessary metadata to rebuild the whole mail. The initial implementation stores both MimeMessage and headers in separate storages. This can definitely be improved to store the whole blob in one place and simplify the read logic (both dequeue and browse) === Remove We chose to implement the storage and distribution of the removals through a mechanism of filters which are themselves distributed through pulsar. This choice means that this implementation is only eventually consistent on removals and not strongly consistent. === Browse The iterator for browse is dynamically backed by the pulsar queue it pulls items from the queue as they are asked applying any removal filters as needed. This means that dequeued items will not be returned by the iterator even if the iterator was retrieved before the dequeue happens. It also means that once filters have reached eventual consistency they will automatically apply to the ongoing iterator. ===================================================== == File: server/queue/queue-memory/pom.xml ===================================================== <?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.james</groupId> <artifactId>james-server</artifactId> <version>3.9.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <artifactId>james-server-queue-memory</artifactId> <name>Apache James :: Server :: Mail Queue :: Memory</name> <dependencies> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-mailet-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-core</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-queue-api</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-queue-api</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-testing</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>testing-base</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> </dependency> <dependency> ===================================================== == File: server/apps/memory-app/docker-configuration/logback-cli.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/memory-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/memory-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* -Dlogback.configurationFile=/root/conf/logback-cli.xml org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/memory-app/src/test/resources/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/apps/memory-app/src/test/resources/eml/otherDomainDkimLocalFrom.eml ===================================================== Return-Path: <SRS0=fiQ1=NJ=preprod-avocat.fr=sonde-supervision-preprod.linagora@ik2.com> org.apache.james.rspamd.flag: NO org.apache.james.rspamd.status: No, actions=no action score=-0.700093 requiredScore=15.0 Delivered-To: btellier@linagora.com Received: from 172.17.0.1 (EHLO incoming.linagora.com) ([172.17.0.1]) by incoming.linagora.com (JAMES SMTP Server ) with ESMTP ID aec1ac7b for <btellier@linagora.com>; Fri, 07 Jun 2024 06:32:41 +0000 (UTC) Received: from obm3-ui.linagora.dc1 (arathi.linagora.com [54.36.8.82]) by incoming.linagora.com (Postfix) with ESMTP id 07BDE140137 for <btellier@linagora.com>; Fri, 7 Jun 2024 06:32:41 +0000 (UTC) Received: from s602g.ik2.com (s602g.ik2.com [66.37.25.74]) by obm3-ui.linagora.dc1 (Postfix) with ESMTP id 830051D5C6 for <btellier@linagora.com>; Fri, 7 Jun 2024 08:32:33 +0200 (CEST) Received: from s214b.ik2.com by s602g.ik2.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (envelope-from <sonde-supervision-preprod.linagora@preprod-avocat.fr>) id 1sFT9N-0007vZ-O9 for btellier@linagora.com; Fri, 07 Jun 2024 06:32:38 +0000 Received: from 185.60.151.64 by s214b.ik2.com (IK2 SMTP Server); Fri, 7 Jun 2024 06:32:33 +0000 Received: from outgoing.preprod-avocat.fr (unknown [100.96.59.32]) by outgoing.preprod-avocat.fr (Postfix) with ESMTP id 090772C00FA for <btellier@linagora.com>; Fri, 7 Jun 2024 08:32:30 +0200 (CEST) DKIM-Signature: a=rsa-sha256; b=t91ocFueqOR3c2K2TDUz3SUxcVxY5QhaKCrbd9u40WAO11MLxUiEgK7aYTRN/GJJJo6l0sL81kSQbsNPBlcjEGUKhv4wPU34BQko5iAK4gkIGTZ3kWfC1rQo52QK17EqKd9OG9q7vAJh1eA4la5P1Z8DJzxxCB39E0bl9SEtb6s=; s=s1; d=preprod-avocat.fr; v=1; bh=DOV1GxCvw1QI/ZiqKmKwXLguFsLSCuRTQ978r2J4NGs=; h=from : reply-to : subject : date : to : cc : resent-date : resent-from : resent-sender : resent-to : resent-cc : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; MIME-Version: 1.0 Subject: DKIM signature of another domain X-LINAGORA-Copy-Delivery-Done: 1 From: "Compte Test 15 (Linagora)" <comptetest15.linagora@avocat.fr> To: "btellier@linagora.com" <btellier@linagora.com> Reply-To: sonde-supervision-preprod.linagora@preprod-avocat.fr Date: Fri, 7 Jun 2024 06:32:23 +0000 Message-ID: <Mime4j.19.f679494c3e9bb11d.18ff165fa26@preprod-avocat.fr> User-Agent: Team-Mail/0.11.3 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Disposition-Notification-To: sonde-supervision-preprod.linagora@preprod-avocat.fr Content-Type: multipart/alternative; boundary="-=Part.1a.56f2e38fc73ec684.18ff165fa26.911900ebfe468c22=-" X-SF-RX-Return-Path: <sonde-supervision-preprod.linagora@preprod-avocat.fr> X-SF-Originating-IP: 185.60.151.64 X-SF-WhiteListedReason: Whitelisted EmailTO X-SF-Score: X-SF-SRS: Sender address rewritten from <sonde-supervision-preprod.linagora@preprod-avocat.fr> to <SRS0=fiQ1=NJ=preprod-avocat.fr=sonde-supervision-preprod.linagora@ik2.com> X-SF-Domain: qgwlxqsyyb ---=Part.1a.56f2e38fc73ec684.18ff165fa26.911900ebfe468c22=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable ===================================================== == File: server/apps/memory-app/src/test/resources/eml/otherDomainDkim.eml ===================================================== Return-Path: <SRS0=fiQ1=NJ=preprod-avocat.fr=sonde-supervision-preprod.linagora@ik2.com> org.apache.james.rspamd.flag: NO org.apache.james.rspamd.status: No, actions=no action score=-0.700093 requiredScore=15.0 Delivered-To: btellier@linagora.com Received: from 172.17.0.1 (EHLO incoming.linagora.com) ([172.17.0.1]) by incoming.linagora.com (JAMES SMTP Server ) with ESMTP ID aec1ac7b for <btellier@linagora.com>; Fri, 07 Jun 2024 06:32:41 +0000 (UTC) Received: from obm3-ui.linagora.dc1 (arathi.linagora.com [54.36.8.82]) by incoming.linagora.com (Postfix) with ESMTP id 07BDE140137 for <btellier@linagora.com>; Fri, 7 Jun 2024 06:32:41 +0000 (UTC) Received: from s602g.ik2.com (s602g.ik2.com [66.37.25.74]) by obm3-ui.linagora.dc1 (Postfix) with ESMTP id 830051D5C6 for <btellier@linagora.com>; Fri, 7 Jun 2024 08:32:33 +0200 (CEST) Received: from s214b.ik2.com by s602g.ik2.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (envelope-from <sonde-supervision-preprod.linagora@preprod-avocat.fr>) id 1sFT9N-0007vZ-O9 for btellier@linagora.com; Fri, 07 Jun 2024 06:32:38 +0000 Received: from 185.60.151.64 by s214b.ik2.com (IK2 SMTP Server); Fri, 7 Jun 2024 06:32:33 +0000 Received: from outgoing.preprod-avocat.fr (unknown [100.96.59.32]) by outgoing.preprod-avocat.fr (Postfix) with ESMTP id 090772C00FA for <btellier@linagora.com>; Fri, 7 Jun 2024 08:32:30 +0200 (CEST) DKIM-Signature: a=rsa-sha256; b=t91ocFueqOR3c2K2TDUz3SUxcVxY5QhaKCrbd9u40WAO11MLxUiEgK7aYTRN/GJJJo6l0sL81kSQbsNPBlcjEGUKhv4wPU34BQko5iAK4gkIGTZ3kWfC1rQo52QK17EqKd9OG9q7vAJh1eA4la5P1Z8DJzxxCB39E0bl9SEtb6s=; s=s1; d=preprod-avocat.fr; v=1; bh=DOV1GxCvw1QI/ZiqKmKwXLguFsLSCuRTQ978r2J4NGs=; h=from : reply-to : subject : date : to : cc : resent-date : resent-from : resent-sender : resent-to : resent-cc : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; MIME-Version: 1.0 Subject: DKIM signature of another domain X-LINAGORA-Copy-Delivery-Done: 1 From: rgqer <sonde-supervision-preprod.linagora@preprod-avocat.fr> To: "btellier@linagora.com" <btellier@linagora.com> Reply-To: sonde-supervision-preprod.linagora@preprod-avocat.fr Date: Fri, 7 Jun 2024 06:32:23 +0000 Message-ID: <Mime4j.19.f679494c3e9bb11d.18ff165fa26@preprod-avocat.fr> User-Agent: Team-Mail/0.11.3 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Disposition-Notification-To: sonde-supervision-preprod.linagora@preprod-avocat.fr Content-Type: multipart/alternative; boundary="-=Part.1a.56f2e38fc73ec684.18ff165fa26.911900ebfe468c22=-" X-SF-RX-Return-Path: <sonde-supervision-preprod.linagora@preprod-avocat.fr> X-SF-Originating-IP: 185.60.151.64 X-SF-WhiteListedReason: Whitelisted EmailTO X-SF-Score: X-SF-SRS: Sender address rewritten from <sonde-supervision-preprod.linagora@preprod-avocat.fr> to <SRS0=fiQ1=NJ=preprod-avocat.fr=sonde-supervision-preprod.linagora@ik2.com> X-SF-Domain: qgwlxqsyyb ---=Part.1a.56f2e38fc73ec684.18ff165fa26.911900ebfe468c22=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable ===================================================== == File: server/apps/memory-app/src/test/resources/eml/badDkim.eml ===================================================== Return-Path: <SRS0=7v5G=NB=avocat.fr=comptetest15.linagora@ik2.com> org.apache.james.rspamd.flag: NO org.apache.james.rspamd.status: No, actions=no action score=-1.20399 requiredScore=15.0 Delivered-To: btellier@linagora.com Received: from 172.17.0.1 (EHLO incoming.linagora.com) ([172.17.0.1]) by incoming.linagora.com (JAMES SMTP Server ) with ESMTP ID 6dffcf4c for <btellier@linagora.com>; Thu, 30 May 2024 13:14:36 +0000 (UTC) Received: from obm3-ui.linagora.dc1 (arathi.linagora.com [54.36.8.82]) by incoming.linagora.com (Postfix) with ESMTP id 760D11400C0 for <btellier@linagora.com>; Thu, 30 May 2024 13:14:36 +0000 (UTC) Received: from s602f.ik2.com (s602f.ik2.com [66.37.25.73]) by obm3-ui.linagora.dc1 (Postfix) with ESMTP id EF3C21D5C6 for <btellier@linagora.com>; Thu, 30 May 2024 15:14:29 +0200 (CEST) Received: from s602e.ik2.com by s602f.ik2.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (envelope-from <comptetest15.linagora@avocat.fr>) id 1sCfc1-0002uc-JM for btellier@linagora.com; Thu, 30 May 2024 13:14:34 +0000 Received: from 185.60.149.69 by s602e.ik2.com (IK2 SMTP Server); Thu, 30 May 2024 13:14:33 +0000 Received: from outgoing.avocat.fr (unknown [100.96.73.31]) by outgoing.avocat.fr (Postfix) with ESMTP id 2FA1440BB5 for <btellier@linagora.com>; Thu, 30 May 2024 15:14:31 +0200 (CEST) DKIM-Signature: a=rsa-sha256; b=yKWUdoSJWU22yD2pYralgzwT7HtfiVaYM2Z/UFpeTbGCCrUFH0MfiZV6xpUrj7yjvXKetoP8fBFaz0CCmMCwyQmuDPA7LDZtaspCKrnnpJ4jbXd1EETNTOnkPGHTtwmDXOiGfLQwYtVTnt8ZjFs0aqWQ7x0hf/J7B1yrrQHXzow=; s=s2; d=avocat.fr; v=1; bh=J/vybCAsPL7Fd5sQielJMVcFwAfk7/HdExYRnLVmMls=; h=from : reply-to : subject : date : to : cc : resent-date : resent-from : resent-sender : resent-to : resent-cc : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; MIME-Version: 1.0 Subject: Test DKIM X-LINAGORA-Copy-Delivery-Done: 1 From: "Compte Test 15 (Linagora)" <comptetest15.linagora@avocat.fr> To: btellier@linagora.com Reply-To: comptetest15.linagora@avocat.fr Date: Thu, 30 May 2024 13:14:29 +0000 Message-ID: <Mime4j.10cd.83efd28a96e1b4a9.18fc9a33dcd@avocat.fr> User-Agent: Team-Mail/0.11.3 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Disposition-Notification-To: comptetest15.linagora@avocat.fr Content-Type: multipart/alternative; boundary="-=Part.10ce.b972756a9ae65a4e.18fc9a33dcd.74debedca650c627=-" X-SF-RX-Return-Path: <comptetest15.linagora@avocat.fr> X-SF-Originating-IP: 185.60.149.69 X-SF-WhiteListedReason: Whitelisted EmailTO X-SF-Score: X-SF-SRS: Sender address rewritten from <comptetest15.linagora@avocat.fr> to <SRS0=7v5G=NB=avocat.fr=comptetest15.linagora@ik2.com> X-SF-Domain: qgwlxqsyyb ---=Part.10ce.b972756a9ae65a4e.18fc9a33dcd.74debedca650c627=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable ALTERED body ===================================================== == File: server/apps/memory-app/src/test/resources/eml/goodDkim.eml ===================================================== Return-Path: <SRS0=7v5G=NB=avocat.fr=comptetest15.linagora@ik2.com> org.apache.james.rspamd.flag: NO org.apache.james.rspamd.status: No, actions=no action score=-1.20399 requiredScore=15.0 Delivered-To: btellier@linagora.com Received: from 172.17.0.1 (EHLO incoming.linagora.com) ([172.17.0.1]) by incoming.linagora.com (JAMES SMTP Server ) with ESMTP ID 6dffcf4c for <btellier@linagora.com>; Thu, 30 May 2024 13:14:36 +0000 (UTC) Received: from obm3-ui.linagora.dc1 (arathi.linagora.com [54.36.8.82]) by incoming.linagora.com (Postfix) with ESMTP id 760D11400C0 for <btellier@linagora.com>; Thu, 30 May 2024 13:14:36 +0000 (UTC) Received: from s602f.ik2.com (s602f.ik2.com [66.37.25.73]) by obm3-ui.linagora.dc1 (Postfix) with ESMTP id EF3C21D5C6 for <btellier@linagora.com>; Thu, 30 May 2024 15:14:29 +0200 (CEST) Received: from s602e.ik2.com by s602f.ik2.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (envelope-from <comptetest15.linagora@avocat.fr>) id 1sCfc1-0002uc-JM for btellier@linagora.com; Thu, 30 May 2024 13:14:34 +0000 Received: from 185.60.149.69 by s602e.ik2.com (IK2 SMTP Server); Thu, 30 May 2024 13:14:33 +0000 Received: from outgoing.avocat.fr (unknown [100.96.73.31]) by outgoing.avocat.fr (Postfix) with ESMTP id 2FA1440BB5 for <btellier@linagora.com>; Thu, 30 May 2024 15:14:31 +0200 (CEST) DKIM-Signature: a=rsa-sha256; b=yKWUdoSJWU22yD2pYralgzwT7HtfiVaYM2Z/UFpeTbGCCrUFH0MfiZV6xpUrj7yjvXKetoP8fBFaz0CCmMCwyQmuDPA7LDZtaspCKrnnpJ4jbXd1EETNTOnkPGHTtwmDXOiGfLQwYtVTnt8ZjFs0aqWQ7x0hf/J7B1yrrQHXzow=; s=s2; d=avocat.fr; v=1; bh=J/vybCAsPL7Fd5sQielJMVcFwAfk7/HdExYRnLVmMls=; h=from : reply-to : subject : date : to : cc : resent-date : resent-from : resent-sender : resent-to : resent-cc : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; MIME-Version: 1.0 Subject: Test DKIM X-LINAGORA-Copy-Delivery-Done: 1 From: "Compte Test 15 (Linagora)" <comptetest15.linagora@avocat.fr> To: btellier@linagora.com Reply-To: comptetest15.linagora@avocat.fr Date: Thu, 30 May 2024 13:14:29 +0000 Message-ID: <Mime4j.10cd.83efd28a96e1b4a9.18fc9a33dcd@avocat.fr> User-Agent: Team-Mail/0.11.3 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Disposition-Notification-To: comptetest15.linagora@avocat.fr Content-Type: multipart/alternative; boundary="-=Part.10ce.b972756a9ae65a4e.18fc9a33dcd.74debedca650c627=-" X-SF-RX-Return-Path: <comptetest15.linagora@avocat.fr> X-SF-Originating-IP: 185.60.149.69 X-SF-WhiteListedReason: Whitelisted EmailTO X-SF-Score: X-SF-SRS: Sender address rewritten from <comptetest15.linagora@avocat.fr> to <SRS0=7v5G=NB=avocat.fr=comptetest15.linagora@ik2.com> X-SF-Domain: qgwlxqsyyb ---=Part.10ce.b972756a9ae65a4e.18fc9a33dcd.74debedca650c627=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Test DKIM body ===================================================== == File: server/apps/memory-app/src/assemble/README.adoc ===================================================== = Guice-Memory Module How-to == Requirements * Java 11 SDK == Running To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. A [sample directory](https://github.com/apache/james-project/tree/master/server/container/guice/memory-guice/sample-configuration) is provided with some default values you may need to replace. You will need to update its content to match your needs. You also need to generate a keystore with the following command: [source] ---- $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ---- Once everything is set up, you just have to run the jar with: [source] ---- $ java -Dworking.directory=. -Dlogback.configurationFile=conf/logback.xml -Djdk.tls.ephemeralDHKeySize=2048 -jar james-server-memory-guice.jar ---- Note that binding ports below 1024 requires administrative rights. ===================================================== == File: server/apps/memory-app/src/assemble/extensions-jars.txt ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add you customs Mailets/Matchers. ===================================================== == File: server/apps/memory-app/README.md ===================================================== # James Memory server In order to build both the ZIP and docker packaging, run: ``` mvn clean install -DskipTests ``` ## ZIP distribution Available in `target` directory, the ZIP include detailed instructions. ## Docker distribution To import the image locally: ``` docker image load -i target/jib-image.tar ``` Then run it: ``` docker run apache/james:memory-latest ``` For security reasons you are required to generate your own keystore, that you can mount into the container via a volume: ``` keytool -genkey -alias james -keyalg RSA -keystore keystore docker run -v $PWD/keystore:/root/conf/keystore apache/james:memory-latest ``` In the case of quick start James without manually creating a keystore (e.g. for development), James memory server will auto-generate keystore file with the default setting that is declared in `jmap.properties` (tls.keystoreURL, tls.secret) Hence just run docker command: ``` docker run apache/james:memory-latest ``` Use the [JAVA_TOOL_OPTIONS environment option](https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#jvm-flags) to pass extra JVM flags. For instance: ``` docker run -e "JAVA_TOOL_OPTIONS=-Xmx500m -Xms500m" apache/james:memory-latest ``` ===================================================== == File: server/apps/memory-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/memory-app/sample-configuration/deletedMessageVault.properties ===================================================== # ============================================= Deleted Messages Vault Configuration ================================== # Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up # Optional, default 1y # retentionPeriod=1y ===================================================== == File: server/apps/memory-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true # JMX, when enable causes RMI to plan System.gc every hour. Set this instead to once every 1000h. sun.rmi.dgc.server.gcInterval=3600000000 ===================================================== == File: server/apps/memory-app/sample-configuration/jmap.properties ===================================================== # Configuration file for JMAP # Read https://james.apache.org/server/config-jmap.html for further details enabled=true tls.keystoreURL=file://conf/keystore tls.secret=james72laBalle delay.sends.enabled=true # Alternatively TLS keys can be supplied via PEM files # tls.privateKey=file://conf/private.nopass.key # tls.certificates=file://conf/certs.self-signed.csr # An optional secret might be specified for the private key # tls.secret=james72laBalle # # If you wish to use OAuth authentication, you should provide a valid JWT public key. # The following entry specify the link to the URL of the public key file, # which should be a PEM format file. # #jwt.publickeypem.url=file://conf/jwt_publickey # Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? # This enables a higher resilience, but the projection needs to be correctly populated. False by default. # view.email.query.enabled=true # If you want to specify authentication strategies for Jmap rfc-8621 version # For custom Authentication Strategy not inside package "org.apache.james.jmap.http", you have to specify its FQDN # authentication.strategy.rfc8621=JWTAuthenticationStrategy,BasicAuthenticationStrategy # Prevent server side request forgery by preventing calls to the private network ranges. Defaults to true, can be disabled for testing. # webpush.prevent.server.side.request.forgery=false ===================================================== == File: server/apps/memory-app/sample-configuration/droplists.properties ===================================================== # Configuration file for DropLists enabled=false ===================================================== == File: server/apps/webadmin-cli/src/test/resources/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/apps/webadmin-cli/src/test/resources/valid_token_admin_false.jwt ===================================================== eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbkBvcGVu LXBhYXMub3JnIiwiYWRtaW4iOmZhbHNlLCJpYXQiOjE0ODkwNDA4Njd9.reQc3DiVvbQHF08oW1qOUyDJyv3tfzDNk8jhVZequiCdOI9vXnRlOe -yDYktd4WT8MYhqY7MgS-wR0vO9jZFv8ZCgd_MkKCvCO0HmMjP5iQPZ0kqGkgWUH7X123tfR38MfbCVAdPDba-K3MfkogV1xvDhlkPScFr_6MxE xtedOK2JnQZn7t9sUzSrcyjWverm7gZkPptkIVoS8TsEeMMME5vFXe_nqkEG69q3kuBUm_33tbR5oNS0ZGZKlG9r41lHBjyf9J1xN4UYV8n866d a7RPPCzshIWUtO0q9T2umWTnp-6OnOdBCkndrZmRR6pPxsD5YL0_77Wq8KT_5__fGA ===================================================== == File: server/apps/webadmin-cli/src/test/resources/valid_token_admin_true.jwt ===================================================== eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbkBvcGVuL XBhYXMub3JnIiwiYWRtaW4iOnRydWUsImlhdCI6MTQ4OTAzODQzOH0.rgxCkdWEa-92a4R-72a9Z49k4LRvQDShgci5Y7qWRUP9IGJCK-lMkrHF 4H0a6L87BYppxVW701zaZ6dNxRMvHnjLBBWnPsC2B0rkkr2hEL2zfz7sb-iNGV-J4ICx97t8-TfQ5rz3VOX0FwdusPL_rJtmlGEGRivPkR6_aBe1 kQnvMlwpqF_3ox58EUqYJk6lK_6rjKEV3Xfre31IMpuQUy6c7TKc95sL2-13cknelTierBEmZ00RzTtv9SHIEfzZTfaUK2Wm0PvnQjmU2nIdEvU EqE-jrM3yYXcQzoO-YTQnEhdl-iqbCfmEpYkl2Bx3eIq7gRxxnr7BPsX6HrCB0w ===================================================== == File: server/apps/webadmin-cli/README.md ===================================================== # A WebAdmin based CLI for Apache James ## Development Webadmin command-line interface is an upcoming replacement for the outdated, security-vulnerable JMX command-line interface. It also aims at providing a more modern and intuitive interface. ## Run the command line ## Syntax General syntax to run the command line ``` $ ./james-cli [OPTION] ENTITY ACTION {ARGUMENT} ``` where OPTION: optional parameter when running the command line, ENTITY: represents the entity to perform action on, ACTION: name of the action to perform, ARGUMENT: arguments needed for the action. Example: ``` $ ./james-cli --url http://127.0.0.1:9999 domain list ``` The above command lists all domain names available on domain route at address http://127.0.0.1:9999. It does not require any argument to execute. The following options can be used: --url : Without it, the default value is http://127.0.0.1:8000. When James server's jwt setting is enabled, jwt options are required: --jwt-token : pass the jwt token directly as plain text. E.g: ``` $ ./james-cli --url http://127.0.0.1:8000 --jwt-token eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJlc24iLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNjA0Mjg3OTU3fQ.IY3AWg9lQE4muXg8iRu1nbluTm786_6aLcoEylCGcbtGcEOp81Neani1-_17xGp2aF6kxBJva0_f_ADUplhfirGXwoxM8evcsdmQBhNGDfa-oXT_a-dd6n7MMPweGOFGhjxnTRvNHpyqDcfNuGGGcB8OfzOsN5epWNkhlivk2OSuY8vR8fHB9Es1Oiv1i8D5H93-K5IXParVLpAtj7uLZT9b7G-kjxlQagApH8USx6JlqIjMwhvM--79SrzPKZ2AtM59NfDT4g6GPaMNntQvXr06Xu3Leys97cot2rsXNfXY1OohorXiYiZ66-eMRcQ7pHF-NyS6dlg87rnMQlpKHw domain list ``` Commands with valid token with admin=true claim should pass James's authentication. --jwt-from-file : pass the jwt token through a file (such as token.jwt). E.g: ``` $ ./james-cli --url http://127.0.0.1:8000 --jwt-from-file token.jwt domain list ``` ===================================================== == File: server/apps/webadmin-cli/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -jar target/james-cli.jar "$@" ===================================================== == File: server/apps/scaling-pulsar-smtp/docker-compose.yml ===================================================== version: '3' services: james: depends_on: - s3 - pulsar - postgres image: apache/james:scaling-pulsar-smtp-latest container_name: james hostname: james.local ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" - "5005:5005" environment: #- JDK_JAVA_OPTIONS=-Dlogback.configurationFile=/root/conf/logback.xml -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=0.0.0.0:5005 -Dworking.directory=/root/ - JDK_JAVA_OPTIONS=-Dlogback.configurationFile=/root/conf/logback.xml -Dworking.directory=/root/ - OBJECTSTORAGE_S3_ENDPOINT=http://s3.docker.test:8000/ - OBJECTSTORAGE_S3_REGION=us-east-1 - OBJECTSTORAGE_S3_ACCESSKEYID=accessKey1 - OBJECTSTORAGE_S3_SECRETKEY=secretKey1 - DATABASE_URL=jdbc:postgresql://postgres/postgres - DATABASE_USERNAME=postgres - DATABASE_PASSWORD=password - PULSAR_BROKER_URI=pulsar://pulsar:6650 - PULSAR_ADMIN_URI=http://pulsar:8080/ - PULSAR_NAMESPACE=public/default volumes: #- $PWD/mariadb-java-client-2.7.2.jar:/root/libs/mariadb-java-client-2.7.2.jar #- $PWD/sample-configuration/james-database.properties:/root/conf/james-database.properties #- $PWD/sample-configuration/pulsar.properties:/root/conf/pulsar.properties #- $PWD/sample-configuration/blob.properties:/root/conf/blob.properties #- $PWD/sample-configuration/mailetcontainer.xml:/root/conf/mailetcontainer.xml #- $PWD/sample-configuration/mailrepositorystore.xml:/root/conf/mailrepositorystore.xml #- $PWD/sample-configuration/jvm.properties:/root/conf/jvm.properties #- $PWD/keystore:/root/conf/keystore - ./sample-configuration:/root/conf s3: image: zenko/cloudserver:8.2.6 container_name: s3.docker.test ports: ===================================================== == File: server/apps/scaling-pulsar-smtp/README.adoc ===================================================== = Pulsar backed SMTP processing == App goals This app provides an easily scalable SMTP processing module based on Apache Pulsar for small to large deployments. The idea being that it is easy enough to operate this assembly at a "reasonable" cost in the cloud until the scale is large enough to warrant switching to the fully distributed app. In order to support such small deployments destined to grow this app relies on : - Apache pulsar as there are cost-efficient SAAS deployments that make this app easy to deploy - A Blobstore (for mail repository) as they are very cost-efficient and available at most providers in the Cloud market. - A PostgresSQL database for reference data (domain list, recipient rewrite table and users). PostgreSQL databases as a service is available on multiple cloud platform and for this kind of information entry tiers should allow to operate a reasonable service. == Building In order to build the docker packaging, run: ---- mvn clean install -DskipTests ---- == ZIP distribution Available in `target` directory, the ZIP include detailed instructions. == Docker distribution To import the image locally: ---- docker image load -i target/jib-image.tar ---- Then run it: ---- docker run apache/james:scaling-pulsar-smtp-latest ---- For security reasons you are required to generate your own keystore, that you can mount into the container via a volume: ---- keytool -genkey -alias james -keyalg RSA -keystore keystore docker run -v $PWD/keystore:/root/conf/keystore apache/james:scaling-pulsar-smtp-latest ---- In the case of quick start James without manually creating a keystore (e.g. for development), just input the command argument `--generate-keystore` when running, James will auto-generate keystore file with the default setting that is declared in `jmap.properties` (tls.keystoreURL, tls.secret) ===================================================== == File: server/apps/scaling-pulsar-smtp/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/scaling-pulsar-smtp/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/scaling-pulsar-smtp/sample-configuration/pulsar.properties ===================================================== #broker.uri=pulsar://pulsar:6650 broker.uri=${env:PULSAR_BROKER_URI} #admin.uri=http://pulsar:8080/ admin.uri=${env:PULSAR_ADMIN_URI} #namespace=public/default namespace=${env:PULSAR_NAMESPACE} ===================================================== == File: server/apps/scaling-pulsar-smtp/sample-configuration/scriptFile.scala ===================================================== <?xml version="1.0"?> ===================================================== == File: server/apps/scaling-pulsar-smtp/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be di sposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true # JMX, when enable causes RMI to plan System.gc every hour. Set this instead to once every 1000h. #sun.rmi.dgc.server.gcInterval=3600000000 ===================================================== == File: server/apps/scaling-pulsar-smtp/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/scaling-pulsar-smtp/sample-configuration/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Read https://james.apache.org/server/config-blobstore.html for further details # Choose your BlobStore implementation # Mandatory, allowed values are: cassandra, s3 # *WARNING*: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to # alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) implementation=s3 # ========================================= Deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=false # deduplication.family needs to be incremented every time the deduplication.generation.duration is changed # Positive integer, defaults to 1 # deduplication.gc.generation.family=1 # Duration of generation. # Deduplication only takes place within a singe generation. # Only items two generation old can be garbage collected. (This prevent concurrent insertions issues and # accounts for a clock skew). # deduplication.family needs to be incremented everytime this parameter is changed. # Duration. Default unit: days. Defaults to 30 days. # deduplication.gc.generation.duration=30days # ========================================= Encryption ======================================== # If you choose to enable encryption, the blob content will be encrypted before storing them in the BlobStore. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to all content being # encrypted. This comes at a performance impact but presents you from leaking data if, for instance the third party # offering you a S3 service is compromised. # Optional, Allowed values are: true, false, defaults to false encryption.aes.enable=false # Mandatory (if AES encryption is enabled) salt and password. Salt needs to be an hexadecimal encoded string #encryption.aes.password=xxx #encryption.aes.salt=73616c7479 # ========================================= Cassandra BlobStore Cache ====================================== # A cassandra cache can be enabled to reduce latency when reading small blobs frequently # A dedicated keyspace with a replication factor of one is then used # Cache eviction policy is TTL based # Only blobs below a given threshold will be stored. # To be noted that blobs are stored within a single Cassandra row, hence a low threshold should be used. # Enable the cache? Optional and default to false. Must be a boolean. cache.enable=false ===================================================== == File: server/apps/spring-app/README.crypto ===================================================== This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See <http://www.wassenaar.org/> for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the included cryptographic software: Apache James Server uses third party cryptography software including bcjmail and bcprov libraries by "The Legion of the Bouncy Castle" http://www.bouncycastle.org, jasypt library by "Jasypt.org" http://www.jasypt.org/ and the Java Runtime Environment. ===================================================== == File: server/apps/spring-app/src/main/resources/log4j2.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO" monitorInterval="30"> <Properties> <Property name="logDir">${sys:app.home}/log</Property> <Property name="logLayoutTomcat">%d{dd-MMM-yyyy HH:mm:ss.SSS} %level [%t] %C.%M:%L - %msg%n</Property> <Property name="logLayout1">%d %-7level %logger{36} - %msg%n</Property> <Property name="logLayout2">%d %-7level [%t] %C.%M:%L - %msg%n</Property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="${logLayoutTomcat}" /> </Console> <RollingFile name="SpringFramework" fileName="${logDir}/springframework.log" filePattern="${logDir}/springframework.%d{yyyy-MM-dd}-%i.log.gz" ignoreExceptions="false"> <PatternLayout pattern="${logLayoutTomcat}" charset="UTF-8" /> <Policies> <!-- <OnStartupTriggeringPolicy /> --> <!-- <SizeBasedTriggeringPolicy size="20 MB" /> --> <!-- <TimeBasedTriggeringPolicy /> --> </Policies> <!-- <DefaultRolloverStrategy> --> <!-- <Delete basePath="${logDir}" maxDepth="2"> --> <!-- <IfFileName --> <!-- glob="target/log4j2/roll-by-time-and-size/app.*.log.gz" /> --> <!-- <IfLastModified age="20d" /> --> <!-- </Delete> --> <!-- </DefaultRolloverStrategy> --> </RollingFile> <RollingFile name="openjpa" fileName="${logDir}/openjpa.log" filePattern="${logDir}/openjpa.%d{yyyy-MM-dd}-%i.log.gz" ignoreExceptions="false"> <PatternLayout pattern="${logLayoutTomcat}" charset="UTF-8" /> <Policies> <!-- <OnStartupTriggeringPolicy /> --> <!-- <SizeBasedTriggeringPolicy size="20 MB" /> --> <!-- <TimeBasedTriggeringPolicy /> --> </Policies> <!-- <DefaultRolloverStrategy> --> <!-- <Delete basePath="${logDir}" maxDepth="2"> --> <!-- <IfFileName --> <!-- glob="target/log4j2/roll-by-time-and-size/app.*.log.gz" /> --> <!-- <IfLastModified age="20d" /> --> <!-- </Delete> --> <!-- </DefaultRolloverStrategy> --> </RollingFile> <RollingFile name="James" fileName="${logDir}/james.log" ===================================================== == File: server/apps/spring-app/src/main/resources/jmxremote.access ===================================================== james-admin readwrite ===================================================== == File: server/apps/spring-app/src/main/resources/jmxremote.password ===================================================== james-admin changeme ===================================================== == File: server/apps/spring-app/src/main/licensing/app/notice-for-binary.txt ===================================================== ========================================================================= == NOTICE file for use with the Apache License, Version 2.0, == ========================================================================= Apache JAMES Server Copyright 1999-2011 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). Download the source for: jakarta.mail-${version}.jar from https://github.com/eclipse-ee4j/mail/releases jakarta.activation-${version}.jar from https://github.com/eclipse-ee4j/jaf/releases This distribution contains third party resources requiring the following notices: For jasypt-1.6.jar This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ for more information. The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code. The following provides more details on the cryptographic software used (note that this software is not included in the distribution): * The PBE Encryption facilities require the Java Cryptography extensions: http://java.sun.com/javase/technologies/security/. --------------------------------- ===================================================== == File: server/apps/spring-app/src/debian/control/control ===================================================== Source: apache-james Package: ${artifactId} Version: ${project.version} Section: contrib/java Priority: optional Maintainer: Apache James Team <server-dev@james.apache.org> Uploaders: Ioan Eugen Stan <ieugen@apache.org> Architecture: all Homepage: http://james.apache.org Depends: default-jre-headless | java6-runtime-headless | java-6-runtime Provides: imap-server, mail-transport-agent, pop3-server Conflicts: mail-transport-agent Description: Hi-performance, modular and extensible Java based email server. The Apache James Project delivers a rich set of open source modules and libraries, written in Java, related to Internet mail communication which build into an advanced enterprise mail server. James Server provides a mailet container: the email processing is delegated to independent, extensible, pluggable agents specified by the Mailet API. Any function which is not already available (from James or from a third party) can be developed. ===================================================== == File: server/apps/distributed-pop3-app/docker-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # Required to locate Cassandra driver configuration config.file=/root/conf/cassandra-driver.conf # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true ===================================================== == File: server/apps/distributed-pop3-app/docker-configuration/logback-cli.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/distributed-pop3-app/docker-compose.yml ===================================================== version: '3' services: james: depends_on: cassandra: condition: service_healthy opensearch: condition: service_started tika: condition: service_started rabbitmq: condition: service_started s3: condition: service_started image: apache/james:distributed-pop3-latest container_name: james hostname: james.local ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" command: - --generate-keystore networks: - james opensearch: image: opensearchproject/opensearch:2.14.0 environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true networks: james: aliases: - elasticsearch cassandra: image: cassandra:4.1.5 ports: - "9042:9042" healthcheck: test: ["CMD", "cqlsh", "-e", "describe keyspaces"] ===================================================== == File: server/apps/distributed-pop3-app/README.adoc ===================================================== = Guice-Distributed POP3 Server How-to This server diverges from the distributed server by only using MessageId backed by a TimeUUID as a message identifier, thus is multi-datacenter friendly, however comes with a reduced feature set (only supports SMTP protocol). == Requirements * Java 21 SDK Firstly, create your own user network on Docker for the James environment: $ docker network create --driver bridge james Third party compulsory dependencies: * Cassandra 4.0 * RabbitMQ-Management 3.8.18 * Zenko Cloudserver or AWS S3 [source] ---- $ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:4.1.5 $ docker run -d --network james -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:3.13.3-management $ docker run -d --network james --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 ghcr.io/scality/cloudserver:8cbe2c066b3505b26d339dc67315d1041b8c7f3a ---- == Docker distribution To import the image locally: [source] ---- docker image load -i target/jib-image.tar ---- Then run it: [source] ---- docker run --network james apache/james:distributed-pop3-latest ---- For security reasons you are required to generate your own keystore, that you can mount into the container via a volume: [source] ---- keytool -genkey -alias james -keyalg RSA -keystore keystore docker run --network james -v $PWD/keystore:/root/conf/keystore apache/james:distributed-pop3-latest ---- ===================================================== == File: server/apps/distributed-pop3-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/distributed-pop3-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* -Dlogback.configurationFile=/root/conf/logback-cli.xml org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/distributed-pop3-app/src/test/resources/attachment.eml ===================================================== ===================================================== == File: server/apps/distributed-pop3-app/src/test/resources/big.eml ===================================================== ===================================================== == File: server/apps/distributed-pop3-app/src/test/resources/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=200 fetch.body=100 fetch.full=50 # IMAP COPY command copy=100 # IMAP MOVE command move=100 ===================================================== == File: server/apps/distributed-pop3-app/src/test/resources/rabbitmq.properties ===================================================== uri=amqp://james:james@rabbitmq_host:5672 management.uri=http://james:james@rabbitmq_host:15672/api/ ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties ===================================================== # ============================================= Deleted Messages Vault Configuration ================================== enabled=false # Enable work queue to be used with deleted message vault # Default to false # workQueueEnabled=false # Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up # Optional, default 1y # retentionPeriod=1y # Mailbox that will contain messages restored from the vault, will be created if it does not exist yet # Optional, default 'Restored-Messages' ; must be set to INBOX for POP3 restoreLocation=INBOX ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # Required to locate Cassandra driver configuration config.file=conf/cassandra-driver.conf # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> <logger name="com.datastax.driver.core.QueryLogger.SLOW" level="DEBUG" /> </configuration> ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/cassandra-driver.conf ===================================================== # James reference configuration for the DataStax Java driver for Apache Cassandra®. # # Unless you use a custom mechanism to load your configuration (see # SessionBuilder.withConfigLoader), all the values declared here will be used as defaults. # # See https://docs.datastax.com/en/developer/java-driver/4.13/manual/core/configuration/ for # available options. # # Please note that contact point and authentication needs to be set in cassandra.properties for now. datastax-java-driver { basic.request { timeout = 5 seconds consistency = QUORUM page-size = 5000 serial-consistency = SERIAL } advanced.connection { connect-timeout = 5 seconds init-query-timeout = 5 seconds pool { local.size = 2 remote.size = 2 } max-requests-per-connection = 1024 max-orphan-requests = 256 warn-on-init-error = true } advanced.throttler { // class = org.apache.james.backends.cassandra.utils.LockLessConcurrencyLimitingRequestThrottler class = ConcurrencyLimitingRequestThrottler max-queue-size = 10000 max-concurrent-requests = 192 } advanced.reconnect-on-init = true ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=200 fetch.body=100 fetch.full=50 # IMAP COPY command copy=100 # IMAP MOVE command move=100 ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Read https://james.apache.org/server/config-blobstore.html for further details # Choose your BlobStore implementation # Mandatory, allowed values are: cassandra, s3 # *WARNING*: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to # alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) implementation=s3 # ========================================= Deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=false # ========================================= Encryption ======================================== # If you choose to enable encryption, the blob content will be encrypted before storing them in the BlobStore. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to all content being # encrypted. This comes at a performance impact but presents you from leaking data if, for instance the third party # offering you a S3 service is compromised. # Optional, Allowed values are: true, false, defaults to false encryption.aes.enable=false # Mandatory (if AES encryption is enabled) salt and password. Salt needs to be an hexadecimal encoded string #encryption.aes.password=xxx #encryption.aes.salt=73616c7479 # Optional, defaults to PBKDF2WithHmacSHA512 #encryption.aes.private.key.algorithm=PBKDF2WithHmacSHA512 # ========================================= Cassandra BlobStore Cache ====================================== # A cassandra cache can be enabled to reduce latency when reading small blobs frequently # A dedicated keyspace with a replication factor of one is then used # Cache eviction policy is TTL based # Only blobs below a given threshold will be stored. # To be noted that blobs are stored within a single Cassandra row, hence a low threshold should be used. # Enable the cache? Optional and default to false. Must be a boolean. cache.enable=false # Cache eviction policy is TTL based. Optional and defaults to 7 days. Must be a duration. # Valid units: ms, sec, min, hour, day, week, month, year # cache.cassandra.ttl=7days # Maximum size of stored objects expressed in bytes. Must be strictly positive. Defaults to 8192. # Units: bytes, Kib, MiB, GiB, TiB # cache.sizeThresholdInBytes=8 KiB # ============================================== ObjectStorage ============================================ ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/cassandra.properties ===================================================== # Configuration file for cassandra mailbox # Read https://james.apache.org/server/config-cassandra.html for further details # Advanced Cassandra driver option needs to be set via cassandra-driver.conf configuration file cassandra.nodes=cassandra cassandra.keyspace.create=true cassandra.keyspace=apache_james #cassandra.user=cassandra #cassandra.password=cassandra cassandra.replication.factor=1 cassandra.retryConnection.maxRetries=200 cassandra.retryConnection.minDelay=5000 # Optional. Allows specifying consistency level ONE for reads in Cassandra BlobStore. # Falls back to default read consistency level if the blob is missing. # Defaults to false. # optimistic.consistency.level.enabled=false # Optional. Allows not to use lightweight transactions in CassandraMailRepository. # If disabled we implement an idempotent behaviour (duplicates are overridden, missing entries upon deletes are ignored). # Defaults to true. # mailrepository.strong.consistency=true ===================================================== == File: server/apps/distributed-pop3-app/sample-configuration/rabbitmq.properties ===================================================== # RabbitMQ configuration # Read https://james.apache.org/server/config-rabbitmq.html for further details # Mandatory uri=amqp://rabbitmq:5672 # If you use a vhost, specify it as well at the end of the URI # uri=amqp://rabbitmq:5672/vhost # Vhost to use for creating queues and exchanges # Optional, only use this if you have invalid URIs containing characters like '_' # vhost=vhost1 # Optional, default to the host specified as part of the URI. # Allow creating cluster aware connections. # hosts=ip1:5672,ip2:5672 # RabbitMQ Administration Management # Mandatory management.uri=http://rabbitmq:15672 # Mandatory management.user=guest # Mandatory management.password=guest # Configure retries count to retrieve a connection. Exponential backoff is performed between each retries. # Optional integer, defaults to 10 #connection.pool.retries=10 # Configure initial duration (in ms) between two connection retries. Exponential backoff is performed between each retries. # Optional integer, defaults to 100 #connection.pool.min.delay.ms=100 # Configure retries count to retrieve a channel. Exponential backoff is performed between each retries. # Optional integer, defaults to 3 #channel.pool.retries=3 # Configure timeout duration (in ms) to obtain a rabbitmq channel. Defaults to 30 seconds. # Optional integer, defaults to 30 seconds. #channel.pool.max.delay.ms=30000 # Configure the size of the channel pool. # Optional integer, defaults to 3 #channel.pool.size=3 # Optional, non-negative integer, default to 100ms. # The interval (in ms) that RabbitMQ driver will automatic recovery wait before attempting to reconnect. # See https://www.rabbitmq.com/client-libraries/java-api-guide#connection-recovery #driver.network.recovery.interval=100 # Boolean. Whether to activate Quorum queue usage for all queues. # Quorum queues enables high availability. # False (default value) results in the usage of classic queues. #quorum.queues.enable=true ===================================================== == File: server/apps/jpa-smtp-app/docker-configuration/logback-cli.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/jpa-smtp-app/docker-compose.yml ===================================================== version: '3' # In order to start James JPA app on top of mariaDB: # 1. Download the driver: `wget https://repo1.maven.org/maven2/org/mariadb/jdbc/mariadb-java-client/2.7.2/mariadb-java-client-2.7.2.jar` # 2. Generate the keystore with the default password `james72laBalle`: `keytool -genkey -alias james -keyalg RSA -keystore keystore` # 3. Start MariaDB: `docker-compose up -d mariadb` # 4. Start James: `docker-compose up james` services: james: depends_on: - mariadb image: apache/james:jpa-smtp-latest container_name: james hostname: james.local volumes: - $PWD/mariadb-java-client-2.7.2.jar:/root/libs/james-jdbc-driver.jar - $PWD/sample-configuration/james-database-mariadb.properties:/root/conf/james-database.properties - $PWD/keystore:/root/conf/keystore mariadb: image: mariadb:10.6 environment: - MARIADB_ROOT_PASSWORD=test - MARIADB_DATABASE=test - MARIADB_USER=test - MARIADB_PASSWORD=test ===================================================== == File: server/apps/jpa-smtp-app/README.adoc ===================================================== = Guice-JPA SMTP Server How-to This server target single node James deployments. By default, the derby database is used. This server acts as a Mail Transfer Agent and do not embed the mailbox component. == Requirements * Java 21 SDK == Running To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. A [sample directory](https://github.com/apache/james-project/tree/master/server/apps/jpa-smtp-app/sample-configuration) is provided with some default values you may need to replace. You will need to update its content to match your needs. You also need to generate a keystore with the following command: [source] ---- $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ---- Once everything is set up, you just have to run the jar with: [source] ---- $ java -javaagent:james-server-jpa-smtp-app.lib/openjpa-3.2.0.jar \ -Dworking.directory=. \ -Djdk.tls.ephemeralDHKeySize=2048 \ -Dlogback.configurationFile=conf/logback.xml \ -jar james-server-jpa-smtp-app.jar ---- Note that binding ports below 1024 requires administrative rights. == Docker distribution To import the image locally: [source] ---- docker image load -i target/jib-image.tar ---- Then run it: [source] ===================================================== == File: server/apps/jpa-smtp-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/jpa-smtp-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* -Dlogback.configurationFile=/root/conf/logback-cli.xml org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/jpa-smtp-app/src/assemble/extensions-jars.txt ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add you customs Mailets/Matchers. ===================================================== == File: server/apps/jpa-smtp-app/conf/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/jpa-smtp-app/conf/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true # JMX, when enable causes RMI to plan System.gc every hour. Set this instead to once every 1000h. sun.rmi.dgc.server.gcInterval=3600000000 sun.rmi.dgc.client.gcInterval=3600000000 # Automatically generate a JMX password upon start. CLI is able to retrieve this password. Not supported on windows. james.jmx.credential.generation=true # Disable Remote Code Execution feature from JMX ===================================================== == File: server/apps/jpa-smtp-app/conf/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/jpa-smtp-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/jpa-smtp-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true # JMX, when enable causes RMI to plan System.gc every hour. Set this instead to once every 1000h. sun.rmi.dgc.server.gcInterval=3600000000 ===================================================== == File: server/apps/jpa-smtp-app/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/conf/jmxremote.access ===================================================== james-admin readwrite ===================================================== == File: server/apps/conf/jmxremote.password ===================================================== james-admin changeme ===================================================== == File: server/apps/postgres-app/clean_up.sql ===================================================== -- This is a script to delete old rows from some tables. One of the attempts to clean up the never-used data after a long time. DO $$ DECLARE days_to_keep INTEGER; BEGIN -- Set the number of days dynamically days_to_keep := 60; -- Delete rows older than the specified number of days in email_change DELETE FROM email_change WHERE date < current_timestamp - interval '1 day' * days_to_keep; -- Delete rows older than the specified number of days in mailbox_change DELETE FROM email_change WHERE date < current_timestamp - interval '1 day' * days_to_keep; -- Delete outdated vacation notifications (older than the current UTC timestamp) DELETE FROM vacation_notification_registry WHERE expiry_date < CURRENT_TIMESTAMP AT TIME ZONE 'UTC'; END $$; ===================================================== == File: server/apps/postgres-app/sample-configuration-single/search.properties ===================================================== # not for production purposes. To be replaced by PG based search. implementation=scanning ===================================================== == File: server/apps/postgres-app/docker-compose.yml ===================================================== version: '3' services: james: depends_on: - postgres image: apache/james:postgres-latest container_name: james hostname: james.local command: - --generate-keystore ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" volumes: - ./sample-configuration-single/search.properties:/root/conf/search.properties - ./sample-configuration/blob.properties:/root/conf/blob.properties postgres: image: postgres:16.3 ports: - "5432:5432" environment: - POSTGRES_DB=james - POSTGRES_USER=james - POSTGRES_PASSWORD=secret1 ===================================================== == File: server/apps/postgres-app/README.adoc ===================================================== = Guice-Postgres Server How-to This server targets reactive James deployments with postgresql database. == Requirements * Java 11 SDK === With Postgresql only Firstly, create your own user network on Docker for the James environment: $ docker network create --driver bridge james Third party compulsory dependencies: * Postgresql 16.0 [source] ---- $ docker run -d --network james -p 5432:5432 --name=postgres --env 'POSTGRES_DB=james' --env 'POSTGRES_USER=james' --env 'POSTGRES_PASSWORD=secret1' postgres:16.0 ---- === Distributed version Here you have the choice of using other third party softwares to handle object data storage, search indexing and event bus. For now, dependencies supported are: * OpenSearch 2.8.0 [source] ---- $ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' opensearchproject/opensearch:2.8.0 ---- * Zenko Cloudserver or AWS S3 [source] ---- $ docker run -d --network james --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 registry.scality.com/cloudserver/cloudserver:8.7.25 ---- * RabbitMQ 3.12.1 [source] ---- $ docker run -d --network james -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:3.12.1-management ---- ===================================================== == File: server/apps/postgres-app/sample-configuration-distributed/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Read https://james.apache.org/server/config-blobstore.html for further details # Choose your BlobStore implementation # Mandatory, allowed values are: file, s3, postgres. implementation=s3 # ========================================= Deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=true # deduplication.family needs to be incremented every time the deduplication.generation.duration is changed # Positive integer, defaults to 1 # deduplication.gc.generation.family=1 # Duration of generation. # Deduplication only takes place within a singe generation. # Only items two generation old can be garbage collected. (This prevent concurrent insertions issues and # accounts for a clock skew). # deduplication.family needs to be incremented everytime this parameter is changed. # Duration. Default unit: days. Defaults to 30 days. # deduplication.gc.generation.duration=30days # ========================================= Encryption ======================================== # If you choose to enable encryption, the blob content will be encrypted before storing them in the BlobStore. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to all content being # encrypted. This comes at a performance impact but presents you from leaking data if, for instance the third party # offering you a S3 service is compromised. # Optional, Allowed values are: true, false, defaults to false encryption.aes.enable=false # Mandatory (if AES encryption is enabled) salt and password. Salt needs to be an hexadecimal encoded string #encryption.aes.password=xxx #encryption.aes.salt=73616c7479 # Optional, defaults to PBKDF2WithHmacSHA512 #encryption.aes.private.key.algorithm=PBKDF2WithHmacSHA512 # ============================================== ObjectStorage ============================================ # ========================================= ObjectStorage Buckets ========================================== # bucket names prefix # Optional, default no prefix # objectstorage.bucketPrefix=prod- # Default bucket name # Optional, default is bucketPrefix + `default` # objectstorage.namespace=james ===================================================== == File: server/apps/postgres-app/sample-configuration-distributed/rabbitmq.properties ===================================================== # RabbitMQ configuration # Read https://james.apache.org/server/config-rabbitmq.html for further details # Mandatory uri=amqp://rabbitmq:5672 # If you use a vhost, specify it as well at the end of the URI # uri=amqp://rabbitmq:5672/vhost # Vhost to use for creating queues and exchanges # Optional, only use this if you have invalid URIs containing characters like '_' # vhost=vhost1 # Optional, default to the host specified as part of the URI. # Allow creating cluster aware connections. # hosts=ip1:5672,ip2:5672 # RabbitMQ Administration Management # Mandatory management.uri=http://rabbitmq:15672 # Mandatory management.user=guest # Mandatory management.password=guest # Configure retries count to retrieve a connection. Exponential backoff is performed between each retries. # Optional integer, defaults to 10 #connection.pool.retries=10 # Configure initial duration (in ms) between two connection retries. Exponential backoff is performed between each retries. # Optional integer, defaults to 100 #connection.pool.min.delay.ms=100 # Configure retries count to retrieve a channel. Exponential backoff is performed between each retries. # Optional integer, defaults to 3 #channel.pool.retries=3 # Configure timeout duration (in ms) to obtain a rabbitmq channel. Defaults to 30 seconds. # Optional integer, defaults to 30 seconds. #channel.pool.max.delay.ms=30000 # Configure the size of the channel pool. # Optional integer, defaults to 3 #channel.pool.size=3 # Boolean. Whether to activate Quorum queue usage for use cases that benefits from it (work queue). # Quorum queues enables high availability. # False (default value) results in the usage of classic queues. #quorum.queues.enable=true # Strictly positive integer. The replication factor to use when creating quorum queues. #quorum.queues.replication.factor # Parameters for the Cassandra administrative view ===================================================== == File: server/apps/postgres-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/postgres-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/postgres-app/src/test/resources/eml/htmlMail.eml ===================================================== Delivered-To: mister@james.org Received: by 10.28.170.202 with SMTP id t193csp327634wme; Thu, 4 Jun 2015 00:36:15 -0700 (PDT) X-Received: by 10.180.77.195 with SMTP id u3mr5042880wiw.30.1433403375307; Thu, 04 Jun 2015 00:36:15 -0700 (PDT) Return-Path: <bounces+1453977-062b-mister=james.org@email.airbnb.com> Received: from o7.email.airbnb.com (o7.email.airbnb.com. [167.89.32.249]) by mx.google.com with ESMTPS id i2si5691730wjz.123.2015.06.04.00.36.13 for <mister@james.org> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Jun 2015 00:36:15 -0700 (PDT) Received-SPF: pass (google.com: domain of bounces+1453977-062b-mister=james.org@email.airbnb.com designates 167.89.32.249 as permitted sender) client-ip=167.89.32.249; Authentication-Results: mx.google.com; spf=pass (google.com: domain of bounces+1453977-062b-mister=james.org@email.airbnb.com designates 167.89.32.249 as permitted sender) smtp.mail=bounces+1453977-062b-mister=james.org@email.airbnb.com; dkim=pass header.i=@email.airbnb.com; dmarc=pass (p=REJECT dis=NONE) header.from=airbnb.com DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=email.airbnb.com; h=from:to:subject:mime-version:content-type:content-transfer-encoding; s=s20150428; bh=2mhWUwzjtQTC0KljgpaEsuvrqok=; b=EhC2QHKb5+63egDD qDCAepUELCeUZXCkw8+31kGT+O1va3iAKvQSAvzXJ3qJlIL9FgdeFk8sR78Vszn/ A73vp6NGjAW60M4gUZjxEOIPzGKIS95KfmHxg10fXUOFW0uePojNEg4ZPCcuitrZ HuWvzHK5I2siGnqupiivwxDgs5c= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.info; h=from:to:subject:mime-version:content-type:content-transfer-encoding:x-feedback-id; s=smtpapi; bh=2mhWUwzjtQTC0KljgpaEsuvrqok=; b=FPiYMmNJLCrL2e8v/0 DQC4voofe8nuuE7rhXZ25oqNAhAQja4oKIysJ1qAME2aEaqh+N5aJlCEuHrSG/7+ NAQ0OY8KaJ2zlnxAbmgJETOjnf4oGdAa+nU/nVVEPfN2NRcBCNLGQZ80U4T5k8Xi PakIuZvKDTRq7PiosSCSHT/FQ= Received: by filter0490p1mdw1.sendgrid.net with SMTP id filter0490p1mdw1.13271.556FFFE7B 2015-06-04 07:36:09.249601779 +0000 UTC Received: from i-dee0850e.inst.aws.airbnb.com (ec2-54-90-154-187.compute-1.amazonaws.com [54.90.154.187]) by ismtpd-017 (SG) with ESMTP id 14dbd7fa6b4.779a.254b43 for <mister@james.org>; Thu, 04 Jun 2015 07:36:09 +0000 (UTC) Received: by i-dee0850e.inst.aws.airbnb.com (Postfix, from userid 1041) id 19CBA24C60; Thu, 4 Jun 2015 07:36:09 +0000 (UTC) Date: Thu, 04 Jun 2015 07:36:08 +0000 From: Airbnb <discover@airbnb.com> To: mister@james.org Message-ID: <556fffe8cac78_7ed0e0fe204457be@i-dee0850e.mail> Subject: Text and Html not similar Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_556fffe8c7e84_7ed0e0fe20445637"; charset=UTF-8 Content-Transfer-Encoding: 7bit X-User-ID: 32692788 X-Locale: fr X-Category: engagement X-Template: low_intent_top_destinations recipients: ===================================================== == File: server/apps/postgres-app/src/assemble/extensions-jars.txt ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add you customs Mailets/Matchers. ===================================================== == File: server/apps/postgres-app/provision.sh ===================================================== #!/bin/bash export WEBADMIN_BASE_URL="http://localhost:8000" export DOMAIN_NAME="domain.org" export USERS_COUNT=1000 echo "Start provisioning users." user_file="./imap-provision-conf/users.csv" # Remove old users.csv file if [ -e "$user_file" ]; then echo "Removing old users.csv file" rm $user_file fi # Create domain curl -X PUT ${WEBADMIN_BASE_URL}/domains/${DOMAIN_NAME} for i in $(seq 1 $USERS_COUNT) do # Create user echo "Creating user $i" username=user${i}@$DOMAIN_NAME curl -XPUT ${WEBADMIN_BASE_URL}/users/$username \ -d '{"password":"secret"}' \ -H "Content-Type: application/json" # Append user to users.csv echo -e "$username,secret" >> $user_file done echo "Finished provisioning users." # Provisioning IMAP mailboxes and messages. echo "Start provisioning IMAP mailboxes and messages..." docker run --rm -it --name james-provisioning --network host -v ./imap-provision-conf/provisioning.properties:/conf/provisioning.properties \ -v $user_file:/conf/users.csv linagora/james-provisioning:latest echo "Finished provisioning IMAP mailboxes and messages." ===================================================== == File: server/apps/postgres-app/imap-provision-conf/provisioning.properties ===================================================== # IMAP (S) URL of the James server. Certificates are blindly trusted url=imaps://localhost:993 # Count of mailboxes to create per user mailbox.count=4 # Count of messages to create per folder message.per.folder.count=5 # Count of messages to create in INBOX message.inbox.count=5 # Count of threads of the IMAP client thread.count=8 # Concurrent count of users to provision simultaneously concurrent.user.count=10 # Connections to use per user connection.per.user.count=2 # Read timeout of IMAP connections. read.timeout.ms=180000 # Connect timeout connect.timeout.ms=30000 # Count of users to offset (ignore) in the provisioning. users.offset=0 # Count of users to provision # users.limit=100 ===================================================== == File: server/apps/postgres-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/postgres-app/sample-configuration/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/apps/postgres-app/sample-configuration/deletedMessageVault.properties ===================================================== # ============================================= Deleted Messages Vault Configuration ================================== enabled=false # Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up # Optional, default 1y # retentionPeriod=1y ===================================================== == File: server/apps/postgres-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true # JMX, when enable causes RMI to plan System.gc every hour. Set this instead to once every 1000h. sun.rmi.dgc.server.gcInterval=3600000000 sun.rmi.dgc.client.gcInterval=3600000000 # Automatically generate a JMX password upon start. CLI is able to retrieve this password. james.jmx.credential.generation=true # Disable Remote Code Execution feature from JMX ===================================================== == File: server/apps/postgres-app/sample-configuration/postgres.properties ===================================================== # String. Optional, default to 'postgres'. Database name. database.name=james # String. Optional, default to 'public'. Database schema. database.schema=public # String. Optional, default to 'localhost'. Database host. database.host=postgres # Integer. Optional, default to 5432. Database port. database.port=5432 # String. Required. Database username. database.username=james # String. Required. Database password of the user. database.password=secret1 # Boolean. Optional, default to false. Whether to enable row level security. row.level.security.enabled=false # String. It is required when row.level.security.enabled is true. Database username with the permission of bypassing RLS. #database.by-pass-rls.username=bypassrlsjames # String. It is required when row.level.security.enabled is true. Database password of by-pass-rls user. #database.by-pass-rls.password=secret1 # Integer. Optional, default to 10. Database connection pool initial size. pool.initial.size=10 # Integer. Optional, default to 15. Database connection pool max size. pool.max.size=15 # Integer. Optional, default to 5. rls-bypass database connection pool initial size. by-pass-rls.pool.initial.size=5 # Integer. Optional, default to 10. rls-bypass database connection pool max size. by-pass-rls.pool.max.size=10 # String. Optional, defaults to allow. SSLMode required to connect to the Postgresql db server. # Check https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-PROTECTION for a list of supported SSLModes. ssl.mode=allow ## Duration. Optional, defaults to 10 second. jOOQ reactive timeout when executing Postgres query. This setting prevent jooq reactive bug from causing hanging issue. #jooq.reactive.timeout=10second ===================================================== == File: server/apps/postgres-app/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/postgres-app/sample-configuration/jmap.properties ===================================================== # Configuration file for JMAP # Read https://james.apache.org/server/config-jmap.html for further details enabled=true tls.keystoreURL=file://conf/keystore tls.secret=james72laBalle # only not work for RabbitMQ mail queue #delay.sends.enabled=true # Alternatively TLS keys can be supplied via PEM files # tls.privateKey=file://conf/private.nopass.key # tls.certificates=file://conf/certs.self-signed.csr # An optional secret might be specified for the private key # tls.secret=james72laBalle # # If you wish to use OAuth authentication, you should provide a valid JWT public key. # The following entry specify the link to the URL of the public key file, # which should be a PEM format file. # # jwt.publickeypem.url=file://conf/jwt_publickey # Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against OpenSearch? # This enables a higher resilience, but the projection needs to be correctly populated. False by default. # view.email.query.enabled=true # If you want to specify authentication strategies for Jmap rfc-8621 version # For custom Authentication Strategy not inside package "org.apache.james.jmap.http", you have to specify its FQDN # authentication.strategy.rfc8621=JWTAuthenticationStrategy,BasicAuthenticationStrategy # Prevent server side request forgery by preventing calls to the private network ranges. Defaults to true, can be disabled for testing. # webpush.prevent.server.side.request.forgery=false ===================================================== == File: server/apps/postgres-app/sample-configuration/droplists.properties ===================================================== # Configuration file for DropLists enabled=false ===================================================== == File: server/apps/postgres-app/sample-configuration/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Read https://james.apache.org/server/config-blobstore.html for further details # Choose your BlobStore implementation # Mandatory, allowed values are: file, s3, postgres. implementation=postgres # ========================================= Deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=true # deduplication.family needs to be incremented every time the deduplication.generation.duration is changed # Positive integer, defaults to 1 # deduplication.gc.generation.family=1 # Duration of generation. # Deduplication only takes place within a singe generation. # Only items two generation old can be garbage collected. (This prevent concurrent insertions issues and # accounts for a clock skew). # deduplication.family needs to be incremented everytime this parameter is changed. # Duration. Default unit: days. Defaults to 30 days. # deduplication.gc.generation.duration=30days # ========================================= Encryption ======================================== # If you choose to enable encryption, the blob content will be encrypted before storing them in the BlobStore. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to all content being # encrypted. This comes at a performance impact but presents you from leaking data if, for instance the third party # offering you a S3 service is compromised. # Optional, Allowed values are: true, false, defaults to false encryption.aes.enable=false # Mandatory (if AES encryption is enabled) salt and password. Salt needs to be an hexadecimal encoded string #encryption.aes.password=xxx #encryption.aes.salt=73616c7479 # Optional, defaults to PBKDF2WithHmacSHA512 #encryption.aes.private.key.algorithm=PBKDF2WithHmacSHA512 # ============================================ Blobs Exporting ============================================== # Read https://james.apache.org/server/config-blob-export.html for further details # Choosing blob exporting mechanism, allowed mechanism are: localFile, linshare # LinShare is a file sharing service, will be explained in the below section # Optional, default is localFile blob.export.implementation=localFile # ======================================= Local File Blobs Exporting ======================================== # Optional, directory to store exported blob, directory path follows James file system format ===================================================== == File: server/apps/postgres-app/docker-compose-distributed.yml ===================================================== version: '3' services: james: depends_on: postgres: condition: service_started opensearch: condition: service_healthy s3: condition: service_started rabbitmq: condition: service_started image: apache/james:postgres-latest container_name: james hostname: james.local command: - --generate-keystore ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" volumes: - ./sample-configuration-distributed/opensearch.properties:/root/conf/opensearch.properties - ./sample-configuration-distributed/blob.properties:/root/conf/blob.properties - ./sample-configuration-distributed/rabbitmq.properties:/root/conf/rabbitmq.properties networks: - james opensearch: image: opensearchproject/opensearch:2.8.0 container_name: opensearch healthcheck: test: curl -s http://opensearch:9200 >/dev/null || exit 1 interval: 3s timeout: 10s retries: 5 environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true networks: - james ===================================================== == File: server/apps/postgres-app/performance-test.md ===================================================== # Performance test Postgres app To provision and benchmark an IMAP server backed by PostgreSQL, please have a look at following steps: 1. Build and extract the Postgres app docker image. - `mvn clean install -DskipTests -Dmaven.skip.doc=true` - `docker load -i ./target/jib-image.tar` 2. Run the Postgres app: `docker compose up` 3. Provision users and IMAP mailboxes + messages: `./provision.sh` 4. Performance test IMAP server using [james-gatling](https://github.com/linagora/james-gatling) Sample IMAP simulation: `gatling:testOnly org.apache.james.gatling.simulation.imap.PlatformValidationSimulation`. ===================================================== == File: server/apps/demo/initialdata.sh ===================================================== #!/bin/bash james-cli adddomain james.local james-cli adduser user01@james.local 1234 james-cli adduser user02@james.local 1234 james-cli adduser user03@james.local 1234 ===================================================== == File: server/apps/demo/Dockerfile ===================================================== # Run James # # VERSION 1.0 FROM apache/james:jpa-latest # Install git RUN apt-get update RUN apt-get install -y git openssl WORKDIR /root RUN git clone https://github.com/vishnubob/wait-for-it.git wait-for-it RUN cp /root/wait-for-it/wait-for-it.sh /usr/bin/wait-for-it.sh COPY startup.sh /root COPY initialdata.sh /root COPY imapserver.xml /root/conf COPY smtpserver.xml /root/conf COPY pop3server.xml /root/conf RUN chmod +x /root/startup.sh RUN chmod +x /root/initialdata.sh ENTRYPOINT ["./startup.sh"] ===================================================== == File: server/apps/demo/startup.sh ===================================================== #!/bin/bash if [[ ! -e /root/conf/private.key ]]; then openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Apache/L=Fundation/O=/CN=james.apache.org" -keyout /root/conf/private.key -out /root/conf/private.csr fi wait-for-it.sh --host=localhost --port=9999 --strict --timeout=0 -- ./initialdata.sh & java -Djdk.tls.ephemeralDHKeySize=2048 \ -classpath '/root/resources:/root/classes:/root/libs/*' \ -javaagent:/root/libs/openjpa-3.2.0.jar \ -Dlogback.configurationFile=/root/conf/logback.xml \ -Dworking.directory=/root/ org.apache.james.JPAJamesServerMain ===================================================== == File: server/apps/cli/README.adoc ===================================================== == Apache James Server Command Line Interface To invoke the James CLI from shell during your development process: [source] ---- java -jar james-server-cli.jar -h localhost -p 9999 help ---- ===================================================== == File: server/apps/distributed-app/docker-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # Required to locate Cassandra driver configuration config.file=/root/conf/cassandra-driver.conf # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true ===================================================== == File: server/apps/distributed-app/docker-configuration/logback-cli.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/distributed-app/docker-compose.yml ===================================================== version: '3' services: james: depends_on: cassandra: condition: service_healthy opensearch: condition: service_started tika: condition: service_started rabbitmq: condition: service_started s3: condition: service_started image: apache/james:distributed-latest container_name: james hostname: james.local command: - --generate-keystore networks: - james ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" opensearch: image: opensearchproject/opensearch:2.14.0 environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true networks: james: aliases: - elasticsearch cassandra: image: cassandra:4.1.5 ports: - "9042:9042" healthcheck: test: [ "CMD", "cqlsh", "-e", "describe keyspaces" ] ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/secrets.yaml ===================================================== apiVersion: v1 data: jwt_publickey: "{{ .Values.james.secret.jwtPublicKey | b64enc }}" jwt_privatekey: "{{ .Values.james.secret.jwtPrivateKey | b64enc }}" kind: Secret type: Opaque metadata: name: james-jwt-key --- apiVersion: v1 data: james-user: "{{ .Values.james.secret.cassandraUser | b64enc }}" james-password: "{{ .Values.james.secret.cassandraPassword | b64enc }}" kind: Secret type: Opaque metadata: name: db-cassandra-account-james --- {{- if and (.Values.james.secret.esUser) (.Values.james.secret.esPassword) }} apiVersion: v1 data: james-user: "{{ .Values.james.secret.esUser | b64enc }}" james-password: "{{ .Values.james.secret.esPassword | b64enc }}" kind: Secret type: Opaque metadata: name: db-es-account-james {{- end }} --- apiVersion: v1 data: dkim.key: "{{ .Values.james.secret.dkimPrivateKey | b64enc }}" kind: Secret type: Opaque metadata: name: dkim-private-key --- apiVersion: v1 data: OS_S3_ENDPOINT: {{ .Values.james.secret.s3.endpoint | b64enc }} OS_S3_REGION: {{ .Values.james.secret.s3.region | b64enc }} OS_S3_ACCESSKEYID: {{ .Values.james.secret.s3.accessKeyId | b64enc }} OS_S3_SECRETKEY: {{ .Values.james.secret.s3.secretKey | b64enc }} kind: Secret type: Opaque metadata: name: s3-james-credentials --- apiVersion: v1 data: ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/servicemonitor.yaml ===================================================== {{- if .Values.serviceMonitor.enabled }} apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: james-service-monitor labels: {{- toYaml .Values.serviceMonitor.additionalLabels | nindent 4 }} spec: jobLabel: jobLabel selector: matchLabels: app: james namespaceSelector: matchNames: - {{ .Release.Namespace }} endpoints: - port: web path: /metrics {{- end }} ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/james-admin-ingress.yaml ===================================================== {{- if .Values.adminIngress.enabled }} apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: james-admin {{- with .Values.adminIngress.annotations }} annotations: {{- toYaml . | nindent 4 }} {{- end }} spec: {{- if .Values.adminIngress.ingressClassName }} ingressClassName: {{ .Values.adminIngress.ingressClassName }} {{- end }} {{- if .Values.adminIngress.tls }} tls: - hosts: - {{ .Values.dns.adminUrl }} {{ toYaml .Values.adminIngress.tls }} {{- end }} rules: - host: {{ .Values.dns.adminUrl }} http: paths: - path: / pathType: Prefix backend: service: name: james-admin port: number: 8000 {{- end }} ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/_docker-secrets.tpl ===================================================== {{- define "imagePullSecret" }} {{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.dockerCredentials.registry (printf "%s:%s" .Values.dockerCredentials.username .Values.dockerCredentials.password | b64enc) | b64enc }} {{- end }} ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/_helpers.tpl ===================================================== {{/* Builds up the JAVA_TOOL_OPTIONS env variable for java tunning James */}} {{- define "james.jvmOpts" -}} {{- if .Values.james.env.glowroot.enabled }} {{- printf "%s -javaagent:/root/glowroot/glowroot.jar" .Values.james.env.jvmOpts }} {{- else }} {{- .Values.james.env.jvmOpts }} {{- end }} {{- end }} ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/jmap-ingress.yaml ===================================================== {{- if .Values.ingress.enabled }} apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: jmap {{- with .Values.ingress.annotations }} annotations: {{- toYaml . | nindent 4 }} {{- end }} spec: {{- if .Values.ingress.ingressClassName }} ingressClassName: {{ .Values.ingress.ingressClassName }} {{- end }} {{- if .Values.ingress.tls }} tls: - hosts: - {{ .Values.dns.jmapUrl }} {{ toYaml .Values.ingress.tls }} {{- end }} rules: - host: {{ .Values.dns.jmapUrl }} http: paths: - path: / pathType: Prefix backend: service: name: jmap port: number: 80 {{- end }} ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/deployment.yaml ===================================================== {{- $elasticsearchUrl := include "elasticsearch.url.list" . }} {{- $cassandraUrl := include "cassandra.url.list" . }} {{- $jamesOpts := include "james.jvmOpts" . }} apiVersion: apps/v1 kind: Deployment metadata: name: james-jmap spec: selector: matchLabels: instance: james-jmap replicas: {{ .Values.james.replicaJmapInstanceCount }} template: metadata: labels: app: james instance: james-jmap spec: {{- if .Values.dockerCredentials }} imagePullSecrets: - name: docker-registry-secret {{- end }} affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - james topologyKey: "kubernetes.io/hostname" containers: - name: james-jmap image: {{ .Values.james.image }} readinessProbe: httpGet: path: /healthcheck/checks/Guice%20application%20lifecycle port: 8000 initialDelaySeconds: 60 periodSeconds: 10 livenessProbe: httpGet: path: /healthcheck/checks/Guice%20application%20lifecycle port: 8000 initialDelaySeconds: 91 periodSeconds: 30 ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/service.yaml ===================================================== kind: Service apiVersion: v1 metadata: name: james-client spec: selector: instance: james-imap-smtp type: ClusterIP ports: - protocol: TCP port: 465 name: "smtp-ssl" --- apiVersion: v1 kind: Service metadata: name: james-imap spec: selector: instance: james-imap-smtp ports: - protocol: TCP port: 993 name : "imap-ssl" --- kind: Service apiVersion: v1 metadata: name: james-admin spec: selector: app: james ports: - protocol: TCP port: 8000 targetPort: 8000 name: "web" --- kind: Service apiVersion: v1 metadata: name: jmap spec: selector: instance: james-jmap ports: - protocol: TCP port: 80 targetPort: 80 name: "web" ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/_urls.tpl ===================================================== {{/* Contruct a temporary URL for Cassandra. This URL ends with a comma. */}} {{- define "cassandra.url.list" -}} {{- $port := "9042" }} {{- $ns := .Values.cassandra.namespace }} {{- if eq .Values.cassandra.deploy "as-pod" }} {{- $count := int .Values.cassandra.replicaCount }} {{- range $index := until $count }} {{- printf "cassandra-%d.%s:%s," $index $ns $port }} {{- end }} {{- else }} {{- range $ip := .Values.cassandra.ips }} {{- printf "%s:%s," $ip $port }} {{- end }} {{- end }} {{- end -}} {{/* Contruct a temporary URLfor Elastic Search. This URL ends with a comma */}} {{- define "elasticsearch.url.list" -}} {{- $port := "9200" }} {{- $ns := .Values.cassandra.namespace }} {{- if eq .Values.elasticsearch.deploy "as-pod" }} {{- $count := int .Values.elasticsearch.replicaCount }} {{- range $index := until $count }} {{- printf "elasticsearch-%d.%s:%s," $index $ns $port }} {{- end }} {{- else }} {{- range $ip := .Values.elasticsearch.ips }} {{- printf "%s:%s," $ip $port }} {{- end }} {{- end }} {{- end -}} ===================================================== == File: server/apps/distributed-app/helm-chart/james/templates/configmaps.yaml ===================================================== apiVersion: v1 kind: ConfigMap metadata: name: james-configs data: {{ (.Files.Glob "configs/*").AsConfig | indent 2 }} ===================================================== == File: server/apps/distributed-app/helm-chart/james/secrets.sample.yaml ===================================================== james: secret: jwtPublicKey: |- -----BEGIN PUBLIC KEY----- change-me -----END PUBLIC KEY----- jwtPrivateKey: |- -----BEGIN PUBLIC KEY----- change-me -----END PUBLIC KEY----- cassandraUser: change-me cassandraPassword: change-me esUser: change-me esPassword: change-me dkimPrivateKey: |- -----BEGIN PRIVATE KEY----- change-me -----END PRIVATE KEY----- s3: endpoint: "http://s3-us-east-1.amazonaws.com" region: "US" accessKeyId: "change-me" secretKey: "change-me" bucketNameSuffix: "change-me" ldap: secret: ldapUser: change-me ldapPassword: change-me rabbitmq: secret: jamesUser: change-me jamesPassword: change-me ===================================================== == File: server/apps/distributed-app/helm-chart/james/Chart.yaml ===================================================== apiVersion: v2 name: james description: A Helm chart for Distributed Apache James. type: application version: 0.2.0 ===================================================== == File: server/apps/distributed-app/helm-chart/james/values.yaml ===================================================== dns: ## Default domain for all emailing components emailDomain: "example.com" jmapUrl: "jmap.example.com" adminUrl: "admin.example.com" smtpHostname: "smtp.example.com" # Default values for james james: replicaJmapInstanceCount: 1 replicaImapSmtpInstanceCount: 1 image: apache/james:distributed-3.8.0 ## Environment for James env: jamesCassandraKeyspace: sandbox_james jamesCassandraCacheKeyspace: sandbox_james_cache jamesEsMailboxIndex: "mailbox_v1" jamesEsClusterName: "change-me" jamesEsHostScheme: "http" jamesEsSslValidationStrategy: "default" jamesEsHostNameVerifier: "default" jamesEsNbShards: 5 jamesEsNbReplica: 1 jamesEsMailboxReadAlias: "read-mailbox" jamesEsMailboxWriteAlias: "write-mailbox" jamesRabbitHost: "change-me" jamesMessageSize: 25M jamesDkimSignSmtp: "dkimselector" jamesDkimSignDomain: "mail.example.com" cassandraReplicationFactor: 3 jamesHELOMessage: "change-me" jvmOpts: "-Xms3g -Xmx3g" glowroot: enabled: false jamesResources: limits: cpu: "2000m" memory: "4Gi" requests: cpu: "1000m" memory: "4Gi" tls: secretName: the-name-of-a-secret # Requires Prometheus Operator to be installed serviceMonitor: enabled: false # Labels for Prometheus Operator to detect ServiceMonitor. Cannot be empty additionalLabels: change-me: change-me ===================================================== == File: server/apps/distributed-app/helm-chart/james/configs/webadmin.properties ===================================================== enabled=true port=8000 cors.enable=true cors.origin=* jwt.enabled=true extensions.routes=org.apache.james.webadmin.dropwizard.MetricsRoutes ===================================================== == File: server/apps/distributed-app/helm-chart/james/configs/jmap.properties ===================================================== # Configuration file for JMAP enabled=${env:JAMES_JMAP_ENABLED} tls.keystoreURL=file://secrets-jwt/keystore tls.secret=${env:JAMES_KEYSTORE_PASSWORD} # # If you wish to use OAuth authentication, you should provide a valid JWT public key. # The following entry specify the link to the URL of the public key file, # which should be a PEM format file. # jwt.publickeypem.url=file://conf/jwt_publickey jwt.privatekeypem.url=file://conf/jwt_privatekey jmap.port=80 view.email.query.enabled=true email.send.max.size=${env:JAMES_MESSAGE_SIZE} upload.max.size=${env:JAMES_MESSAGE_SIZE} ===================================================== == File: server/apps/distributed-app/helm-chart/james/configs/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=30 fetch.body=30 fetch.full=30 # IMAP COPY command copy=50 # IMAP MOVE command move=50 ===================================================== == File: server/apps/distributed-app/helm-chart/james/configs/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Choose your BlobStore implementation # Mandatory, allowed values are: cassandra, s3 implementation=s3 # ========================================= ObjectStorage deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=true single.save.enable=true # ========================================= Cassandra BlobStore Cache ====================================== # A cassandra cache can be enabled to reduce latency when reading small blobs frequently # A dedicated keyspace with a replication factor of one is then used # Cache eviction policy is TTL based # Only blobs below a given threshold will be stored. # To be noted that blobs are stored within a single Cassandra row, hence a low threshold should be used. # Enable the cache? Optional and default to false. Must be a boolean. cache.enable=true # Cache eviction policy is TTL based. Optional and defaults to 7 days. Must be a duration. # Valid units: ms, sec, min, hour, day, week, month, year cache.cassandra.ttl=1year # Maximum size of stored objects expressed in bytes. Must be strictly positive. Defaults to 8192. # Units: bytes, Kib, MiB, GiB, TiB cache.sizeThresholdInBytes=16 KiB # ============================================== ObjectStorage ============================================ # ========================================= ObjectStorage Buckets ========================================== # bucket names prefix # Optional, default no prefix # objectstorage.bucketPrefix=james-${env:NAMESPACE}- # Default bucket name # Optional, default is bucketPrefix + `default` objectstorage.namespace=james-${env:JAMES_BUCKET_SUFFIX} # ========================================= ObjectStorage on S3 ============================================= # Mandatory if you choose aws-s3 storage service, S3 authentication endpoint objectstorage.s3.endPoint=${env:OS_S3_ENDPOINT} # Mandatory if you choose s3 storage service, S3 region objectstorage.s3.region=${env:OS_S3_REGION} ===================================================== == File: server/apps/distributed-app/helm-chart/james/configs/cassandra.properties ===================================================== # Configuration file for cassandra mailbox # http://james.apache.org/server/config-cassandra.html cassandra.nodes=${env:JAMES_CASSANDRA_NODES_URLS} cassandra.keyspace.create=true cassandra.keyspace=${env:JAMES_CASSANDRA_KEYSPACE} cassandra.keyspace.cache=${env:JAMES_CASSANDRA_CACHE_KEYSPACE} cassandra.user=${env:JAMES_CASSANDRA_USER} cassandra.password=${env:JAMES_CASSANDRA_PASSWORD} cassandra.replication.factor=${env:JAMES_CASSANDRA_REPLICATION_FACTOR} cassandra.retryConnection.maxRetries=10 cassandra.retryConnection.minDelay=5000 mailbox.max.retry.message.flags.update=16 mailbox.max.retry.message.id.flags.update=16 mailbox.max.retry.modseq=16 mailbox.max.retry.acl=16 mailbox.max.retry.uid=16 mailbox.read.repair.chance=0.00 mailbox.counters.read.repair.chance.max=0.000 mailbox.counters.read.repair.chance.one.hundred=0.000 chunk.size.message.read=16 mailbox.read.strong.consistency=false message.read.strong.consistency=false message.write.strong.consistency.unsafe=false ===================================================== == File: server/apps/distributed-app/helm-chart/james/configs/rabbitmq.properties ===================================================== uri=amqp://${env:JAMES_AMQP_USERNAME}:${env:JAMES_AMQP_PASSWORD}@${env:JAMES_AMQP_HOST}:${env:JAMES_AMQP_PORT} # RabbitMQ Administration Management management.uri=http://${env:JAMES_AMQP_HOST}:${env:JAMES_AMQP_MANAGEMENT_PORT} management.user=${env:JAMES_AMQP_USERNAME} management.password=${env:JAMES_AMQP_PASSWORD} # Parameters for the Cassandra administrative view # Period of the window. Too large values will lead to wide rows while too little values might lead to many queries. # Use the number of mail per Cassandra row, along with your expected traffic, to determine this value # This value can only be decreased to a value dividing the current value mailqueue.view.sliceWindow=1h # Use to distribute the emails of a given slice within your cassandra cluster # A good value is 2*cassandraNodeCount # This parameter can only be increased. mailqueue.view.bucketCount=${env:JAMES_BUCKET_COUNT} # Determine the probability to update the browse start pointer # Too little value will lead to unnecessary reads. Too big value will lead to more expensive browse. # Choose this parameter so that it get's update one time every one-two sliceWindow mailqueue.view.updateBrowseStartPace=1000 # Enables or disables the gauge metric on the mail queue size # Computing the size of the mail queue is currently implemented on top of browse operation and thus have a linear complexity # Metrics get exported periodically as configured in opensearch.properties, thus getSize is also called periodically # Choose to disable it when the mail queue size is getting too big # Note that this is as well a temporary workaround until we get 'getSize' method better optimized # Optional, default true mailqueue.size.metricsEnabled=false connection.pool.retries=3 connection.pool.min.delay.ms=50 channel.pool.retries=2 channel.pool.min.delay.ms=100 channel.pool.size=10 ===================================================== == File: server/apps/distributed-app/helm-chart/README.md ===================================================== # Helm chart for James ## Introduction This chart bootstraps the distributed version of Apache James Mail Server on [Kubernetes](http://kubernetes.io) cluster using [Helm](https://helm.sh) package manager. Documentation on how to use it can be found at [Run Kubernetes](https://github.com/apache/james-project/blob/master/server/apps/distributed-app/docs/modules/ROOT/pages/run/run-kubernetes.adoc). ## Notice about mailetcontainer You will need to add yourself manually the `mailetcontainer.xml` configuration file into the configs folder proper to your client before installing the helm James package. You can get the template `mailetcontainer.xml` in our [sample-configuration](https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/) folder. NB: It should change in a near future as helm should support such an operation. ## Notice about RabbitMQ James is linked to RabbitMQ instances for mail processing. You need RabbitMQ to run before deploying James. The username and password for `rabbitmq-account-james` secret must be created first from RabbitMQ. ===================================================== == File: server/apps/distributed-app/docker-compose-with-pulsar.yml ===================================================== version: '3' services: james: depends_on: cassandra: condition: service_healthy opensearch: condition: service_started rabbitmq: condition: service_started s3: condition: service_started pulsar: condition: service_started image: apache/james:distributed-latest container_name: james hostname: james.local command: - --generate-keystore networks: - james ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" volumes: - ./sample-configuration/pulsar.properties:/root/conf/pulsar.properties - ./sample-configuration/queue-pulsar.properties:/root/conf/queue.properties opensearch: image: opensearchproject/opensearch:2.14.0 container_name: opensearch environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true networks: james: aliases: - elasticsearch cassandra: container_name: cassandra ===================================================== == File: server/apps/distributed-app/README.adoc ===================================================== = Guice-Distributed Server How-to == Requirements * Java 21 SDK Firstly, create your own user network on Docker for the James environment: $ docker network create --driver bridge james Third party compulsory dependencies: * Cassandra 4.0 * OpenSearch 2.1.0 * RabbitMQ-Management 3.8.18 * Zenko Cloudserver or AWS S3 [source] ---- $ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:4.1.5 $ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' --env 'DISABLE_SECURITY_PLUGIN=true' --env 'DISABLE_INSTALL_DEMO_CONFIG=true' opensearchproject/opensearch:2.14.0 $ docker run -d --network james -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:3.13.3-management $ docker run -d --network james -p 8000:8000 --env 'REMOTE_MANAGEMENT_DISABLE=1' --env 'SCALITY_ACCESS_KEY_ID=accessKey1' --env 'SCALITY_SECRET_ACCESS_KEY=secretKey1' --name=s3 ghcr.io/scality/cloudserver:8cbe2c066b3505b26d339dc67315d1041b8c7f3a ---- == Docker distribution To import the image locally: [source] ---- docker image load -i target/jib-image.tar ---- Then run it along with its dependency: [source] ---- docker compose up -d ---- Use the [JAVA_TOOL_OPTIONS environment option](https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#jvm-flags) to pass extra JVM flags. For instance: [source] ---- james: ... environment: - JAVA_TOOL_OPTIONS=-Xmx500m -Xms500m ===================================================== == File: server/apps/distributed-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/distributed-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* -Dlogback.configurationFile=/root/conf/logback-cli.xml org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/distributed-app/src/test/resources/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=200 fetch.body=100 fetch.full=50 # IMAP COPY command copy=100 # IMAP MOVE command move=100 ===================================================== == File: server/apps/distributed-app/src/test/resources/rabbitmq.properties ===================================================== uri=amqp://james:james@rabbitmq_host:5672 management.uri=http://james:james@rabbitmq_host:15672/api/ ===================================================== == File: server/apps/distributed-app/src/assemble/extensions-jars.txt ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add you customs Mailets/Matchers. ===================================================== == File: server/apps/distributed-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/distributed-app/sample-configuration/deletedMessageVault.properties ===================================================== # ============================================= Deleted Messages Vault Configuration ================================== enabled=false # Enable work queue to be used with deleted message vault # Default to false # workQueueEnabled=false # Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up # Optional, default 1y # retentionPeriod=1y # Messages restored from the Deleted Messages Vault are placed in a mailbox with this name (default: ``Restored-Messages``). # The mailbox will be created if it does not exist yet. # restoreLocation=Restored-Messages ===================================================== == File: server/apps/distributed-app/sample-configuration/queue-pulsar.properties ===================================================== mail.queue.choice=PULSAR ===================================================== == File: server/apps/distributed-app/sample-configuration/pulsar.properties ===================================================== broker.uri=pulsar://pulsar:6650 admin.uri=http://pulsar:8080 authentication.type=no-auth #authentication.basic.userId=userId #authentication.basic.password=password namespace=pulsar/system ===================================================== == File: server/apps/distributed-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # Required to locate Cassandra driver configuration config.file=conf/cassandra-driver.conf # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true ===================================================== == File: server/apps/distributed-app/sample-configuration/queue.properties ===================================================== mail.queue.choice=RABBITMQ ===================================================== == File: server/apps/distributed-app/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> <logger name="com.datastax.driver.core.QueryLogger.SLOW" level="DEBUG" /> </configuration> ===================================================== == File: server/apps/distributed-app/sample-configuration/jmap.properties ===================================================== # Configuration file for JMAP # Read https://james.apache.org/server/config-jmap.html for further details enabled=true tls.keystoreURL=file://conf/keystore tls.secret=james72laBalle # only not work for RabbitMQ mail queue #delay.sends.enabled=true # Alternatively TLS keys can be supplied via PEM files # tls.privateKey=file://conf/private.nopass.key # tls.certificates=file://conf/certs.self-signed.csr # An optional secret might be specified for the private key # tls.secret=james72laBalle # # If you wish to use OAuth authentication, you should provide a valid JWT public key. # The following entry specify the link to the URL of the public key file, # which should be a PEM format file. # # jwt.publickeypem.url=file://conf/jwt_publickey # Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against OpenSearch? # This enables a higher resilience, but the projection needs to be correctly populated. False by default. # view.email.query.enabled=true # If you want to specify authentication strategies for Jmap rfc-8621 version # For custom Authentication Strategy not inside package "org.apache.james.jmap.http", you have to specify its FQDN # authentication.strategy.rfc8621=JWTAuthenticationStrategy,BasicAuthenticationStrategy # Prevent server side request forgery by preventing calls to the private network ranges. Defaults to true, can be disabled for testing. # webpush.prevent.server.side.request.forgery=false ===================================================== == File: server/apps/distributed-app/sample-configuration/cassandra-driver.conf ===================================================== # James reference configuration for the DataStax Java driver for Apache Cassandra®. # # Unless you use a custom mechanism to load your configuration (see # SessionBuilder.withConfigLoader), all the values declared here will be used as defaults. # # See https://docs.datastax.com/en/developer/java-driver/4.13/manual/core/configuration/ for # available options. # # Please note that contact point and authentication needs to be set in cassandra.properties for now. datastax-java-driver { basic.request { timeout = 5 seconds consistency = QUORUM page-size = 5000 serial-consistency = SERIAL } advanced.connection { connect-timeout = 5 seconds init-query-timeout = 5 seconds pool { local.size = 2 remote.size = 2 } max-requests-per-connection = 1024 max-orphan-requests = 256 warn-on-init-error = true } advanced.throttler { // class = org.apache.james.backends.cassandra.utils.LockLessConcurrencyLimitingRequestThrottler class = ConcurrencyLimitingRequestThrottler max-queue-size = 10000 max-concurrent-requests = 192 } advanced.reconnect-on-init = true ===================================================== == File: server/apps/distributed-app/sample-configuration/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=200 fetch.body=100 fetch.full=50 # IMAP COPY command copy=100 # IMAP MOVE command move=100 ===================================================== == File: server/apps/distributed-app/sample-configuration/droplists.properties ===================================================== # Configuration file for DropLists enabled=false ===================================================== == File: server/apps/distributed-app/sample-configuration/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Read https://james.apache.org/server/config-blobstore.html for further details # Choose your BlobStore implementation # Mandatory, allowed values are: cassandra, s3 # *WARNING*: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to # alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) implementation=s3 # ========================================= Deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=false # deduplication.family needs to be incremented every time the deduplication.generation.duration is changed # Positive integer, defaults to 1 # deduplication.gc.generation.family=1 # Duration of generation. # Deduplication only takes place within a singe generation. # Only items two generation old can be garbage collected. (This prevent concurrent insertions issues and # accounts for a clock skew). # deduplication.family needs to be incremented everytime this parameter is changed. # Duration. Default unit: days. Defaults to 30 days. # deduplication.gc.generation.duration=30days # ========================================= Encryption ======================================== # If you choose to enable encryption, the blob content will be encrypted before storing them in the BlobStore. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to all content being # encrypted. This comes at a performance impact but presents you from leaking data if, for instance the third party # offering you a S3 service is compromised. # Optional, Allowed values are: true, false, defaults to false encryption.aes.enable=false # Mandatory (if AES encryption is enabled) salt and password. Salt needs to be an hexadecimal encoded string #encryption.aes.password=xxx #encryption.aes.salt=73616c7479 # Optional, defaults to PBKDF2WithHmacSHA512 #encryption.aes.private.key.algorithm=PBKDF2WithHmacSHA512 # ========================================= Cassandra BlobStore Cache ====================================== # A cassandra cache can be enabled to reduce latency when reading small blobs frequently # A dedicated keyspace with a replication factor of one is then used # Cache eviction policy is TTL based # Only blobs below a given threshold will be stored. # To be noted that blobs are stored within a single Cassandra row, hence a low threshold should be used. # Enable the cache? Optional and default to false. Must be a boolean. ===================================================== == File: server/apps/distributed-app/sample-configuration/cassandra.properties ===================================================== # Configuration file for cassandra mailbox # Read https://james.apache.org/server/config-cassandra.html for further details # Advanced Cassandra driver option needs to be set via cassandra-driver.conf configuration file cassandra.nodes=cassandra cassandra.keyspace.create=true cassandra.keyspace=apache_james #cassandra.user=cassandra #cassandra.password=cassandra cassandra.replication.factor=1 cassandra.retryConnection.maxRetries=200 cassandra.retryConnection.minDelay=5000 ## These low level tuning options controls performance related options in Cassandra related code ## The default values are documented here. Understand the effects before editing. # mailbox.read.repair.chance=0.1 ## Maximum probability of running a read repair for the mailbox counters # mailbox.counters.read.repair.chance.max=0.1 ## Probability of running a mailbox counters read repair for 100 messages. ## Inversely proportional to the count of messages ## Formula: read_repair_chance = min(mailbox.counters.read.repair.chance.max, (100/unseens)*mailbox.counters.read.repair.chance.one.hundred) # mailbox.counters.read.repair.chance.one.hundred=0.01 # mailbox.max.retry.acl=1000 # mailbox.max.retry.modseq=100000 # mailbox.max.retry.uid=100000 # mailbox.max.retry.message.flags.update=1000 # mailbox.max.retry.message.id.flags.update=1000 # fetch.advance.row.count=1000 # chunk.size.expunge=100 # mailbox.blob.part.size=102400 # Optional. Allows specifying consistency level ONE for reads in Cassandra BlobStore. # Falls back to default read consistency level if the blob is missing. # Defaults to false. # optimistic.consistency.level.enabled=false # Optional. Allows not to use lightweight transactions in CassandraMailRepository. # If disabled we implement an idempotent behaviour (duplicates are overridden, missing entries upon deletes are ignored). # Defaults to true. # mailrepository.strong.consistency=true # Optional, default to 0. Defensive value to add to uids and modseqs generated. This can be used as an heuristic to maintain # consistency even when consensus of Lightweight Transactions is broken, exemple during a disaster recovery process. # uid.modseq.increment=0 ===================================================== == File: server/apps/distributed-app/sample-configuration/rabbitmq.properties ===================================================== # RabbitMQ configuration # Read https://james.apache.org/server/config-rabbitmq.html for further details # Mandatory uri=amqp://rabbitmq:5672 # If you use a vhost, specify it as well at the end of the URI # uri=amqp://rabbitmq:5672/vhost # Vhost to use for creating queues and exchanges # Optional, only use this if you have invalid URIs containing characters like '_' # vhost=vhost1 # Optional, default to the host specified as part of the URI. # Allow creating cluster aware connections. # hosts=ip1:5672,ip2:5672 # RabbitMQ Administration Management # Mandatory management.uri=http://rabbitmq:15672 # Mandatory management.user=guest # Mandatory management.password=guest # Configure retries count to retrieve a connection. Exponential backoff is performed between each retries. # Optional integer, defaults to 10 #connection.pool.retries=10 # Configure initial duration (in ms) between two connection retries. Exponential backoff is performed between each retries. # Optional integer, defaults to 100 #connection.pool.min.delay.ms=100 # Configure retries count to retrieve a channel. Exponential backoff is performed between each retries. # Optional integer, defaults to 3 #channel.pool.retries=3 # Configure timeout duration (in ms) to obtain a rabbitmq channel. Defaults to 30 seconds. # Optional integer, defaults to 30 seconds. #channel.pool.max.delay.ms=30000 # Configure the size of the channel pool. # Optional integer, defaults to 3 #channel.pool.size=3 # Optional, non-negative integer, default to 100ms. # The interval (in ms) that RabbitMQ driver will automatic recovery wait before attempting to reconnect. # See https://www.rabbitmq.com/client-libraries/java-api-guide#connection-recovery #driver.network.recovery.interval=100 # Boolean. Whether to activate Quorum queue usage for all queues. # Quorum queues enables high availability. # False (default value) results in the usage of classic queues. #quorum.queues.enable=true ===================================================== == File: server/apps/distributed-app/docs/Dockerfile ===================================================== ARG ANTORA_VERSION=3.1.7 FROM antora/antora:${ANTORA_VERSION} AS antora_builder ARG JAMES_CHECKOUT=master RUN apk update && apk add git RUN git clone https://github.com/apache/james-project.git /james-project \ && cd /james-project \ && git checkout $JAMES_CHECKOUT WORKDIR /james-project/docs RUN antora antora-playbook-local.yml FROM nginx:alpine COPY --from=antora_builder /james-project/docs/build/site /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ===================================================== == File: server/apps/distributed-app/docs/ui-overrides/partials/header-content.hbs ===================================================== <header class="header"> <nav class="navbar"> <div class="navbar-brand"> <a class="navbar-item" href="{{{or site.url (or siteRootUrl siteRootPath)}}}"><img src="/_/img/james.svg" alt="james logo"> {{site.title}}</a> <button class="navbar-burger" data-target="topbar-nav"> <span></span> <span></span> <span></span> </button> </div> <div id="topbar-nav" class="navbar-menu"> <div class="navbar-end"> <a class="navbar-item" href="#">Home</a> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link" href="#">Products</a> <div class="navbar-dropdown"> <div class="navbar-item"><strong>James server</strong></div> <a class="navbar-item" href="https://github.com/apache/james-project">Repository</a> <a class="navbar-item" href="https://issues.apache.org/jira/projects/JAMES/issues">Issue Tracker</a> <hr class="navbar-divider"> <a class="navbar-item" href="https://james.apache.org/mime4j/index.html">Mime4J</a> <a class="navbar-item" href="https://james.apache.org/jsieve/index.html">jSieve</a> <a class="navbar-item" href="https://james.apache.org/jspf/index.html">jSPF</a> <a class="navbar-item" href="https://james.apache.org/jdkim/index.html">jDKIM</a> <a class="navbar-item" href="https://james.apache.org/hupa/index.html">HUPA</a> </div> </div> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link" href="#">Community</a> <div class="navbar-dropdown"> <!-- Not ideal but dropping the version in the href requires tweaking james-projet docs module first --> <a class="navbar-item" href="/james-project/3.7.3/community/mailing-lists.html">Mailing lists</a> <a class="navbar-item" href="https://gitter.im/apache/james-project"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" class="logo-gitter-sign" data-v-44ebcb1a=""><rect x="15" y="5" width="2" height="10"></rect> <rect x="10" y="5" width="2" height="20"></rect> <rect x="5" y="5" width="2" height="20"></rect> <rect width="2" height="15"></rect></svg> Gitter</a> <a class="navbar-item" href="https://twitter.com/ApacheJames"> <span class="icon"> <svg aria-hidden="true" data-icon="twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path fill="#57aaee" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path> </svg> </span> Twitter </a> <a class="navbar-item" href="#"> <svg class="octicon octicon-mark-github v-align-middle" viewBox="0 0 16 16" version="1.1" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg> Github</a> </div> </div> <!-- <div class="navbar-item"> <span class="control"> <a class="button is-primary" href="#">Download</a> </span> </div> --> </div> </div> ===================================================== == File: server/apps/distributed-app/docs/ui-overrides/img/james.svg ===================================================== <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="37px" height="31px" viewBox="0 0 37 31" enable-background="new 0 0 37 31" xml:space="preserve"> <g> <path fill="#FFFFFF" d="M37.001,4.407c-1.435-0.966-2.92-1.75-4.473-2.153c-1.552-0.412-3.151-0.315-4.63,0.3l-0.277,0.117 l-0.139,0.062l-0.064,0.032l-0.036,0.016l-0.018,0.008l-0.008,0.004c0.008-0.007-0.028,0.016,0.02-0.012L27.37,2.783 c-0.2,0.127-0.391,0.232-0.589,0.337c-0.392,0.207-0.796,0.391-1.216,0.543c-0.836,0.295-1.737,0.503-2.664,0.389 c-0.458-0.061-0.913-0.222-1.3-0.489c-0.382-0.268-0.689-0.629-0.899-1.026C20.28,1.737,20.15,0.857,20.124,0 c0.156,0.842,0.393,1.686,0.857,2.363c0.234,0.336,0.523,0.622,0.864,0.811c0.339,0.19,0.723,0.284,1.111,0.301 c0.782,0.038,1.582-0.201,2.325-0.532c0.376-0.165,0.741-0.353,1.092-0.563c0.176-0.105,0.354-0.219,0.509-0.33l0.307-0.201 c0.1-0.057,0.194-0.122,0.293-0.173c0.801-0.433,1.702-0.731,2.627-0.793c0.925-0.069,1.856,0.063,2.716,0.357 c0.863,0.29,1.655,0.731,2.359,1.267C35.888,3.047,36.52,3.676,37.001,4.407z"/> <path fill="#FFFFFF" d="M13.25,20.418c-5.733-4.373-9.554-8.973-9.418-9.078c0.147-0.145,4.153,4.212,9.83,8.536 c1.665,1.28,3.28,2.412,4.733,3.381c0.02-0.036,0.041-0.069,0.062-0.105c0.237-0.456,0.42-0.948,0.562-1.462 c-1.018-2.053-3.554-4.892-6.501-7.496c-0.656-0.572-1.338-1.078-2.028-1.536c-0.151,1.223-0.452,2.098-0.453,2.096 c0,0-0.335-1.163-0.306-2.579C9.266,11.892,8.8,11.63,8.336,11.389c-0.004,1.395-0.414,2.439-0.417,2.439 c0,0.002-0.833-1.414-0.922-3.071c-0.002-0.01-0.002-0.021-0.002-0.031c-2.767-1.279-5.1-1.896-5.104-1.89 C1.867,8.774,2.064,14.75,6.431,19.305c0.147-0.008,0.296-0.016,0.449-0.016c1.588,0.004,2.944,0.577,2.947,0.577 c0-0.002-0.835,0.501-2.054,0.671c0.444,0.355,0.899,0.682,1.364,0.973c1.148-0.416,2.102-0.557,2.102-0.557 c0-0.002-0.503,0.495-1.334,1.017c3.035,1.685,5.787,2.542,7.53,2.624c0.236-0.26,0.452-0.532,0.645-0.821 C16.586,22.84,14.938,21.717,13.25,20.418z"/> <path fill="#FFFFFF" d="M33.7,4.335c-1.103,0.092-2.21,0.292-3.3,0.605c-2.173,0.623-4.31,1.725-6.062,3.396 c-0.883,0.824-1.64,1.798-2.271,2.846c-0.614,1.059-1.109,2.191-1.43,3.363c-0.327,1.168-0.529,2.363-0.595,3.548 c-0.02,0.291-0.031,0.596-0.039,0.9L19.995,19.4l-0.008,0.35c-0.012,0.462-0.051,0.918-0.122,1.358 c-0.056,0.337-0.131,0.665-0.223,0.984c-0.141,0.514-0.324,1.006-0.562,1.466c-0.02,0.036-0.043,0.066-0.062,0.102 c-0.099,0.178-0.204,0.353-0.317,0.52c-0.191,0.286-0.407,0.559-0.643,0.819c-0.17,0.186-0.348,0.366-0.544,0.541 c-1.304,1.152-3.097,1.944-5.021,2.453c-1.931,0.518-3.995,0.788-6.091,0.934c-2.1,0.145-4.234,0.166-6.404,0.112 c2.023,0.815,4.157,1.338,6.333,1.664c2.179,0.313,4.422,0.415,6.701,0.127c1.137-0.149,2.287-0.394,3.418-0.802 c1.129-0.405,2.252-0.959,3.265-1.745c1.019-0.771,1.92-1.77,2.571-2.913c0.331-0.568,0.601-1.167,0.82-1.775 c0.21-0.611,0.364-1.236,0.47-1.859c0.11-0.619,0.17-1.24,0.193-1.852c0.008-0.154,0.008-0.307,0.008-0.461v-0.398 c0.005-0.234,0.011-0.468,0.022-0.716c0.052-0.967,0.166-1.914,0.376-2.832c0.418-1.832,1.213-3.537,2.405-5.009 c1.192-1.472,2.767-2.711,4.552-3.706c1.79-0.994,3.765-1.774,5.862-2.355C35.917,4.247,34.808,4.238,33.7,4.335z"/> </g> </svg> ===================================================== == File: server/apps/distributed-app/docs/modules/ROOT/nav.adoc ===================================================== * Apache James Distributed Reference Documentation ===================================================== == File: server/apps/distributed-app/docs/modules/ROOT/pages/index.adoc ===================================================== = Apache James Distributed server The distributed server documentation had been move to xref:3.9.0@james-project:servers:distributed/index.adoc[this location]. ===================================================== == File: server/apps/distributed-app/docs/README.md ===================================================== # Building and serving documentation locally ## Executing within source code (Clone `https://github.com/apache/james-project` locally, go into `docs` folder) **Step 1**: [Install Antora](https://docs.antora.org/antora/latest/install-and-run-quickstart/) **Step 2**: Build the Antora content locally ``` antora antora-playbook-local.yml ``` **Step 3**: Open `build/site/index.html` in your browser. ## Building with Dockerfile To build the document from apache-james repository, you can use the Dockerfile provided in this folder. Build the Docker image: ``` docker build --build-arg JAMES_CHECKOUT=master -f Dockerfile -t james-site-antora . ``` Then run the Docker image: ``` docker run -p 80:80 james-site-antora ``` Go to `http://localhost` in your browser. ===================================================== == File: server/apps/distributed-app/docs/antora-playbook-local.yml ===================================================== # # Use this configuration for local testing / docs develop. # # Note: Executing Antora can only be done from within a git repository. # When UNZIPPING the application, you will need to initialize the git repository: # # $ git init # $ git add . # $ git commit -m "First commit" # # You may want to update paths below too... site: title: Apache James Server url: https://james.apache.org/ start_page: james-project::index.adoc content: sources: # url should match the relative position for your git repository. A value for a git repo located in the docs folder would be: # - url: ./ - url: ./../ branches: HEAD # Must match the relative position of the Antora docs files within the git repository stated above. # A value for a git repo located in the docs folder would be: # start_path: ./ start_path: ./docs ui: bundle: url: https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/master/raw/build/ui-bundle.zip?job=bundle-stable supplemental_files: ./ui-overrides runtime: fetch: true ===================================================== == File: server/apps/distributed-app/docs/antora.yml ===================================================== name: james-distributed-app title: Apache James Distributed Server version: '3.9.0' prerelease: SNAPSHOT ===================================================== == File: server/apps/cli-integration-tests/src/test/resources/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/apps/cassandra-app/docker-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # Required to locate Cassandra driver configuration config.file=/root/conf/cassandra-driver.conf # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true ===================================================== == File: server/apps/cassandra-app/docker-configuration/logback-cli.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/cassandra-app/docker-compose.yml ===================================================== version: '3' services: james: depends_on: cassandra: condition: service_healthy opensearch: condition: service_started tika: condition: service_started image: apache/james:cassandra-latest container_name: james hostname: james.local networks: - james volumes: - ${KEYSTORE_PATH}:/root/conf/keystore ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8000:8000" opensearch: networks: james: aliases: - elasticsearch image: opensearchproject/opensearch:2.14.0 environment: - discovery.type=single-node - DISABLE_INSTALL_DEMO_CONFIG=true - DISABLE_SECURITY_PLUGIN=true cassandra: image: cassandra:4.1.5 ports: - "9042:9042" healthcheck: test: ["CMD", "cqlsh", "-e", "describe keyspaces"] interval: 3s timeout: 20s retries: 5 environment: ===================================================== == File: server/apps/cassandra-app/README.adoc ===================================================== = Cassandra Guice Server How-to *DEPRECATION*: See JAMES-3766. Removal of cassandra-app is planned after Apache James 3.8.0 release. Users are encouraged to migrate to the distributed server. *WARNING*: This server only targets single James node deployment on top of a shared database. It does not target deployments with multiple James nodes as is misses inter-node communication capabilities. *WARNING*: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) == Requirements * Java 21 SDK Firstly, create your own user network on Docker for the James environment: $ docker network create --driver bridge james Third party compulsory dependencies: * Cassandra 4.0 * OpenSearch 2.1.0 [source] ---- $ docker run -d --network james -p 9042:9042 --name=cassandra cassandra:4.1.5 $ docker run -d --network james -p 9200:9200 --name=opensearch --env 'discovery.type=single-node' opensearchproject/opensearch:2.14.0 ---- == Running To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. A [sample directory](https://github.com/apache/james-project/tree/master/server/apps/cassandra-app/sample-configuration) is provided with some default values you may need to replace, especially compulsory third party software endpoints. You will need to update its content to match your needs. You also need to generate a keystore with the following command: [source] ---- $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ---- Once everything is set up, you just have to run the jar with: ===================================================== == File: server/apps/cassandra-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/cassandra-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* -Dlogback.configurationFile=/root/conf/logback-cli.xml org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/cassandra-app/src/test/resources/eml/htmlMail.eml ===================================================== Delivered-To: mister@james.org Received: by 10.28.170.202 with SMTP id t193csp327634wme; Thu, 4 Jun 2015 00:36:15 -0700 (PDT) X-Received: by 10.180.77.195 with SMTP id u3mr5042880wiw.30.1433403375307; Thu, 04 Jun 2015 00:36:15 -0700 (PDT) Return-Path: <bounces+1453977-062b-mister=james.org@email.airbnb.com> Received: from o7.email.airbnb.com (o7.email.airbnb.com. [167.89.32.249]) by mx.google.com with ESMTPS id i2si5691730wjz.123.2015.06.04.00.36.13 for <mister@james.org> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Jun 2015 00:36:15 -0700 (PDT) Received-SPF: pass (google.com: domain of bounces+1453977-062b-mister=james.org@email.airbnb.com designates 167.89.32.249 as permitted sender) client-ip=167.89.32.249; Authentication-Results: mx.google.com; spf=pass (google.com: domain of bounces+1453977-062b-mister=james.org@email.airbnb.com designates 167.89.32.249 as permitted sender) smtp.mail=bounces+1453977-062b-mister=james.org@email.airbnb.com; dkim=pass header.i=@email.airbnb.com; dmarc=pass (p=REJECT dis=NONE) header.from=airbnb.com DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=email.airbnb.com; h=from:to:subject:mime-version:content-type:content-transfer-encoding; s=s20150428; bh=2mhWUwzjtQTC0KljgpaEsuvrqok=; b=EhC2QHKb5+63egDD qDCAepUELCeUZXCkw8+31kGT+O1va3iAKvQSAvzXJ3qJlIL9FgdeFk8sR78Vszn/ A73vp6NGjAW60M4gUZjxEOIPzGKIS95KfmHxg10fXUOFW0uePojNEg4ZPCcuitrZ HuWvzHK5I2siGnqupiivwxDgs5c= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.info; h=from:to:subject:mime-version:content-type:content-transfer-encoding:x-feedback-id; s=smtpapi; bh=2mhWUwzjtQTC0KljgpaEsuvrqok=; b=FPiYMmNJLCrL2e8v/0 DQC4voofe8nuuE7rhXZ25oqNAhAQja4oKIysJ1qAME2aEaqh+N5aJlCEuHrSG/7+ NAQ0OY8KaJ2zlnxAbmgJETOjnf4oGdAa+nU/nVVEPfN2NRcBCNLGQZ80U4T5k8Xi PakIuZvKDTRq7PiosSCSHT/FQ= Received: by filter0490p1mdw1.sendgrid.net with SMTP id filter0490p1mdw1.13271.556FFFE7B 2015-06-04 07:36:09.249601779 +0000 UTC Received: from i-dee0850e.inst.aws.airbnb.com (ec2-54-90-154-187.compute-1.amazonaws.com [54.90.154.187]) by ismtpd-017 (SG) with ESMTP id 14dbd7fa6b4.779a.254b43 for <mister@james.org>; Thu, 04 Jun 2015 07:36:09 +0000 (UTC) Received: by i-dee0850e.inst.aws.airbnb.com (Postfix, from userid 1041) id 19CBA24C60; Thu, 4 Jun 2015 07:36:09 +0000 (UTC) Date: Thu, 04 Jun 2015 07:36:08 +0000 From: Airbnb <discover@airbnb.com> To: mister@james.org Message-ID: <556fffe8cac78_7ed0e0fe204457be@i-dee0850e.mail> Subject: Text and Html not similar Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_556fffe8c7e84_7ed0e0fe20445637"; charset=UTF-8 Content-Transfer-Encoding: 7bit X-User-ID: 32692788 X-Locale: fr X-Category: engagement X-Template: low_intent_top_destinations recipients: ===================================================== == File: server/apps/cassandra-app/src/test/resources/ldif-files/populate.ldif ===================================================== dn: ou=people, dc=james,dc=org ou: people objectClass: organizationalUnit dn: uid=james-user, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user cn: james-user sn: james-user userPassword: secret description: James user ===================================================== == File: server/apps/cassandra-app/src/test/resources/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=200 fetch.body=100 fetch.full=50 # IMAP COPY command copy=100 # IMAP MOVE command move=100 ===================================================== == File: server/apps/cassandra-app/src/assemble/extensions-jars.txt ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add you customs Mailets/Matchers. ===================================================== == File: server/apps/cassandra-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties ===================================================== # ============================================= Deleted Messages Vault Configuration ================================== enabled=false # Enable work queue to be used with deleted message vault # Default to false # workQueueEnabled=false # Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up # Optional, default 1y # retentionPeriod=1y # Messages restored from the Deleted Messages Vault are placed in a mailbox with this name (default: ``Restored-Messages``). # The mailbox will be created if it does not exist yet. # restoreLocation=Restored-Messages ===================================================== == File: server/apps/cassandra-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # Required to locate Cassandra driver configuration config.file=conf/cassandra-driver.conf # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true ===================================================== == File: server/apps/cassandra-app/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> <logger name="com.datastax.driver.core.QueryLogger.SLOW" level="DEBUG" /> </configuration> ===================================================== == File: server/apps/cassandra-app/sample-configuration/jmap.properties ===================================================== # Configuration file for JMAP # Read https://james.apache.org/server/config-jmap.html for further details enabled=true tls.keystoreURL=file://conf/keystore tls.secret=james72laBalle # Alternatively TLS keys can be supplied via PEM files # tls.privateKey=file://conf/private.nopass.key # tls.certificates=file://conf/certs.self-signed.csr # An optional secret might be specified for the private key # tls.secret=james72laBalle # # If you wish to use OAuth authentication, you should provide a valid JWT public key. # The following entry specify the link to the URL of the public key file, # which should be a PEM format file. # # jwt.publickeypem.url=file://conf/jwt_publickey # Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against OpenSearch? # This enables a higher resilience, but the projection needs to be correctly populated. False by default. # view.email.query.enabled=true # If you want to specify authentication strategies for Jmap rfc-8621 version # For custom Authentication Strategy not inside package "org.apache.james.jmap.http", you have to specify its FQDN # authentication.strategy.rfc8621=JWTAuthenticationStrategy,BasicAuthenticationStrategy # Prevent server side request forgery by preventing calls to the private network ranges. Defaults to true, can be disabled for testing. # webpush.prevent.server.side.request.forgery=false ===================================================== == File: server/apps/cassandra-app/sample-configuration/cassandra-driver.conf ===================================================== # James reference configuration for the DataStax Java driver for Apache Cassandra®. # # Unless you use a custom mechanism to load your configuration (see # SessionBuilder.withConfigLoader), all the values declared here will be used as defaults. # # See https://docs.datastax.com/en/developer/java-driver/4.13/manual/core/configuration/ for # available options. # # Please note that contact point and authentication needs to be set in cassandra.properties for now. datastax-java-driver { basic.request { timeout = 5 seconds consistency = QUORUM page-size = 5000 serial-consistency = SERIAL } advanced.connection { connect-timeout = 5 seconds init-query-timeout = 5 seconds pool { local.size = 2 remote.size = 2 } max-requests-per-connection = 1024 max-orphan-requests = 256 warn-on-init-error = true } advanced.throttler { // class = org.apache.james.backends.cassandra.utils.LockLessConcurrencyLimitingRequestThrottler class = ConcurrencyLimitingRequestThrottler max-queue-size = 10000 max-concurrent-requests = 192 } advanced.reconnect-on-init = true ===================================================== == File: server/apps/cassandra-app/sample-configuration/batchsizes.properties ===================================================== # Those properties let you configure the number of messages queried at the same time. # IMAP FETCH command fetch.metadata=200 fetch.headers=200 fetch.body=100 fetch.full=50 # IMAP COPY command copy=100 # IMAP MOVE command move=100 ===================================================== == File: server/apps/cassandra-app/sample-configuration/activemq.properties ===================================================== # Configuration file for ActiveMQ AQMP # # Metric collection (see https://activemq.apache.org/statisticsplugin.html) # - broker statistics # - per-queue statistics (e.g. spool, outgoing) # # collect ActiveMQ metrics (i.e. broker statistics, per-queue statistics) metrics.enabled=false # add start delay for metric collector (must be greater than 1s) metrics.start_delay=10s # collect metrics (must be greater than 5s) metrics.interval=30s # timeout (must be less than metrics.interval) metrics.timeout=2s # ActiveMQ receive timeout (must be less than metrics.timeout) metrics.aqmp_timeout=1s ===================================================== == File: server/apps/cassandra-app/sample-configuration/blob.properties ===================================================== # ============================================= BlobStore Implementation ================================== # Read https://james.apache.org/server/config-blobstore.html for further details # The only available choice is cassandra # *WARNING*: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to # alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) # ========================================= ObjectStorage deduplication ======================================== # If you choose to enable deduplication, the mails with the same content will be stored only once. # Warning: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all # the mails sharing the same content once one is deleted. # Mandatory, Allowed values are: true, false deduplication.enable=false # deduplication.family needs to be incremented every time the deduplication.generation.duration is changed # Positive integer, defaults to 1 # deduplication.gc.generation.family=1 # Duration of generation. # Deduplication only takes place within a singe generation. # Only items two generation old can be garbage collected. (This prevent concurrent insertions issues and # accounts for a clock skew). # deduplication.family needs to be incremented everytime this parameter is changed. # Duration. Default unit: days. Defaults to 30 days. # deduplication.gc.generation.duration=30days # ============================================ Blobs Exporting ============================================== # Read https://james.apache.org/server/config-blob-export.html for further details # Choosing blob exporting mechanism, allowed mechanism are: localFile # Optional, default is localFile blob.export.implementation=localFile # ======================================= Local File Blobs Exporting ======================================== # Optional, directory to store exported blob, directory path follows James file system format # default is file://var/blobExporting blob.export.localFile.directory=file://var/blobExporting ===================================================== == File: server/apps/cassandra-app/sample-configuration/cassandra.properties ===================================================== # Configuration file for cassandra mailbox # Read https://james.apache.org/server/config-cassandra.html for further details # Advanced Cassandra driver option needs to be set via cassandra-driver.conf configuration file cassandra.nodes=cassandra cassandra.keyspace.create=true cassandra.keyspace=apache_james #cassandra.user=cassandra #cassandra.password=cassandra cassandra.replication.factor=1 cassandra.retryConnection.maxRetries=200 cassandra.retryConnection.minDelay=5000 ## These low level tuning options controls performance related options in Cassandra related code ## The default values are documented here. Understand the effects before editing. # mailbox.read.repair.chance=0.1 ## Maximum probability of running a read repair for the mailbox counters # mailbox.counters.read.repair.chance.max=0.1 ## Probability of running a mailbox counters read repair for 100 messages. ## Inversely proportional to the count of messages ## Formula: read_repair_chance = min(mailbox.counters.read.repair.chance.max, (100/unseens)*mailbox.counters.read.repair.chance.one.hundred) # mailbox.counters.read.repair.chance.one.hundred=0.01 # mailbox.max.retry.acl=1000 # mailbox.max.retry.modseq=100000 # mailbox.max.retry.uid=100000 # mailbox.max.retry.message.flags.update=1000 # mailbox.max.retry.message.id.flags.update=1000 # fetch.advance.row.count=1000 # chunk.size.expunge=100 # mailbox.blob.part.size=102400 # Optional. Allows specifying consistency level ONE for reads in Cassandra BlobStore. # Falls back to default read consistency level if the blob is missing. # Defaults to false. # optimistic.consistency.level.enabled=false # Optional. Allows not to use lightweight transactions in CassandraMailRepository. # If disabled we implement an idempotent behaviour (duplicates are overridden, missing entries upon deletes are ignored). # Defaults to true. # mailrepository.strong.consistency=true # Optional, default to 0. Defensive value to add to uids and modseqs generated. This can be used as an heuristic to maintain # consistency even when consensus of Lightweight Transactions is broken, exemple during a disaster recovery process. # uid.modseq.increment=0 ===================================================== == File: server/apps/jpa-app/docker-configuration/logback-cli.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/jpa-app/docker-compose.yml ===================================================== version: '3' # In order to start James JPA app on top of mariaDB: # 1. Download the driver: `wget https://repo1.maven.org/maven2/org/mariadb/jdbc/mariadb-java-client/2.7.2/mariadb-java-client-2.7.2.jar` # 2. Generate the keystore with the default password `james72laBalle`: `keytool -genkey -alias james -keyalg RSA -keystore keystore` # 3. Start MariaDB: `docker-compose up -d mariadb` # 4. Start James: `docker-compose up james` services: james: depends_on: - mariadb image: apache/james:jpa-latest container_name: james hostname: james.local volumes: - $PWD/mariadb-java-client-2.7.2.jar:/root/libs/james-jdbc-driver.jar - $PWD/sample-configuration/james-database-mariadb.properties:/root/conf/james-database.properties - $PWD/keystore:/root/conf/keystore mariadb: image: mariadb:10.6 environment: - MARIADB_ROOT_PASSWORD=test - MARIADB_DATABASE=test - MARIADB_USER=test - MARIADB_PASSWORD=test ===================================================== == File: server/apps/jpa-app/README.adoc ===================================================== = Guice-JPA Server How-to This server target single node James deployments. By default, the derby database is used. == Requirements * Java 21 SDK == Running To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called **conf**. A [sample directory](https://github.com/apache/james-project/tree/master/server/apps/jpa-app/sample-configuration) is provided with some default values you may need to replace. You will need to update its content to match your needs. You also need to generate a keystore with the following command: [source] ---- $ keytool -genkey -alias james -keyalg RSA -keystore conf/keystore ---- Once everything is set up, you just have to run the jar with: [source] ---- $ java -javaagent:james-server-jpa-app.lib/openjpa-3.1.2.jar \ -Dworking.directory=. \ -Djdk.tls.ephemeralDHKeySize=2048 \ -Dlogback.configurationFile=conf/logback.xml \ -jar james-server-jpa-app.jar ---- Note that binding ports below 1024 requires administrative rights. == Docker distribution To import the image locally: [source] ---- docker image load -i target/jib-image.tar ---- Then run it: [source] ---- docker run apache/james:jpa-latest ===================================================== == File: server/apps/jpa-app/src/main/extensions-jars/README.md ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add your custom Mailets/Matchers. ===================================================== == File: server/apps/jpa-app/src/main/scripts/james-cli ===================================================== #!/bin/bash unset JAVA_TOOL_OPTIONS java -cp /root/resources:/root/classes:/root/libs/* -Dlogback.configurationFile=/root/conf/logback-cli.xml org.apache.james.cli.ServerCmd "$@" ===================================================== == File: server/apps/jpa-app/src/assemble/extensions-jars.txt ===================================================== # Adding Jars to JAMES The jar in this folder will be added to JAMES classpath when mounted under /root/extensions-jars inside the running container. You can use it to add you customs Mailets/Matchers. ===================================================== == File: server/apps/jpa-app/sample-configuration/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions #guice.extension.module= ===================================================== == File: server/apps/jpa-app/sample-configuration/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/apps/jpa-app/sample-configuration/jvm.properties ===================================================== # ============================================= Extra JVM System Properties =========================================== # To avoid clutter on the command line, any properties in this file will be added as system properties on server start. # Example: If you need an option -Dmy.property=whatever, you can instead add it here as # my.property=whatever # The delimiter used to separate parent/child folders. # Optional. Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). # WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments # will likely lead to failure of some system components, as occurrences of old delimiter will still be present in the database/data store. # james.mailbox.folder.delimiter=dot # (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. # This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. # Below, data is stored in memory. Above data is stored on disk. # Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware # should however support a high throughput. Higher values will lead to faster single mail processing at the cost # of higher heap usage. #james.message.memory.threshold=12K # Optional. Boolean. Defaults to false. Recommended value is false. # Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold # be copied to temporary files? #james.message.usememorycopy=false # Mode level of resource leak detection. It is used to detect a resource not be disposed of before it's garbage-collected. # Example `MimeMessageInputStreamSource` # Optional. Allowed values are: none, simple, advanced, testing # - none: Disables resource leak detection. # - simple: Enables output a simplistic error log if a leak is encountered and would free the resources (default). # - advanced: Enables output an advanced error log implying the place of allocation of the underlying object and would free resources. # - testing: Enables output an advanced error log implying the place of allocation of the underlying object and rethrow an error, that action is being taken by the development team. #james.lifecycle.leak.detection.mode=simple # Should we add the host in the MDC logging context for incoming IMAP, SMTP, POP3? Doing so, a DNS resolution # is attempted for each incoming connection, which can be costly. Remote IP is always added to the logging context. # Optional. Boolean. Defaults to true. #james.protocols.mdc.hostname=true # Manage netty leak detection level see https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels # io.netty.leakDetection.level=SIMPLE # Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup. # james.exit.on.startup.error=true # Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false. # james.fail.on.missing.configuration=true # JMX, when enable causes RMI to plan System.gc every hour. Set this instead to once every 1000h. sun.rmi.dgc.server.gcInterval=3600000000 ===================================================== == File: server/apps/jpa-app/sample-configuration/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/logs/james.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>/logs/james.%i.log.tar.gz</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>100MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="LOG_FILE" /> </root> <logger name="org.apache.james" level="INFO" /> </configuration> ===================================================== == File: server/apps/jpa-app/sample-configuration/droplists.properties ===================================================== # Configuration file for DropLists enabled=false ===================================================== == File: server/blob/blob-cassandra/src/test/resources/cassandra-driver.conf ===================================================== datastax-java-driver { basic.request { timeout = 5 seconds } } ===================================================== == File: server/blob/blob-s3/src/test/resources/minio/public.crt ===================================================== -----BEGIN CERTIFICATE----- MIICFjCCAbugAwIBAgIRAK8/sg1OIuWOQV2gWo9vDQUwCgYIKoZIzj0EAwIwTTEc MBoGA1UEChMTQ2VydGdlbiBEZXZlbG9wbWVudDEtMCsGA1UECwwkdHVuZ3R2QE1h Y0Jvb2stUHJvLmxvY2FsIChUcmFuIFR1bmcpMB4XDTI0MDkyNjAyNDcwNFoXDTI1 MDkyNjAyNDcwNFowTTEcMBoGA1UEChMTQ2VydGdlbiBEZXZlbG9wbWVudDEtMCsG A1UECwwkdHVuZ3R2QE1hY0Jvb2stUHJvLmxvY2FsIChUcmFuIFR1bmcpMFkwEwYH KoZIzj0CAQYIKoZIzj0DAQcDQgAEO4weJpvkYnqq95UH3XNcaD7IAJbTTwr1GA2c rufdNwpC4g7oQVOlFr0D+RdfVxbfeUZGmAz73OpGtOPOTVhTG6N8MHowDgYDVR0P AQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8w HQYDVR0OBBYEFKIu0NT9bG853GA+o10GsbDOi9zMMCMGA1UdEQQcMBqCCWxvY2Fs aG9zdIINczNtaW5pby5sb2NhbDAKBggqhkjOPQQDAgNJADBGAiEAxLfNK4gPWw0G 8QAv0QzARY0L5+8Lmpf5SwVzrjZ+zosCIQCA41tgccZ20+W1igansLkqnSTcY8Nw mtKwMTxUEwNRTw== -----END CERTIFICATE----- ===================================================== == File: server/blob/blob-s3/src/test/resources/minio/private.key ===================================================== -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgDhp6TEYrEFHMHusJ Xstem4lh0czPokiWEdAzzMXRXxGhRANCAAQ7jB4mm+Rieqr3lQfdc1xoPsgAltNP CvUYDZyu5903CkLiDuhBU6UWvQP5F19XFt95RkaYDPvc6ka0485NWFMb -----END PRIVATE KEY----- ===================================================== == File: server/task/task-postgres/pom.xml ===================================================== <?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.james</groupId> <artifactId>james-server</artifactId> <version>3.9.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <artifactId>james-server-task-postgres</artifactId> <name>Apache James :: Server :: Task :: PostgreSQL</name> <description>Distributed task manager leveraging PostgreSQL</description> <dependencies> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-backends-postgres</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-backends-postgres</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-json</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-json</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-guice-common</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-lifecycle-api</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-task-api</artifactId> <type>test-jar</type> <scope>test</scope> ===================================================== == File: server/protocols/protocols-pop3-distributed/src/test/resources/pop3server.xml ===================================================== <?xml version="1.0"?> <pop3server enabled="true"> <jmxName>pop3server</jmxName> <bind>127.0.0.1:0</bind> <helloName>myMailServer</helloName> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <connectiontimeout>3600</connectiontimeout> <handlerchain> <handler class="org.apache.james.pop3server.core.CoreCmdHandlerLoader"/> </handlerchain> <gracefulShutdown>false</gracefulShutdown> </pop3server> ===================================================== == File: server/protocols/webadmin/webadmin-mailrepository/src/test/resources/mail.eml ===================================================== Return-Path: <general@list.org> MIME-Version: 1.0 From: Hello <hello@gmail.com> Date: Thu, 4 Jun 2015 06:08:41 +0200 Message-ID: <CAN1zdnW5PW7z5msM-TjUpouygxWY6z-25A3WCB-C5BvqDuP1Qw@mail.gmail.com> To: General Discussion <general@list.org> Content-Type: text/plain; charset=UTF-8 Subject: [arch-general] Very important topic Reply-To: General Discussion <general@list.org> Sender: "arch-general" <general@list.org> Hi all, Very important message!!! Thanks! ===================================================== == File: server/protocols/webadmin/webadmin-data/src/test/resources/sieve/my_sieve ===================================================== require ["reject"]; if size :over 100K { reject "Email too big"; } ===================================================== == File: server/protocols/webadmin/webadmin-pop3/README.md ===================================================== # Pop3 fix inconsistencies We introduced an additional webadmin endpoint allowing fixing possible inconsistencies. In order to run this task: ```bash curl -XPOST 'http://ip:port/mailboxes?task=fixPop3Inconsistencies' ``` Will schedule a task for deleting stale and inserting missing POP3 meta data entries. [More details about endpoints returning a task](https://james.staged.apache.org/james-project/3.6.0/servers/distributed/operate/webadmin.html#_endpoints_returning_a_task). The scheduled task will have the following type `Pop3MetaDataFixInconsistenciesTask` and the following additionalInformation: ```json { "type": "Pop3MetaDataFixInconsistenciesTask", "runningOptions": { "messagesPerSecond": 100 }, "processedImapUidEntries": 0, "processedPop3MetaDataStoreEntries": 1, "stalePOP3Entries": 1, "missingPOP3Entries": 0, "fixedInconsistencies": [ { "mailboxId": "6fdae960-c72f-11eb-9b1d-973b9140e460", "messageId": "6ffca230-c72f-11eb-9b1d-973b9140e460" } ], "errors": [ { "mailboxId": "7fdae960-c72f-11eb-9b1d-973b9140e460", "messageId": "7fdae960-c72f-11eb-2222-973b9140e460" } ] } ``` ===================================================== == File: server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message.eml ===================================================== Return-Path: <mlemos@acm.org> To: Manuel Lemos <mlemos@linux.local> Subject: Testing Testing From: mlemos <mlemos@acm.org> Reply-To: mlemos <mlemos@acm.org> Sender: mlemos@acm.org X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" Message-ID: <20050430192829.0489.mlemos@acm.org> Date: Sat, 30 Apr 2005 19:28:29 -0300 --652b8c4dcb00cdcdda1e16af36781caf Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" --6a82fb459dcaacd40ab3404529e808dc Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable This is an HTML message. Please use an HTML capable mail program to read this message. --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <html> <head> <title>Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= TML message</title> <style type=3D"text/css"><!-- body { color: black ; font-family: arial, helvetica, sans-serif ; backgroun= d-color: #A3C5CC } A:link, A:visited, A:active { text-decoration: underline } --></style> </head> <body> <table background=3D"cid:4c837ed463ad29c820668e835a270e8a.gif" width=3D"100= %"> <tr> <td> <center><h1>Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= ss: HTML message</h1></center> <hr> ===================================================== == File: server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message-without-from.eml ===================================================== Return-Path: <mlemos@acm.org> To: Manuel Lemos <mlemos@linux.local> Subject: Testing Error Reply-To: mlemos <mlemos@acm.org> Sender: mlemos@acm.org X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" Message-ID: <20050430192829.0489.mlemos@acm.org> Date: Sat, 30 Apr 2005 19:28:29 -0300 --652b8c4dcb00cdcdda1e16af36781caf Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" --6a82fb459dcaacd40ab3404529e808dc Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable This is an HTML message. Please use an HTML capable mail program to read this message. --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <html> <head> <title>Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= TML message</title> <style type=3D"text/css"><!-- body { color: black ; font-family: arial, helvetica, sans-serif ; backgroun= d-color: #A3C5CC } A:link, A:visited, A:active { text-decoration: underline } --></style> </head> <body> <table background=3D"cid:4c837ed463ad29c820668e835a270e8a.gif" width=3D"100= %"> <tr> <td> <center><h1>Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= ss: HTML message</h1></center> <hr> <P>Hello Manuel,<br><br> ===================================================== == File: server/protocols/webadmin/webadmin-mail-over-web/src/test/resources/message/rfc822/message-without-tos.eml ===================================================== Return-Path: <mlemos@acm.org> Subject: Testing Error From: mlemos <mlemos@acm.org> Reply-To: mlemos <mlemos@acm.org> Sender: mlemos@acm.org X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" Message-ID: <20050430192829.0489.mlemos@acm.org> Date: Sat, 30 Apr 2005 19:28:29 -0300 --652b8c4dcb00cdcdda1e16af36781caf Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" --6a82fb459dcaacd40ab3404529e808dc Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable This is an HTML message. Please use an HTML capable mail program to read this message. --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <html> <head> <title>Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= TML message</title> <style type=3D"text/css"><!-- body { color: black ; font-family: arial, helvetica, sans-serif ; backgroun= d-color: #A3C5CC } A:link, A:visited, A:active { text-decoration: underline } --></style> </head> <body> <table background=3D"cid:4c837ed463ad29c820668e835a270e8a.gif" width=3D"100= %"> <tr> <td> <center><h1>Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= ss: HTML message</h1></center> <hr> <P>Hello Manuel,<br><br> ===================================================== == File: server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessageListMethod.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/BlobManagerImpl.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/BlobManagerImplTest.java ===================================================== ===================================================== == File: server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MIMEMessageConverterTest.java ===================================================== ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/rfc/src/jmap.mdown ===================================================== %%% title = "The JSON Meta Application Protocol" abbrev = "JMAP" category = "std" docName = "draft-ietf-jmap-core-17" ipr= "trust200902" area = "Applications" workgroup = "JMAP" keyword = ["JMAP", "JSON"] date = 2019-03-18T00:00:00Z [[author]] initials="N.M." surname="Jenkins" fullname="Neil Jenkins" role="editor" organization = "Fastmail" [author.address] email = "neilj@fastmailteam.com" uri = "https://www.fastmail.com" [author.address.postal] street = "PO Box 234, Collins St West" city = "Melbourne" code = "VIC 8007" country = "Australia" [[author]] initials="C." surname="Newman" fullname="Chris Newman" role="editor" organization = "Oracle" [author.address] email = "chris.newman@oracle.com" [author.address.postal] street = "440 E. Huntington Dr., Suite 400" city = "Arcadia" code = "CA 91006" country = "United States of America" %%% .# Abstract This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of-band binary data upload/download. {mainmatter} {{spec/jmap/intro.mdown}} {{spec/jmap/session.mdown}} ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/rfc/src/quotas.mdown ===================================================== %%% title = "JMAP for Quotas" abbrev = "JMAP Quotas" category = "std" docName = "draft-ietf-jmap-quotas-06" ipr= "trust200902" area = "Applications" workgroup = "JMAP" keyword = ["JMAP", "JSON", "email", "quotas"] date = 2022-09-28T00:00:00Z [seriesInfo] name="Internet-Draft" value="draft-ietf-jmap-quotas-06" stream="IETF" status="standard" [[author]] initials="R.C." surname="Cordier" fullname="René Cordier" role="editor" organization = "Linagora Vietnam" [author.address] email = "rcordier@linagora.com" uri = "https://linagora.vn" [author.address.postal] street = "5 Dien Bien Phu" city = "Hanoi" code = "10000" country = "Vietnam" %%% .# Abstract This document specifies a data model for handling quotas on accounts with a server using JMAP. {mainmatter} {{spec/quotas/intro.mdown}} {{spec/quotas/quota.mdown}} {{spec/quotas/securityconsiderations.mdown}} {{spec/quotas/ianaconsiderations.mdown}} {backmatter} ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/rfc/src/mail.mdown ===================================================== %%% title = "JMAP (JSON Meta Application Protocol) for Mail" abbrev = "JMAP Mail" category = "std" docName = "draft-ietf-jmap-mail-16" updates = [5788] ipr= "trust200902" area = "Applications" workgroup = "JMAP" keyword = ["JMAP", "JSON", "email"] date = 2019-03-08T00:00:00Z [[author]] initials="N.M." surname="Jenkins" fullname="Neil Jenkins" role="editor" organization = "Fastmail" [author.address] email = "neilj@fastmailteam.com" uri = "https://www.fastmail.com" [author.address.postal] street = "PO Box 234, Collins St West" city = "Melbourne" code = "VIC 8007" country = "Australia" [[author]] initials="C." surname="Newman" fullname="Chris Newman" role="editor" organization = "Oracle" [author.address] email = "chris.newman@oracle.com" [author.address.postal] street = "440 E. Huntington Dr., Suite 400" city = "Arcadia" code = "CA 91006" country = "United States of America" %%% .# Abstract This document specifies a data model for synchronising email data with a server using JMAP (the JSON Meta Application Protocol). Clients can use this to efficiently search, access, organise and send messages, and get pushed notifications for fast resynchronisation when new messages are delivered or a change is made in another client. {mainmatter} {{spec/mail/intro.mdown}} ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/README.md ===================================================== # JSON Meta Application Protocol (JMAP) Specification This repo contains the specifications for JMAP. JMAP is a modern standard for email clients to connect to mail stores. It therefore primarily replaces IMAP + SMTP submission. It does not replace MTA-to-MTA SMTP transmission. JMAP was built by the community, and continues to improve via the [IETF standardization process](https://datatracker.ietf.org/wg/jmap/about/). Upcoming work includes adding contacts and calendars (replacing CardDAV/CalDAV). The pretty HTML version of the spec along with more JMAP info and resources can be found at http://jmap.io. ## Get involved JMAP is being developed within the IETF by the [JMAP Working Group](https://datatracker.ietf.org/wg/jmap/about/). You can join the mailing list at https://www.ietf.org/mailman/listinfo/jmap. Feedback is welcome: send your thoughts or comments on anything that is imprecise, incomplete, or could simply be done better in another way. Discussion is preferred prior to pull requests, except in the case of minor typos etc. ## Contributions This repository relates to activities in the Internet Engineering Task Force (IETF). All material in this repository is considered Contributions to the IETF Standards Process, as defined in the intellectual property policies of IETF currently designated as [BCP 78](https://www.rfc-editor.org/info/bcp78), [BCP 79](https://www.rfc-editor.org/info/bcp79) and the [IETF Trust Legal Provisions (TLP) Relating to IETF Documents](http://trustee.ietf.org/trust-legal-provisions.html). Any edit, commit, pull request, issue, comment or other change made to this repository constitutes Contributions to the [IETF Standards Process](https://www.ietf.org/). You agree to comply with all applicable IETF policies and procedures, including, BCP 78, 79, the TLP, and the TLP rules regarding code components (e.g. being subject to a Simplified BSD License) in Contributions. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/message.mdown ===================================================== # Emails >:warning: >Partially implemented An **Email** object is a representation of a message [@!RFC5322], which allows clients to avoid the complexities of MIME parsing, transfer encoding, and character encoding. ## Properties of the Email Object Broadly, a message consists of two parts: a list of header fields and then a body. The Email data type provides a way to access the full structure or to use simplified properties and avoid some complexity if this is sufficient for the client application. While raw headers can be fetched and set, the vast majority of clients should use an appropriate parsed form for each of the header fields it wants to process, as this allows it to avoid the complexities of various encodings that are required in a valid message per RFC 5322. The body of a message is normally a MIME-encoded set of documents in a tree structure. This may be arbitrarily nested, but the majority of email clients present a flat model of a message body (normally plaintext or HTML) with a set of attachments. Flattening the MIME structure to form this model can be difficult and causes inconsistency between clients. Therefore, in addition to the *bodyStructure* property, which gives the full tree, the Email object contains 3 alternate properties with flat lists of body parts: - *textBody*/*htmlBody*: These provide a list of parts that should be rendered sequentially as the "body" of the message. This is a list rather than a single part as messages may have headers and/or footers appended/prepended as separate parts when they are transmitted, and some clients send text and images intended to be displayed inline in the body (or even videos and sound clips) as multiple parts rather than a single HTML part with referenced images. Because MIME allows for multiple representations of the same data (using `multipart/alternative`), there is a textBody property (which prefers a plaintext representation) and an htmlBody property (which prefers an HTML representation) to accommodate the two most common client requirements. The same part may appear in both lists where there is no alternative between the two. - *attachments*: This provides a list of parts that should be presented as "attachments" to the message. Some images may be solely there for embedding within an HTML body part; clients may wish to not present these as attachments in the user interface if they are displaying the HTML with the embedded images directly. Some parts may also be in htmlBody/textBody; again, clients may wish to not present these as attachments in the user interface if rendered as part of the body. The *bodyValues* property allows for clients to fetch the value of text parts directly without having to do a second request for the blob and to have the server handle decoding the charset into unicode. This data is in a separate property rather than on the EmailBodyPart object to avoid duplication of large amounts of data, as the same part may be included twice if the client fetches more than one of bodyStructure, textBody, and htmlBody. In the following subsections, the common notational convention for wildcards has been adopted for content types, so `foo/*` means any content type that starts with `foo/`. Due to the number of properties involved, the set of *Email* properties is specified over the following four subsections. This is purely for readability; all properties are top-level peers. ### Metadata These properties represent metadata about the message in the mail store and are not derived from parsing the message itself. - **id**: `Id` (immutable; server-set) The id of the Email object. Note that this is the JMAP object id, NOT the Message-ID header field value of the message [@!RFC5322]. - **blobId**: `Id` (immutable; server-set) The id representing the raw octets of the message [@!RFC5322] for this Email. This may be used to download the raw original message or to attach it directly to another Email, etc. - **threadId**: `Id` (immutable; server-set) The id of the Thread to which this Email belongs. >:warning: >threadId support is not implemented yet. Default to the id of the email. - **mailboxIds**: `Id[Boolean]` The set of Mailbox ids this Email belongs to. An Email in the mail store MUST belong to one or more Mailboxes at all times (until it is destroyed). The set is represented as an object, with each key being a *Mailbox id*. The value for each key in the object MUST be `true`. - **keywords**: `String[Boolean]` (default: \{\}) A set of keywords that apply to the Email. The set is represented as an object, with the keys being the *keywords*. The value for each key in the object MUST be `true`. Keywords are shared with IMAP. The six system keywords from IMAP get special treatment. The following four keywords have their first character changed from `\` in IMAP to `$` in JMAP and have particular semantic meaning: ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/mailbox.mdown ===================================================== # Mailboxes A Mailbox represents a named set of Emails. This is the primary mechanism for organising Emails within an account. It is analogous to a folder or a label in other systems. A Mailbox may perform a certain role in the system; see below for more details. For compatibility with IMAP, an Email MUST belong to one or more Mailboxes. The Email id does not change if the Email changes Mailboxes. A **Mailbox** object has the following properties: > :information_source: > Implemented - **id**: `Id` (immutable; server-set) The id of the Mailbox. - **name**: `String` > :warning: > "name" should not contain the IMAP hierarchy delimiter ".". User-visible name for the Mailbox, e.g., "Inbox". This MUST be a Net-Unicode string [@!RFC5198] of at least 1 character in length, subject to the maximum size given in the capability object. There MUST NOT be two sibling Mailboxes with both the same parent and the same name. Servers MAY reject names that violate server policy (e.g., names containing a slash (/) or control characters). - **parentId**: `Id|null` (default: null) The Mailbox id for the parent of this Mailbox, or `null` if this Mailbox is at the top level. Mailboxes form acyclic graphs (forests) directed by the child-to-parent relationship. There MUST NOT be a loop. - **role**: `String|null` (default: null) > :warning: > Partially implemented. Role are based on the name of the mailbox. An evolution would be to use a mailbox annotation to hold its > value, removing the link with the name, and allow the user to define locale based system mailboxes. This value cannot be updated. Identifies Mailboxes that have a particular common purpose (e.g., the "inbox"), regardless of the *name* property (which may be localised). This value is shared with IMAP (exposed in IMAP via the SPECIAL-USE extension [@!RFC6154]). However, unlike in IMAP, a Mailbox MUST only have a single role, and there MUST NOT be two Mailboxes in the same account with the same role. Servers providing IMAP access to the same data are encouraged to enforce these extra restrictions in IMAP as well. Otherwise, modifying the IMAP attributes to ensure compliance when exposing the data over JMAP is implementation dependent. The value MUST be one of the Mailbox attribute names listed in the [IANA IMAP Mailbox Name Attributes](https://www.iana.org/assignments/imap-mailbox-name-attributes/imap-mailbox-name-attributes.xhtml) registry, as established in [@!RFC8457], converted to lowercase. New roles may be established here in the future. An account is not required to have Mailboxes with any particular roles. - **sortOrder**: `UnsignedInt` (default: 0) > :warning: > Partially implemented. Based on the role. This value cannot be updated. Defines the sort order of Mailboxes when presented in the client's UI, so it is consistent between devices. The number MUST be an integer in the range 0 <= sortOrder < 2^31. A Mailbox with a lower order should be displayed before a Mailbox with a higher order (that has the same parent) in any Mailbox listing in the client's UI. Mailboxes with equal order SHOULD be sorted in alphabetical order by name. The sorting should take into account locale-specific character order convention. - **totalEmails**: `UnsignedInt` (server-set) The number of Emails in this Mailbox. - **unreadEmails**: `UnsignedInt` (server-set) ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/identity.mdown ===================================================== # Identities > :warning: > Partially implemented. An **Identity** object stores information about an email address or domain the user may send from. It has the following properties: - **id**: `Id` (immutable; server-set) The id of the Identity. - **name**: `String` (default: "") The "From" *name* the client SHOULD use when creating a new Email from this Identity. - **email**: `String` (immutable) The "From" email address the client MUST use when creating a new Email from this Identity. If the *mailbox* part of the address (the section before the "@") is the single character `*` (e.g., `*@example.com`) then the client may use any valid address ending in that domain (e.g., `foo@example.com`). - **replyTo**: `EmailAddress[]|null` (default: null) The Reply-To value the client SHOULD set when creating a new Email from this Identity. - **bcc**: `EmailAddress[]|null` (default: null) The Bcc value the client SHOULD set when creating a new Email from this Identity. - **textSignature**: `String` (default: "") A signature the client SHOULD insert into new plaintext messages that will be sent from this Identity. Clients MAY ignore this and/or combine this with a client-specific signature preference. - **htmlSignature**: `String` (default: "") A signature the client SHOULD insert into new HTML messages that will be sent from this Identity. This text MUST be an HTML snippet to be inserted into the `<body></body>` section of the HTML. Clients MAY ignore this and/or combine this with a client-specific signature preference. - **mayDelete**: `Boolean` (server-set) Is the user allowed to delete this Identity? Servers may wish to set this to `false` for the user's username or other default address. Attempts to destroy an Identity with `mayDelete: false` will be rejected with a standard `forbidden` SetError. See the "Addresses" header form description in the Email object for the definition of *EmailAddress*. Multiple identities with the same email address MAY exist, to allow for different settings the user wants to pick between (for example, with different names/signatures). The following JMAP methods are supported. ## Identity/get This is a standard "/get" method as described in [@!RFC8620], Section 5.1. The *ids* argument may be `null` to fetch all at once. ## Identity/changes > :warning: > Not implemented. This is a standard "/changes" method as described in [@!RFC8620], Section 5.2. ## Identity/set This is a standard "/set" method as described in [@!RFC8620], Section 5.3. The following extra *SetError* types are defined: For **create**: - `forbiddenFrom`: The user is not allowed to send from the address given as the *email* property of the Identity. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/identitySortOrder.mdown ===================================================== # Identity sort order > :information_source: > Implemented ### urn:apache:james:params:jmap:mail:identity:sortorder This represents support for the extra `sortOrder` property on the `Identity` object. Servers supporting this specification MUST add this property to the capabilities object. This extension is specific to the Apache James server and is a temporary solution while waiting for the main work on Identity sort order as part of the IETF group to be finalized as a proper RFC document. ### Additions to the Identity object This specification adds the following property on `Identity` object: - **sortOrder**: `UnsignedInt` (default: 0) Defines the sort order of Identities when presented in the client’s UI, so it is consistent between devices. The number MUST be an integer in the range 0 <= sortOrder < 2^31. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/messagesubmission.mdown ===================================================== # Email Submission > :warning: > Partially implemented An **EmailSubmission** object represents the submission of an Email for delivery to one or more recipients. It has the following properties: - **id**: `Id` (immutable; server-set) The id of the EmailSubmission. - **identityId**: `Id` (immutable) The id of the Identity to associate with this submission. > :warning: > Not implemented. Submissions cannot be created with identityId. This field should be omitted. - **emailId**: `Id` (immutable) The id of the Email to send. The Email being sent does not have to be a draft, for example, when "redirecting" an existing Email to a different address. - **threadId**: `Id` (immutable; server-set) The Thread id of the Email to send. This is set by the server to the *threadId* property of the Email referenced by the *emailId*. - **envelope**: `Envelope|null` (immutable) Information for use when sending via SMTP. An **Envelope** object has the following properties: - **mailFrom**: `Address` The email address to use as the return address in the SMTP submission, plus any parameters to pass with the MAIL FROM address. The JMAP server MAY allow the address to be the empty string. When a JMAP server performs an SMTP message submission, it MAY use the same id string for the ENVID parameter [@!RFC3461] and the EmailSubmission object id. Servers that do this MAY replace a client-provided value for ENVID with a server-provided value. - **rcptTo**: `Address[]` The email addresses to send the message to, and any RCPT TO parameters to pass with the recipient. An **Address** object has the following properties: - **email**: `String` The email address being represented by the object. This is a "Mailbox" as used in the Reverse-path or Forward-path of the MAIL FROM or RCPT TO command in [@!RFC5321]. - **parameters**: `Object|null` Any parameters to send with the email address (either mail-parameter or rcpt-parameter as appropriate, as specified in [@!RFC5321]). If supplied, each key in the object is a parameter name, and the value is either the parameter value (type `String`) or `null` if the parameter does not take a value. For both name and value, any xtext or unitext encodings are removed (see [@!RFC3461] and [@!RFC6533]) and JSON string encoding is applied. > :warning: > Not implemented. Submissions cannot be created with parameters. This field should be omitted. If the *envelope* property is `null` or omitted on creation, the server MUST generate this from the referenced Email as follows: - **mailFrom**: The email address in the *Sender* header field, if present; otherwise, it's the email address in the *From* header field, if present. In either case, no parameters are added. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/rights.mdown ===================================================== # urn:apache:james:params:jmap:mail:shares extension <aside class="notice"> Implemented </aside> This extension is specific to the Apache James server as it relies on a common shared storage allowing arbitrary cross-account entity access. This extension to the JMAP specification enables to: - Grant access on mailboxes, and the email they contain to other users. - Enable display of shared mailboxes, and shared messages as part of the main user account, making effectively account sharing transparent from a client perspective. ## Defined capability The new capability `urn:apache:james:params:jmap:mail:shares` is defined. This extension defines both behavioral changes and additional fields for the Mailbox object. If specified, behavioral changes and additional fields defined hereafter MUST apply. If unspecified no additional fields to the Mailbox object are returned, and the behaviour needs to be exactly the one of `urn:ietf:params:jmap:mail`. ## Addition to the capability object Servers supporting *subaddressing* need to advertise it through the session capabilities by adding the following field to the `urn:apache:james:params:jmap:mail:shares` capability object: - `subaddressingSupported`: *true* If this field is not present, then it should be assumed that subaddressing is NOT supported. ## Addition to existing data types The following data types are defined: `Username` of type `String` corresponds to a username. `Right` of type `String` defines an action that can be carried out on a mailbox or its content. The following `Right`s are defined: - `"a"` Administer: the user can view and modify the rights of this mailbox - `"i"` Insert: the user can use the id of this mailbox in `mailboxId` fields of Emails. - `"l"` Lookup: the user can see the name of this mailbox but information about the content of this mailbox MUST not be disclosed. - `"r"` Read: the user can read the content of this mailbox, and see the assiociated Email and Thread counts. - `"t"` DeleteMessages: the user can delete Email in this Mailbox - `"w"` Write: the user can alter the Keywords of messages contained in this Mailbox, except the `$Seen` keyword - `"s"` Seen: the user can alter the `$Seen` keyword of messages contained in this Mailbox - `"e"` Expunge: the user can mark Email as Expunged in this Mailbox. This action is not achievable using JMAP. - `"p"` Post: the user can send an Email to this Mailbox. This is used with the identifier `anyone` in the context of subaddressing. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/securityconsiderations.mdown ===================================================== # Security Considerations All security considerations of JMAP ([@!RFC8620]) apply to this specification. Additional considerations specific to the data types and functionality introduced by this document are described in the following subsections. ## EmailBodyPart Value Service providers typically perform security filtering on incoming messages, and it's important that the detection of content-type and charset for the security filter aligns with the heuristics performed by JMAP servers. Servers that apply heuristics to determine the content-type or charset for an *EmailBodyValue* SHOULD document the heuristics and provide a mechanism to turn them off in the event they are misaligned with the security filter used at a particular mail host. Automatic conversion of charsets that allow hidden channels for ASCII text, such as UTF-7, have been problematic for security filters in the past, so server implementations can mitigate this risk by having such conversions off-by-default and/or separately configurable. To allow the client to restrict the volume of data it can receive in response to a request, a maximum length may be requested for the data returned for a textual body part. However, truncating the data may change the semantic meaning, for example, truncating a URL changes its location. Servers that scan for links to malicious sites should take care to either ensure truncation is not at a semantically significant point or rescan the truncated value for malicious content before returning it. ## HTML Email Display HTML message bodies provide richer formatting for messages but present a number of security challenges, especially when embedded in a webmail context in combination with interface HTML. Clients that render HTML messages should carefully consider the potential risks, including: * Embedded JavaScript can rewrite the message to change its content on subsequent opening, allowing users to be mislead. In webmail systems, if run in the same origin as the interface, it can access and exfiltrate all private data accessible to the user, including all other messages and potentially contacts, calendar events, settings, and credentials. It can also rewrite the interface to undetectably phish passwords. A compromise is likely to be persistent, not just for the duration of page load, due to exfiltration of session credentials or installation of a service worker that can intercept all subsequent network requests (however, this would only be possible if blob downloads are also available on the same origin, and the service worker script is attached to the message). * HTML documents may load content directly from the Internet, rather than just referencing attached resources. For example, you may have an `<img>` tag with an external `src` attribute. This may leak to the sender when a message is opened, as well as the IP address of the recipient. Cookies may also be sent and set by the server, allowing tracking between different messages and even website visits and advertising profiles. * In webmail systems, CSS can break the layout or create phishing vulnerabilities. For example, the use of `position:fixed` can allow a message to draw content outside of its normal bounds, potentially clickjacking a real interface element. * If in a webmail context and not inside a separate frame, any styles defined in CSS rules will apply to interface elements as well if the selector matches, allowing the interface to be modified. Similarly, any interface styles that match elements in the message will alter their appearance, potentially breaking the layout of the message. * The link text in HTML has no necessary correlation with the actual target of the link, which can be used to make phishing attacks more convincing. * Links opened from a message or embedded external content may leak private info in the `Referer` header sent by default in most systems. * Forms can be used to mimic login boxes, providing a potent phishing vector if allowed to submit directly from the message display. There are a number of ways clients can mitigate these issues, and a defence-in-depth approach that uses a combination of techniques will provide the strongest security. * HTML can be filtered before rendering, stripping potentially malicious content. Sanitising HTML correctly is tricky, and implementors are strongly recommended to use a well-tested library with a carefully vetted whitelist-only approach. New features with unexpected security characteristics may be added to HTML rendering engines in the future; a blacklist approach is likely to result in security issues. Subtle differences in parsing of HTML can introduce security flaws: to filter with 100% accuracy, you need to use the same parser that the HTML rendering engine will use. * Encapsulating the message in an `<iframe sandbox>`, as defined in [HTML](https://www.w3.org/TR/html52/), Section 4.7.6, can help mitigate a number of risks. This will: * Disable JavaScript. * Disable form submission. * Prevent drawing outside of its bounds or conflicts between message CSS and interface CSS. * Establish a unique anonymous origin, separate to the containing origin. * A strong [Content Security Policy](https://www.w3.org/TR/CSP3/) can, among other things, block JavaScript and loading of external content should it manage to evade the filter. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/thread.mdown ===================================================== # Threads > :warning: > Partially implemented. Replies are grouped together with the original message to form a Thread. In JMAP, a Thread is simply a flat list of Emails, ordered by date. Every Email MUST belong to a Thread, even if it is the only Email in the Thread. The exact algorithm for determining whether two Emails belong to the same Thread is not mandated in this spec to allow for compatibility with different existing systems. For new implementations, it is suggested that two messages belong in the same Thread if both of the following conditions apply: 1. An identical message id [@!RFC5322] appears in both messages in any of the Message-Id, In-Reply-To, and References header fields. 2. After stripping automatically added prefixes such as "Fwd:", "Re:", "[List-Tag]", etc., and ignoring white space, the subjects are the same. This avoids the situation where a person replies to an old message as a convenient way of finding the right recipient to send to but changes the subject and starts a new conversation. If messages are delivered out of order for some reason, a user may have two Emails in the same Thread but without headers that associate them with each other. The arrival of a third Email may provide the missing references to join them all together into a single Thread. Since the *threadId* of an Email is immutable, if the server wishes to merge the Threads, it MUST handle this by deleting and reinserting (with a new Email id) the Emails that change *threadId*. A **Thread** object has the following properties: - **id**: `Id` (immutable; server-set) The id of the Thread. - **emailIds**: `Id[]` (server-set) The ids of the Emails in the Thread, sorted by the *receivedAt* date of the Email, oldest first. If two Emails have an identical date, the sort is server dependent but MUST be stable (sorting by id is recommended). The following JMAP methods are supported. ## Thread/get > :information_source: > Implemented This is a standard "/get" method as described in [@!RFC8620], Section 5.1. ### Example Request: [[ "Thread/get", { "accountId": "acme", "ids": ["f123u4", "f41u44"] }, "#1" ]] with response: [[ "Thread/get", { "accountId": "acme", "state": "f6a7e214", "list": [ { "id": "f123u4", "emailIds": [ "eaa623", "f782cbb"] ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/ianaconsiderations.mdown ===================================================== # IANA Considerations ## JMAP Capability Registration for "mail" IANA has registered the "mail" JMAP Capability as follows: Capability Name: `urn:ietf:params:jmap:mail` Specification document: this document Intended use: common Change Controller: IETF Security and privacy considerations: this document, Section 9 ## JMAP Capability Registration for "submission" IANA has registered the "submission" JMAP Capability as follows: Capability Name: `urn:ietf:params:jmap:submission` Specification document: this document Intended use: common Change Controller: IETF Security and privacy considerations: this document, Section 9 ## JMAP Capability Registration for "vacationresponse" IANA has registered the "vacationresponse" JMAP Capability as follows: Capability Name: `urn:ietf:params:jmap:vacationresponse` Specification document: this document Intended use: common Change Controller: IETF Security and privacy considerations: this document, Section 9 ## IMAP and JMAP Keywords Registry This document makes two changes to the IMAP keywords registry as defined in [@!RFC5788]. First, the name of the registry is changed to the "IMAP and JMAP Keywords" registry. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/searchsnippet.mdown ===================================================== # Search Snippets > :information_source: > Implemented When doing a search on a `String` property, the client may wish to show the relevant section of the body that matches the search as a preview and to highlight any matching terms in both this and the subject of the Email. Search snippets represent this data. A **SearchSnippet** object has the following properties: - **emailId**: `Id` The Email id the snippet applies to. - **subject**: `String|null` If text from the filter matches the subject, this is the subject of the Email with the following transformations: 1. Any instance of the following three characters MUST be replaced by an appropriate HTML entity: & (ampersand), < (less-than sign), and > (greater-than sign) [HTML](https://www.w3.org/TR/html52/). Other characters MAY also be replaced with an HTML entity form. 2. The matching words/phrases from the filter are wrapped in HTML `<mark></mark>` tags. If the subject does not match text from the filter, this property is `null`. - **preview**: `String|null` If text from the filter matches the plaintext or HTML body, this is the relevant section of the body (converted to plaintext if originally HTML), with the same transformations as the *subject* property. It MUST NOT be bigger than 255 octets in size. If the body does not contain a match for the text from the filter, this property is `null`. What is a relevant section of the body for preview is server defined. If the server is unable to determine search snippets, it MUST return `null` for both the *subject* and *preview* properties. Note that unlike most data types, a SearchSnippet DOES NOT have a property called `id`. ## Behavioral changes When `urn:apache:james:params:jmap:mail:shares` is specified, it allows rendering search snippets not in his account (shared mailboxes). The following JMAP method is supported. ## SearchSnippet/get To fetch search snippets, make a call to `SearchSnippet/get`. It takes the following arguments: - **accountId**: `Id` The id of the account to use. - **filter**: `FilterOperator|FilterCondition|null` The same filter as passed to Email/query; see the description of this method in Section 4.4 for details. - **emailIds**: `Id[]` The ids of the Emails to fetch snippets for. The response has the following arguments: - **accountId**: `Id` The id of the account used for the call. - **list**: `SearchSnippet[]` An array of SearchSnippet objects for the requested Email ids. This may not be in the same order as the ids that were in the request. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/vacationresponse.mdown ===================================================== # Vacation Response > :information_source: > Implemented A vacation response sends an automatic reply when a message is delivered to the mail store, informing the original sender that their message may not be read for some time. Automated message sending can produce undesirable behaviour. To avoid this, implementors MUST follow the recommendations set forth in [@!RFC3834]. The **VacationResponse** object represents the state of vacation-response-related settings for an account. It has the following properties: - **id**: `Id` (immutable; server-set) The id of the object. There is only ever one VacationResponse object, and its id is `"singleton"`. - **isEnabled**: `Boolean` Should a vacation response be sent if a message arrives between the *fromDate* and *toDate*? - **fromDate**: `UTCDate|null` If *isEnabled* is `true`, messages that arrive on or after this date-time (but before the *toDate* if defined) should receive the user's vacation response. If `null`, the vacation response is effective immediately. - **toDate**: `UTCDate|null` If *isEnabled* is `true`, messages that arrive before this date-time (but on or after the *fromDate* if defined) should receive the user's vacation response. If `null`, the vacation response is effective indefinitely. - **subject**: `String|null` The subject that will be used by the message sent in response to messages when the vacation response is enabled. If `null`, an appropriate subject SHOULD be set by the server. - **textBody**: `String|null` The plaintext body to send in response to messages when the vacation response is enabled. If this is `null`, the server SHOULD generate a plaintext body part from the *htmlBody* when sending vacation responses but MAY choose to send the response as HTML only. If both *textBody* and *htmlBody* are `null`, an appropriate default body SHOULD be generated for responses by the server. - **htmlBody**: `String|null` The HTML body to send in response to messages when the vacation response is enabled. If this is `null`, the server MAY choose to generate an HTML body part from the *textBody* when sending vacation responses or MAY choose to send the response as plaintext only. The following JMAP methods are supported. ## VacationResponse/get This is a standard "/get" method as described in [@!RFC8620], Section 5.1. There MUST only be exactly one VacationResponse object in an account. It MUST have the id "singleton". ## VacationResponse/set This is a standard "/set" method as described in [@!RFC8620], Section 5.3. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/delegation.mdown ===================================================== # Delegations extension > :information_source: > Implemented ## Context This extension is specific to the Apache James server which defines methods to manage users' JMAP delegation settings. This extension to the JMAP specification enables to: - Manage accounts that a user delegates access to. - Manage accounts that a user is allowed access. ## Addition capability The URN `urn:apache:james:params:jmap:delegation` represents support for the Delegation data type and associated API methods. Servers supporting this specification MUST add this property to the capabilities object. ## Addition to the Session object Servers supporting this specification MUST add the delegated accounts to the `accounts` property of the Session object. ## Behavioral changes When `urn:apache:james:params:jmap:delegation` is specified, access to a delegated account is enabled through standard JMAP API calls but MUST except API calls to manage delegated account's delegation setting to avoid privilege escalation. ## Delegation methods A **Delegation** object stores information about an email address that either has access to the user's account or delegates access to the user. The semantics for this object depends on the context of usage methods: either manage delegate accounts or delegated accounts. The delegation object MUST have the following properties: - **id**: `Id` (immutable; server-set) The id of the Delegation. - **username**: `String` (immutable) The email address of the user that either delegates or is delegated to this user account. The **Delegate** object follows the structure of **Delegation** and represents delegations accessing this account (allowing the listed user to connect as the current account owner). The **DelegatedAccount** object follows the structure of **Delegation** and represents delegations active for this account (allowing the current account owner to connect as the listed user). A user can delegate his account to multiple users as well as be allowed to access other accounts. A user can manage his delegations to other users to access his account by creating, deleting and retrieving **Delegate** objects. Meanwhile, a user can only retrieve and delete **DelegatedAccount** objects. A server MUST not allow a delegated user to access and manage the owner user's delegation setting to avoid privilege escalation. The following JMAP methods are supported: ### Delegate/get This method returns **Delegate** objects of the user. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/mail/intro.mdown ===================================================== # Introduction The JSON Meta Application Protocol (JMAP) [@!RFC8620] is a generic protocol for synchronising data, such as mail, calendars, or contacts between a client and a server. It is optimised for mobile and web environments and aims to provide a consistent interface to different data types. This specification defines a data model for accessing a mail store over JMAP, allowing you to query, read, organise, and submit mail for sending. The data model is designed to allow a server to provide consistent access to the same data via IMAP [@?RFC3501] as well as JMAP. As in IMAP, a message must belong to a Mailbox; however, in JMAP, its id does not change if you move it between Mailboxes, and the server may allow it to belong to multiple Mailboxes simultaneously (often exposed in a user agent as labels rather than folders). As in IMAP, messages may also be assigned zero or more keywords: short arbitrary strings. These are primarily intended to store metadata to inform client display, such as unread status or whether a message has been replied to. An IANA registry allows common semantics to be shared between clients and extended easily in the future. A message and its replies are linked on the server by a common Thread id. Clients may fetch the list of messages with a particular Thread id to more easily present a threaded or conversational interface. Permissions for message access happen on a per-Mailbox basis. Servers may give the user restricted permissions for certain Mailboxes, for example, if another user's inbox has been shared as read-only with them. ## Notational Conventions The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [@!RFC2119] [@!RFC8174] when, and only when, they appear in all capitals, as shown here. Type signatures, examples, and property descriptions in this document follow the conventions established in Section 1.1 of [@!RFC8620]. Data types defined in the core specification are also used in this document. Servers MUST support all properties specified for the new data types defined in this document. ## Terminology This document uses the same terminology as in the core JMAP specification. The terms Mailbox, Thread, Email, SearchSnippet, EmailSubmission and VacationResponse (with that specific capitalisation) are used to refer to the data types defined in this document and instances of those data types. The term message refers to a document in Internet Message Format, as described in [@!RFC5322]. The Email data type represents messages in the mail store and associated metadata. ## Additions to the Capabilities Object The capabilities object is returned as part of the JMAP Session object; see [@!RFC8620], Section 2. This document defines three additional capability URIs. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/custom-quotas/quotas.mdown ===================================================== # Introduction <aside class="notice"> Implemented, deprecated </aside> This specification defines a data model for handling mail quotas over JMAP, allowing you to read quota information. This specification does not address quota administration, which should be handled by other means. This specification is not official and proper to the James project usage at the moment. ## Terminology ### Quota A quota is a numeric upper limit that the server is enforcing. Quotas are applied to JMAP Mailbox objects. ## Addition to the capabilities object The capabilities object is returned as part of the JMAP Session object; see [@!RFC8620], section 2. This document defines one additional capability URI. ### urn:apache:james:params:jmap:mail:quota This represents support for the Quota data type and associated API methods. Servers supporting this specification MUST add this property to the capabilities object. This extension is specific to the Apache James server and is a temporary solution while waiting for the main work on quotas as part of the IETF group to be finalized as a proper RFC document. This extension enables to: * read quotas usage and limits on mailboxes. If specified, behavioral changes and additional fields defined hereafter MUST apply. If unspecified no additional fields to the Mailbox object are returned, and the behaviour needs to be exactly the one of `urn:ietf:params:jmap:mail`. # Quotas definition The quota is an addition to the Mailbox object that displays the limit set to a mailbox usage as well as the current usage in regard to that limit. ## The QuotaId Data Type The **QuotaId** is a `String` defined with the name of the **QuotaRoot** (as defined in [RFC2087](https://tools.ietf.org/html/rfc2087.html)) it represents. It usually represents the ID attached to one or more **Quota** objects defined for that Mailbox. ## The Quotas.Type Data Type ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/securityconsiderations.mdown ===================================================== # Security considerations All security considerations of JMAP ([@!RFC8620]) apply to this specification. Implementors should be careful to make sure the implementation of that extension does not violate the site's security policy. The resource usage of other users is likely to be considered confidential information and should not be divulged to unauthorized persons. As for any resource shared across users (for example, a quota with the `domain` or `global` scope), a user that can consume the resource can affect the resources available to the other users. For example, a user could spam himself with events and make the shared resource hit the limit and unusable for others (implementors could mitigate that with some rate limiting implementation on the server). ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/ianaconsiderations.mdown ===================================================== # IANA Considerations ## JMAP Capability Registration for "quota" IANA will register the "quota" JMAP Capability as follows: Capability Name: `urn:ietf:params:jmap:quota` Specification document: this document Intended use: common Change Controller: IETF Security and privacy considerations: this document, section 4. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/quota.mdown ===================================================== # Quota > :warning: > Partially implemented The quota is an object that displays the limit set to an account usage as well as the current usage in regard to that limit. The quota object **MUST** contain the following fields: * **id**: `Id` The unique identifier for this object. * **resourceType**: `String` The resource type of the quota. * **used**: `UnsignedInt` The current usage of the defined quota, using the "resourceType" defined as unit of measure. Computation of this value is handled by the server. * **hardLimit**: `UnsignedInt` The hard limit set by this quota, using the "resourceType" defined as unit of measure. Objects in scope may not be created or updated if this limit is reached. * **scope**: `String` The "Scope" of this quota. * **name**: `String` The name of the quota. Useful for managing quotas and using queries for searching. * **types**: `String[]` A list of all the type names as defined in the "JMAP Types Names" registry (e.g., Email, Calendar, etc.) to which this quota applies. This allows the quotas to be assigned to distinct or shared data types. The server **MUST** filter out any types for which the client did not request the associated capability in the "using" section of the request. Further, the server **MUST NOT** return Quota objects for which there are no types recognized by the client. The quota object **MAY** contain the following field: * **warnLimit**: `UnsignedInt|null` The warn limit set by this quota, using the "resourceType" defined as unit of measure. It can be used to send a warning to an entity about to reach the hard limit soon, but with no action taken yet. If set, it **SHOULD** be lower than the "softLimit" (if present and different from null) and the "hardLimit". * **softLimit**: `UnsignedInt|null` The soft limit set by this quota, using the "resourceType" defined as unit of measure. It can be used to still allow some operations but refuse some others. What is allowed or not is up to the server. For example, it could be used for blocking outgoing events of an entity (sending emails, creating calendar events, etc.) while still receiving incoming events (receiving emails, receiving calendars events, etc.). If set, it **SHOULD** be higher than the "warnLimit" (if present and different from null) but lower than the "hardLimit". * **description**: `String|null` Arbitrary, free, human-readable description of this quota. It might be used to explain where the different limits come from and explain the entities and data types this quota applies to. The description **MUST** be encoded in UTF-8 [RFC3629] as described in [RFC8620], Section 1.5, and selected based on an Accept-Language header in the request (as defined in [RFC9110], Section 12.5.4) or out-of-band information about the user's language or locale. The following JMAP methods are supported. ## Quota/get > :information_source: > Implemented Standard “/get” method as described in [@!RFC8620] section 5.1. The id's argument may be "null" to fetch all quotas of the account at once, as demonstrated in Section 5.1. ## Quota/changes ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/quotas/intro.mdown ===================================================== # Introduction > :warning: > Partially implemented JMAP ([@!RFC8620] – JSON Meta Application Protocol) is a generic protocol for synchronising data, such as mails, calendars or contacts, between a client and a server. It is optimised for mobile and web environments, and aims to provide a consistent interface to different data types. This specification defines a data model for handling quotas over JMAP, allowing you to read and explain quota information. This specification does not address quota administration, which should be handled by other means. ## Notational conventions The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [@!RFC2119] [@!RFC8174] when, and only when, they appear in all capitals, as shown here. Type signatures, examples and property descriptions in this document follow the conventions established in section 1.1 of [@!RFC8620]. Data types defined in the core specification are also used in this document. Servers MUST support all properties specified for the new data types defined in this document. ## Terminology The same terminology is used in this document as in the core JMAP specification. The term Quota (with that specific capitalization) is used to refer to the data type defined in this document and instance of that data type. ## Addition to the capabilities object The capabilities object is returned as part of the JMAP Session object; see [@!RFC8620], section 2. This document defines one additional capability URI. ### urn:ietf:params:jmap:quota This represents support for the Quota data type and associated API methods. Servers supporting this specification **MUST** add a property called `urn:ietf:params:jmap:quota` to the capabilities object. The value of this property is an empty object in both the JMAP session capabilities property and an account’s accountCapabilities property. ## Sub-types of the Quota Data Type There are two fields within the `Quota` data type, which have an enumerated set of possible values. These are: ### Scope ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/push.mdown ===================================================== # Push > :information_source: > Implemented. > > Some limitations for event source are described below. Push notifications allow clients to efficiently update (almost) instantly to stay in sync with data changes on the server. The general model for push is simple and sends minimal data over the push channel: just enough for the client to know whether it needs to resync. The format allows multiple changes to be coalesced into a single push update and the frequency of pushes to be rate limited by the server. It doesn't matter if some push events are dropped before they reach the client; the next time it gets/sets any records of a changed type, it will discover the data has changed and still sync all changes. There are two different mechanisms by which a client can receive push notifications, to allow for the different environments in which a client may exist. An event source resource (see Section 7.3) allows clients that can hold transport connections open to receive push notifications directly from the JMAP server. This is simple and avoids third parties, but it is often not feasible on constrained platforms such as mobile devices. Alternatively, clients can make use of any push service supported by their environment. A URL for the push service is registered with the JMAP server (see Section 7.2), then the server then POSTs each notification to that URL. The push service is then responsible for routing these to the client. ## The StateChange Object When something changes on the server, the server pushes a **StateChange** object to the client. A **StateChange** object has the following properties: - **@type**: `String` This MUST be the string "StateChange". - **changed**: `Id[TypeState]` A map of an *account id* to an object encoding the state of data types that have changed for that account since the last StateChange object was pushed, for each of the accounts to which the user has access and for which something has changed. A **TypeState** object is a map. The keys are the type name `Foo` (e.g., "Mailbox" or "Email"), and the value is the *state* property that would currently be returned by a call to *Foo/get*. The client can compare the new state strings with its current values to see whether it has the current data for these types. If not, the changes can then be efficiently fetched in a single standard API request (using the */changes* type methods). ### Example In this example, the server has amalgamated a few changes together across two different accounts the user has access to, before pushing the following StateChange object to the client: { "@type": "StateChange", "changed": { "a3123": { "Email": "d35ecb040aab", "EmailDelivery": "428d565f2440", "CalendarEvent": "87accfac587a" }, "a43461d": { "Mailbox": "0af7a512ce70", "CalendarEvent": "7a4297cecd76" } } } The client can compare the state strings with its current state for the Email, CalendarEvent, etc., object types in the appropriate accounts to see if it needs to fetch changes. If the client is itself making changes, it may receive a StateChange object while the /set API call is in flight. It can wait until the call completes and then compare if the new state string after the /set is the same as was pushed in the StateChange object; if so, and the old state of the /set response matches the client's previous state, it does not need to waste a request asking for changes it already knows. ## PushSubscription Clients may create a *PushSubscription* to register a URL with the JMAP server. The JMAP server will then make an HTTP POST request to this URL for each push notification it wishes to send to the client. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/securityconsiderations.mdown ===================================================== # Security Considerations ## Transport Confidentiality To ensure the confidentiality and integrity of data sent and received via JMAP, all requests MUST use TLS 1.2 [@!RFC5246] [@!RFC8446] or later, following the recommendations in [@!RFC7525]. Servers SHOULD support TLS 1.3 [@!RFC8446] or later. Clients MUST validate TLS certificate chains to protect against man-in-the-middle attacks [@!RFC5280]. ## Authentication Scheme A number of HTTP authentication schemes have been standardised (see https://www.iana.org/assignments/http-authschemes/). Servers should take care to assess the security characteristics of different schemes in relation to their needs when deciding what to implement. Use of the Basic authentication scheme is NOT RECOMMENDED. Services that choose to use it are strongly recommended to require generation of a unique "app password" via some external mechanism for each client they wish to connect. This allows connections from different devices to be differentiated by the server and access to be individually revoked. ## Service Autodiscovery Unless secured by something like DNSSEC, autodiscovery of server details using SRV DNS records is vulnerable to a DNS poisoning attack, which can lead to the client talking to an attacker's server instead of the real JMAP server. The attacker may then intercept requests to execute man-in-the-middle attacks and, depending on the authentication scheme, steal credentials to generate its own requests. Clients that do not support SRV lookups are likely to try just using the `/.well-known/jmap` path directly against the domain of the username over HTTPS. Servers SHOULD ensure this path resolves or redirects to the correct JMAP Session resource to allow this to work. If this is not feasible, servers MUST ensure this path cannot be controlled by an attacker, as again it may be used to steal credentials. ## JSON Parsing The Security Considerations of [@!RFC8259] apply to the use of JSON as the data interchange format. As for any serialization format, parsers need to thoroughly check the syntax of the supplied data. JSON uses opening and closing tags for several types and structures, and it is possible that the end of supplied data will be reached when scanning for a matching closing tag; this is an error condition, and implementations need to stop scanning at the end of the supplied data. JSON also uses a string encoding with some escape sequences to encode special characters within a string. Care is needed when processing these escape sequences to ensure that they are fully formed before the special processing is triggered, with special care taken when the escape sequences appear adjacent to other (non-escaped) special characters or adjacent to the end of data (as in the previous paragraph). If parsing JSON into a non-textual structured data format, implementations may need to allocate storage to hold JSON string elements. Since JSON does not use explicit string lengths, the risk of denial of service due to resource exhaustion is small, but implementations may still wish to place limits on the size of allocations they are willing to make in any given context, to avoid untrusted data causing excessive memory allocation. ## Denial of Service A small request may result in a very large response and require considerable work on the server if resource limits are not enforced. JMAP provides mechanisms for advertising and enforcing a wide variety of limits for mitigating this threat, including limits on the number of objects fetched in a single method call, number of methods in a single request, number of concurrent requests, etc. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/session.mdown ===================================================== # The JMAP Session Resource > :information_source: > Implemented You need two things to connect to a JMAP server: 1. The URL for the JMAP Session resource. This may be requested directly from the user or discovered automatically based on a username domain (see Section 2.2 below). 2. Credentials to authenticate with. How to obtain credentials is out of scope for this document. A successful authenticated GET request to the JMAP Session resource MUST return a JSON-encoded **Session** object, giving details about the data and capabilities the server can provide to the client given those credentials. It has the following properties: - **capabilities**: `String[Object]` An object specifying the capabilities of this server. Each key is a URI for a capability supported by the server. The value for each of these keys is an object with further information about the server's capabilities in relation to that capability. The client MUST ignore any properties it does not understand. The capabilities object MUST include a property called `urn:ietf:params:jmap:core`. The value of this property is an object that MUST contain the following information on server capabilities (suggested minimum values for limits are supplied that allow clients to make efficient use of the network): - **maxSizeUpload**: `UnsignedInt` > :warning: > Not enforced yet The maximum file size, in octets, that the server will accept for a single file upload (for any purpose). Suggested minimum: 50,000,000. - **maxConcurrentUpload**: `UnsignedInt` > :warning: > Not enforced yet The maximum number of concurrent requests the server will accept to the upload endpoint. Suggested minimum: 4. - **maxSizeRequest**: `UnsignedInt` > :warning: > Not enforced yet The maximum size, in octets, that the server will accept for a single request to the API endpoint. Suggested minimum: 10,000,000. - **maxConcurrentRequests**: `UnsignedInt` > :warning: > Not enforced yet The maximum number of concurrent requests the server will accept to the API endpoint. Suggested minimum: 4. - **maxCallsInRequest**: `UnsignedInt` > :warning: ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/ianaconsiderations.mdown ===================================================== # IANA Considerations ## Assignment of jmap Service Name IANA has assigned the 'jmap' service name in the "Service Name and Transport Protocol Port Number Registry" [@!RFC6335]. Service Name: jmap Transport Protocol(s): tcp Assignee: IESG Contact: IETF Chair Description: JSON Meta Application Protocol Reference: [@!RFC8620] Assignment Notes: This service name was previously assigned under the name *JSON Mail Access Protocol*. This has been de-assigned and re-assigned with the approval of the previous assignee. ## Registration of Well-Known URI suffix for JMAP IANA has registered the following suffix in the "Well-Known URIs" registry for JMAP, as described in [@!RFC8615]: URI Suffix: jmap Change Controller: IETF Specification Document: [@!RFC8620], Section 2.2. ## Registration of the jmap URN Sub-namespace IANA has registered the following URN sub-namespace in the "IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" registry within the "Uniform Resource Name (URN) Namespace for IETF Use" registry as described in [@!RFC3553]. Registered Parameter Identifier: jmap Reference: [@!RFC8620], Section 9.4 IANA Registry Reference: http://www.iana.org/assignments/jmap ## Creation of "JMAP Capabilities" Registry IANA has created the "JMAP Capabilities" registry as described in Section 2. JMAP capabilities are advertised in the *capabilities* property of the Session object. They are used to extend the functionality of a JMAP server. A capability is referenced by a URI. The JMAP capability URI can be a URN starting with `urn:ietf:params:jmap:` plus a unique suffix that is the index value in the jmap URN sub-namespace. Registration of a JMAP capability with another form of URI has no impact on the jmap URN sub-namespace. This registry follows the expert review process unless the "intended use" field is *common* or *placeholder*, in which case registration follows the specification required process. A JMAP capability registration can have an intended use of *common*, *placeholder*, *limited*, or *obsolete*. IANA will list common-use registrations prominently and separately from those with other intended use values. The JMAP capability registration procedure is not a formal standards process but rather an administrative procedure intended to allow community comment and sanity checking without excessive time delay. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/binary.mdown ===================================================== # Binary Data > :information_source: > Implemented Binary data is referenced by a *blobId* in JMAP and uploaded/downloaded separately to the core API. The blobId solely represents the raw bytes of data, not any associated metadata such as a file name or content type. Such metadata is stored alongside the blobId in the object referencing it. The data represented by a blobId is immutable. Any blobId that exists within an account may be used when creating/updating another object in that account. For example, an Email type may have a blobId that represents the object in Internet Message Format [@!RFC5322]. A client could create a new Email object with an attachment and use this blobId, in effect attaching the old message to the new one. Similarly, it could attach any existing attachment of an old message without having to download and upload it again. When the client uses a blobId in a create/update, the server MAY assign a new blobId to refer to the same binary data within the new/updated object. If it does so, it MUST return any properties that contain a changed blobId in the created/updated response, so the client gets the new ids. A blob that is not referenced by a JMAP object (e.g., as a message attachment) MAY be deleted by the server to free up resources. Uploads (see below) are initially unreferenced blobs. To ensure interoperability: * The server SHOULD use a separate quota for unreferenced blobs to the account's usual quota. In the case of shared accounts, this quota SHOULD be separate per user. * This quota SHOULD be at least the maximum total size that a single object can reference on this server. For example, if supporting JMAP Mail, this should be at least the maximum total attachments size for a message. * When an upload would take the user over quota, the server MUST delete unreferenced blobs in date order, oldest first, until there is room for the new blob. * Except where quota restrictions force early deletion, an unreferenced blob MUST NOT be deleted for at least 1 hour from the time of upload; if reuploaded, the same blobId MAY be returned, but this SHOULD reset the expiry time. * A blob MUST NOT be deleted during the method call that removed the last reference, so that a client can issue a create and a destroy that both reference the blob within the same method call. ## Uploading Binary Data There is a single endpoint that handles all file uploads for an account, regardless of what they are to be used for. The Session object (see Section 2) has an *uploadUrl* property in URI Template (level 1) format [@!RFC6570], which MUST contain a variable called `accountId`. The client may use this template in combination with an *accountId* to get the URL of the file upload resource. To upload a file, the client submits an authenticated POST request to the file upload resource. A successful request MUST return a single JSON object with the following properties as the response: - **accountId**: `Id` The id of the account used for the call. - **blobId**: `Id` The id representing the binary data uploaded. The data for this id is immutable. The id *only* refers to the binary data, not any metadata. - **type**: `String` The media type of the file (as specified in [@!RFC6838], Section 4.2) as set in the Content-Type header of the upload HTTP request. - **size**: `UnsignedInt` The size of the file in octets. If identical binary content to an existing blob in the account is uploaded, the existing blobId MAY be returned. Clients should use the blobId returned in a timely manner. Under rare circumstances, the server may have deleted the blob before the client uses it; the client should keep a reference to the local file so it can upload it again in such a situation. When an HTTP error response is returned to the client, the server SHOULD return a JSON "problem details" object as the response body, as per [@!RFC7807]. As access controls are often determined by the object holding the reference to a blob, unreferenced blobs MUST only be accessible to the uploader, even in shared accounts. ## Downloading Binary Data ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/api.mdown ===================================================== # Structured Data Exchange The client may make an API request to the server to get or set structured data. This request consists of an ordered series of method calls. These are processed by the server, which then returns an ordered series of responses. ## Making an API Request To make an API request, the client makes an authenticated POST request to the API resource, which is defined by the *apiUrl* property in the Session object (see Section 2). The request MUST be of type `application/json` and consist of a single JSON-encoded **Request** object, as defined in Section 3.3. If successful, the response MUST also be of type `application/json` and consist of a single **Response** object, as defined in Section 3.4. ## The Invocation Data Type > :information_source: > Implemented Method calls and responses are represented by the **Invocation** data type. This is a tuple, represented as a JSON array containing three elements: 1. A `String` **name** of the method to call or of the response. 2. A `String[*]` object containing *named* **arguments** for that method or response. 3. A `String` **method call id**: an arbitrary string from the client to be echoed back with the responses emitted by that method call (a method may return 1 or more responses, as it may make implicit calls to other methods; all responses initiated by this method call get the same method call id in the response). ## The Request Object > :information_source: > Implemented A **Request** object has the following properties: - **using**: `String[]` The set of capabilities the client wishes to use. The client MAY include capability identifiers even if the method calls it makes do not utilise those capabilities. The server advertises the set of specifications it supports in the Session object (see Section 2), as keys on the *capabilities* property. - **methodCalls**: `Invocation[]` An array of method calls to process on the server. The method calls MUST be processed sequentially, in order. - **createdIds**: `Id[Id]` (optional) A map of a (client-specified) creation id to the id the server assigned when a record was successfully created. As described later in this specification, some records may have a property that contains the id of another record. To allow more efficient network usage, you can set this property to reference a record created earlier in the same API request. Since the real id is unknown when the request is created, the client can instead specify the creation id it assigned, prefixed with a `#` (see Section 5.3 for more details). As the server processes API requests, any time it successfully creates a new record, it adds the creation id to this map (see the *create* argument to "/set" in Section 5.3), with the server-assigned real id as the value. If it comes across a reference to a creation id in a create/update, it looks it up in the map and replaces the reference with the real id, if found. The client can pass an initial value for this map as the *createdIds* property of the Request object. This may be an empty object. If given in the request, the response will also include a createdIds property. This allows proxy servers to easily split a JMAP request into multiple JMAP requests to send to different servers. For example, it could send the first two method calls to server A, then the third to server B, before sending the fourth to server A again. By passing the createdIds of the previous response to the next request, it can ensure all of these still resolve. See Section 5.8 for further discussion of proxy considerations. Future specifications MAY add further properties to the Request object to extend the semantics. To ensure forwards compatibility, a server MUST ignore any other properties it does not understand on the JMAP Request object. ### Example Request ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/jmap/intro.mdown ===================================================== # Introduction The JSON Meta Application Protocol (JMAP) is used for synchronising data, such as mail, calendars, or contacts, between a client and a server. It is optimised for mobile and web environments and aims to provide a consistent interface to different data types. This specification is for the generic mechanism of data synchronisation. Further specifications define the data models for different data types that may be synchronised via JMAP. JMAP is designed to make efficient use of limited network resources. Multiple API calls may be batched in a single request to the server, reducing round trips and improving battery life on mobile devices. Push connections remove the need for polling, and an efficient delta update mechanism ensures a minimum amount of data is transferred. JMAP is designed to be horizontally scalable to a very large number of users. This is facilitated by separate endpoints for users after login, the separation of binary and structured data, and a data model for sharing that does not allow data dependencies between accounts. ## Notational Conventions The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [@!RFC2119] [@!RFC8174] when, and only when, they appear in all capitals, as shown here. The underlying format used for this specification is JSON. Consequently, the terms "object" and "array" as well as the four primitive types (strings, numbers, booleans, and null) are to be interpreted as described in Section 1 of [@!RFC8259]. Unless otherwise noted, all the property names and values are case sensitive. Some examples in this document contain "partial" JSON documents used for illustrative purposes. In these examples, three periods "..." are used to indicate a portion of the document that has been removed for compactness. For compatibility with publishing requirements, line breaks have been inserted inside long JSON strings, with the following continuation lines indented. To form the valid JSON example, any line breaks inside a string must be replaced with a space and any other white space after the line break removed. Unless otherwise specified, examples of API exchanges only show the methodCalls array of the Request object or the methodResponses array of the Response object. For compactness, the rest of the Request/Response object is omitted. Type signatures are given for all JSON values in this document. The following conventions are used: * `*` – The type is undefined (the value could be any type, although permitted values may be constrained by the context of this value). * `String` – The JSON string type. * `Number` – The JSON number type. * `Boolean` – The JSON boolean type. * `A[B]` – A JSON object where the keys are all of type `A`, and the values are all of type `B`. * `A[]` – An array of values of type `A`. * `A|B` – The value is either of type `A` or of type `B`. Other types may also be given, with their representation defined elsewhere in this document. Object properties may also have a set of attributes defined along with the type signature. These have the following meanings: * `server-set` – Only the server can set the value for this property. The client MUST NOT send this property when creating a new object of this type. * `immutable` – The value MUST NOT change after the object is created. * `default` – (This is followed by a JSON value). The value that will be used for this property if it is omitted in an argument or when creating a new object of this type. ## The Id Data Type > :information_source: > Implemented ===================================================== == File: server/protocols/jmap-rfc-8621/doc/specs/spec/authentication.mdown ===================================================== # Authentication JMAP RFC-8620 deliberately does not address authentication concerns, and only assumes authenticated requests are handled. Discovery of available authentication mechanism is not part of the JMAP specification. This document summarizes available authentication mechanism on top of JMAP RFC-8621 implementation as part of the James project. ## Basic authentication James JMAP RFC-8621 supports [Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). Please note that while convenient for testing purpose, this authentication mechanism should not be used for production workflow: the credentials are transmitted again and over again, should be retained in memory, authentication is challenged for each request... ## JWT authentication We rely on a third party software to supply a signed JWT token, valid according to the James JWT public key. If valid, the request is blindly trusted. [Read more](https://github.com/apache/james-project/blob/master/docs/modules/servers/pages/distributed/configure/jmap.adoc#generating-a-jwt-key-pair). ## Implementing new authentication mechanisms Administrator might need to adapt authentication to their needs. To implement custom authentication mechanisms, you need to implement `org.apache.james.jmap.http.AuthenticationStrategy` and register it in `RFC8621MethodsModule::provideAuthenticator`. Note that the Apache James project would happily welcome contributions regarding support of other authentication flows. ===================================================== == File: server/protocols/jmap-rfc-8621/doc/README.md ===================================================== Annotated JMAP documentation ============================ This directory contains annotated JMAP documentation as found on https://jmap.io/. Officially finalized specifications so far regarding JMAP are: * [The core protocol](https://jmap.io/spec-core.html) [[RFC 8620](https://tools.ietf.org/html/rfc8620)] * [JMAP Mail](https://jmap.io/spec-mail.html) [[RFC 8621](https://tools.ietf.org/html/rfc8621)] Annotations aim at tracking implementation progress in James project. Annotations are usually represented in the documentation by an `aside` tag. That tag can have two classes: * `notice` More like an informative annotation, usually used to mark that a feature has been implemented * `warning` To get the developer's attention, usually to say that maybe a point or detail of an implemented feature has not been implemented, or partially ===================================================== == File: server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/PushSubscriptionSetCreatePerformer.scala ===================================================== package org.apache.james.jmap.method import java.nio.charset.StandardCharsets import eu.timepit.refined.auto._ import jakarta.inject.Inject import org.apache.james.jmap.api.model.{DeviceClientIdInvalidException, ExpireTimeInvalidException, PushSubscriptionCreationRequest, PushSubscriptionExpiredTime, PushSubscriptionId, PushSubscriptionKeys, PushSubscriptionServerURL, VerificationCode} import org.apache.james.jmap.api.pushsubscription.PushSubscriptionRepository import org.apache.james.jmap.core.SetError.SetErrorDescription import org.apache.james.jmap.core.{Properties, PushSubscriptionCreation, PushSubscriptionCreationId, PushSubscriptionCreationParseException, PushSubscriptionCreationResponse, PushSubscriptionSetRequest, SetError} import org.apache.james.jmap.json.{PushSerializer, PushSubscriptionSerializer} import org.apache.james.jmap.method.PushSubscriptionSetCreatePerformer.{CreationFailure, CreationResult, CreationResults, CreationSuccess} import org.apache.james.jmap.pushsubscription.{PushRequest, PushTTL, WebPushClient} import org.apache.james.mailbox.MailboxSession import org.slf4j.LoggerFactory import play.api.libs.json.{JsObject, JsPath, Json, JsonValidationError} import reactor.core.scala.publisher.{SFlux, SMono} object PushSubscriptionSetCreatePerformer { private val LOGGER = LoggerFactory.getLogger(classOf[PushSubscriptionSetCreatePerformer]) trait CreationResult case class CreationSuccess(clientId: PushSubscriptionCreationId, response: PushSubscriptionCreationResponse) extends CreationResult case class CreationFailure(clientId: PushSubscriptionCreationId, e: Throwable) extends CreationResult { def asMessageSetError: SetError = e match { case e: PushSubscriptionCreationParseException => LOGGER.info("Failure to parse PushSubscription/set create", e) e.setError case e: ExpireTimeInvalidException => LOGGER.info("Invalid time expiracy for push subscription: {}", e.getMessage) SetError.invalidArguments(SetErrorDescription(e.getMessage), Some(Properties("expires"))) case e: DeviceClientIdInvalidException => LOGGER.info("Invalid deviceId for push subscription: {}", e.getMessage) SetError.invalidArguments(SetErrorDescription(e.getMessage)) case e: IllegalArgumentException => LOGGER.info("Illegal argument in PushSubscription/set create", e) SetError.invalidArguments(SetErrorDescription(e.getMessage)) case e => LOGGER.error("Failed to create push subscription", e) SetError.serverFail(SetErrorDescription(e.getMessage)) } } case class CreationResults(results: Seq[CreationResult]) { def created: Option[Map[PushSubscriptionCreationId, PushSubscriptionCreationResponse]] = Option(results.flatMap { case result: CreationSuccess => Some((result.clientId, result.response)) case _ => None }.toMap) ===================================================== == File: server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/delegation/DelegatedAccountSet.scala ===================================================== package org.apache.james.jmap.delegation import org.apache.james.jmap.core.{AccountId, SetError, UuidState} import org.apache.james.jmap.method.{SetRequest, WithAccountId} case class DelegatedAccountSetRequest(accountId: AccountId, destroy: Option[Seq[UnparsedDelegateId]]) extends WithAccountId with SetRequest { override def idCount: Int = destroy.map(_.size).getOrElse(0) } case class DelegatedAccountSetResponse(accountId: AccountId, oldState: Option[UuidState], newState: UuidState, destroyed: Option[Seq[DelegationId]], notDestroyed: Option[Map[UnparsedDelegateId, SetError]]) ===================================================== == File: server/protocols/jmap-rfc-8621/src/test/resources/spamMail.eml ===================================================== Return-Path: <root-bounces@listes.minet.net> Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Wed, 03 Jun 2015 11:05:45 +0200 X-Sieve: CMU Sieve 2.4 Received: from smtp.minet.net (smtp.minet.net [192.168.102.18]) by mx1.minet.net (Postfix) with ESMTP id F06FE610F72; Wed, 3 Jun 2015 11:05:48 +0200 (CEST) Received: from listes.minet.net (listes.minet.net [192.168.102.29]) by smtp.minet.net (Postfix) with ESMTP id AAB15610F70; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=minet.net; s=mail; t=1433322348; bh=8OtmVRMX7IWWyQo8WQIi5rKeDEQFghSX2r1WN9/pqUk=; h=From:Date:To:Subject:List-Id:List-Unsubscribe:List-Post:List-Help: List-Subscribe:From; b=UkthSFXn5mtPnn7sYvDJIxgCk1O36L0p+hTOnI/xTF2WRMGJyXtLyCdFdE5jQ5gE4 EGNdhwmfjaKsoE7IDtc/4GrPvbnM8i9ojpSOBW1hXJPOeYnRgah/4gsXsMJWvmmq/A 4oTnw8ZswFXiShDmBMyaSEZuVrWTdaPBgUhVhGw8= Received: from listes.minet.net (listes.minet.net [127.0.0.1]) by listes.minet.net (Postfix) with ESMTP id 9CD5BA27FF9; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) X-Original-To: root@listes.minet.net Delivered-To: root@listes.minet.net Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by listes.minet.net (Postfix) with ESMTP id B8C1FA27FEF for <root@listes.minet.net>; Wed, 3 Jun 2015 09:05:46 +0000 (UTC) Received: from localhost (spam.minet.net [192.168.102.97]) by mx1.minet.net (Postfix) with ESMTP id AD28B610F6D for <root@listes.minet.net>; Wed, 3 Jun 2015 11:05:46 +0200 (CEST) Content-Type: multipart/mixed; boundary="----------=_1433322346-12583-0" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 From: "Content-filter at spam.minet.net" <postmaster@minet.net> Date: Wed, 3 Jun 2015 09:05:46 +0000 (UTC) To: <root@listes.minet.net> Message-ID: <VASs-IZaXqmZao@spam.minet.net> Subject: Original subject X-BeenThere: root@listes.minet.net X-Mailman-Version: 2.1.15 Errors-To: root-bounces@listes.minet.net Sender: "root" <root-bounces@listes.minet.net> This is a multi-part message in MIME format... ------------=_1433322346-12583-0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 7bit No viruses were found. ===================================================== == File: server/protocols/jmap-rfc-8621/src/test/resources/fullMessage.eml ===================================================== Reply-to: alice <alice@local> In-reply-to: bob@local Mime-Version: 1.0 To: bob <bob@local> From: alice <alice@local> Cc: jack <jack@local>, jacob <jacob@local> Bcc: alice <alice@local> Subject: Full message Message-ID: <1cc7f114-dbc4-42c2-99bd-f1100db6d0c1@open-paas.org> Date: Tue, 7 Jun 2016 16:23:37 +0200 Content-Type: multipart/mixed; boundary="------------7AF1D14DE1DFA16229726B54" This is a multi-part message in MIME format. --------------7AF1D14DE1DFA16229726B54 Content-Type: multipart/alternative; boundary="------------172F9470CFA3BF3417835D92" --------------172F9470CFA3BF3417835D92 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit /blabla/ *bloblo* --------------172F9470CFA3BF3417835D92 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit <i>blabla</i> <b>bloblo</b> --------------172F9470CFA3BF3417835D92-- --------------7AF1D14DE1DFA16229726B54 Content-Type: image/jpeg; name="4037_014.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="4037_014.jpg" /9j/4X2cRXhpZgAASUkqAAgAAAANAA8BAgAKAAAAqgAAABABAgAJAAAAtAAAABIBAwABAAAA AQAAABoBBQABAAAAvgAAABsBBQABAAAAxgAAACgBAwABAAAAAgAAADEBAgAKAAAAzgAAADIB AgAUAAAA2AAAABMCAwABAAAAAgAAAGmHBAABAAAAfAIAAKXEBwDQAAAA7AAAANLGBwBAAAAA vAEAANPGBwCAAAAA/AEAAEwqAABQYW5hc29uaWMARE1DLUZaNDUAALQAAAABAAAAtAAAAAEA AABWZXIuMS4wICAAMjAxNDowMjoyNSAxMDozMjowOQBQcmludElNADAyNTAAAA4AAQAWABYA AgAAAAAAAwBkAAAABwAAAAAACAAAAAAACQAAAAAACgAAAAAACwCsAAAADAAAAAAADQAAAAAA DgDEAAAAAAEFAAAAAQEBAAAAEAGAAAAACREAABAnAAALDwAAECcAAJcFAAAQJwAAsAgAABAn AAABHAAAECcAAF4CAAAQJwAAiwAAABAnAADLAwAAECcAAOUbAAAQJwAAAAAAAAAAAAAAAAAA ===================================================== == File: server/protocols/jmap-rfc-8621/src/test/resources/example.html ===================================================== <div class="section"> <h3>Why a new Logo?<a name="Why_a_new_Logo"></a></h3> <p>We are happy with our current logo, but for the upcoming James Server 3.0 release, we would like to give our community the opportunity to create a new image for James.</p> <p>Don't be shy, take your inkscape and gimp, and send us on the <a href="mail.html">James Server User mailing list</a> your creations. We will publish them on this page.</p> <p>We need an horizontal logo (100p height) to be show displayed on the upper left corner of this page, an avatar (48x48p) to be used on a Twitter stream for example. The used fonts should be redistributable (or commonly available on Windows and Linux). The chosen logo should be delivered in SVG format. We also like the <a class="externalLink" href="http://www.apache.org/foundation/press/kit/">Apache feather</a>.</p> </div> ===================================================== == File: server/protocols/jmap-rfc-8621/src/test/resources/emptyBodyMessageWithOneAttachment.eml ===================================================== Reply-to: alice <alice@local> In-reply-to: bob@local Mime-Version: 1.0 To: bob <bob@local> From: alice <alice@local> Cc: jack <jack@local>, jacob <jacob@local> Bcc: alice <alice@local> Subject: Full message Message-ID: <1cc7f114-dbc4-42c2-99bd-f1100db6d0c1@open-paas.org> Date: Tue, 7 Jun 2016 16:23:37 +0200 Content-Type: multipart/mixed; boundary="------------7AF1D14DE1DFA16229726B54" This is a multi-part message in MIME format. --------------7AF1D14DE1DFA16229726B54 Content-Type: multipart/alternative; boundary="------------172F9470CFA3BF3417835D92" --------------172F9470CFA3BF3417835D92 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit --------------172F9470CFA3BF3417835D92-- --------------7AF1D14DE1DFA16229726B54 Content-Type: image/jpeg; name="4037_014.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="4037_014.jpg" /9j/4X2cRXhpZgAASUkqAAgAAAANAA8BAgAKAAAAqgAAABABAgAJAAAAtAAAABIBAwABAAAA AQAAABoBBQABAAAAvgAAABsBBQABAAAAxgAAACgBAwABAAAAAgAAADEBAgAKAAAAzgAAADIB AgAUAAAA2AAAABMCAwABAAAAAgAAAGmHBAABAAAAfAIAAKXEBwDQAAAA7AAAANLGBwBAAAAA vAEAANPGBwCAAAAA/AEAAEwqAABQYW5hc29uaWMARE1DLUZaNDUAALQAAAABAAAAtAAAAAEA AABWZXIuMS4wICAAMjAxNDowMjoyNSAxMDozMjowOQBQcmludElNADAyNTAAAA4AAQAWABYA AgAAAAAAAwBkAAAABwAAAAAACAAAAAAACQAAAAAACgAAAAAACwCsAAAADAAAAAAADQAAAAAA DgDEAAAAAAEFAAAAAQEBAAAAEAGAAAAACREAABAnAAALDwAAECcAAJcFAAAQJwAAsAgAABAn AAABHAAAECcAAF4CAAAQJwAAiwAAABAnAADLAwAAECcAAOUbAAAQJwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ===================================================== == File: server/protocols/jmap-rfc-8621/src/test/resources/calendar.eml ===================================================== Return-Path: <local@localhost.com> MIME-Version: 1.0 Delivered-To: to@localhost.com From: User From <fromUser@localhost.com> Message-ID: <2d0fa16c-4c37-58de-1acc-50b5f6a23a60@localhost.com> To: User To <toUser@linagora.com> Date: Wed, 26 Jul 2017 10:34:02 +0200 Subject: Any subject Content-class: urn:content-classes:calendarmessage Content-Type: text/calendar; method=REPLY; charset=UTF-8 Content-transfer-encoding: 8BIT BEGIN:VCALENDAR PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN VERSION:2.0 METHOD:REPLY BEGIN:VEVENT CREATED:20170726T081145Z LAST-MODIFIED:20170726T083402Z DTSTAMP:20170726T083402Z UID:f1514f44bf39311568d6407249cb76c48103fcd1fb398c3c501cb72b2d293f36e04 b2aab16e43439a608f28671ab7c10e754cbc85ddee4a07fa8cf8f4f7af05bfb502b8f6 SUMMARY:[A CONFIRMER] Call OVH PRIORITY:5 ORGANIZER;CN=User;X-OBM-ID=id:mailto:userTo@localhost.com ATTENDEE;CN=User;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL;X-OBM-ID=810: mailto:user1To@linagora.com DTSTART:20170727T130000Z DURATION:PT1H TRANSP:OPAQUE SEQUENCE:2 X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for X property. Rem oving entire property: CLASS:PUBLIC X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:uuid_value LOCATION:01.78.14.42.61 / 1586 X-OBM-ALERT;X-OBM-ID=486:600 END:VEVENT END:VCALENDAR ===================================================== == File: server/protocols/protocols-smtp/src/test/resources/smtpserver-requireTls.xml ===================================================== <smtpserver enabled="true"> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <announce>forUnauthorizedAddresses</announce> <requireSSL>false</requireSSL> </auth> <verifyIdentity>true</verifyIdentity> <smtpGreeting>Apache JAMES awesome SMTP Server</smtpGreeting> <handlerchain> <handler class="org.apache.james.smtpserver.tls.SmtpRequireTlsEhloHook"/> <handler class="org.apache.james.smtpserver.tls.SmtpRequireTlsParameterHook"/> <handler class="org.apache.james.smtpserver.tls.SmtpRequireTlsMessageHook"/> <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/> </handlerchain> <gracefulShutdown>false</gracefulShutdown> </smtpserver> ===================================================== == File: server/protocols/protocols-smtp/src/test/resources/log4j.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration> <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%-11t] [%-50c{4}] %L %m%n" /> </layout> </appender> <logger name="james" additivity="false"> <level value="info"></level> <appender-ref ref="stdout" /> </logger> <logger name="org.apache.james" additivity="false"> <level value="info"></level> <appender-ref ref="stdout" /> </logger> <root> <priority value="info" /> <appender-ref ref="stdout" /> </root> </log4j:configuration> ===================================================== == File: server/protocols/protocols-smtp/src/test/resources/smtpserver-advancedSecurity.xml ===================================================== <smtpserver enabled="true"> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <announce>always</announce> <requireSSL>true</requireSSL> <plainAuthEnabled>false</plainAuthEnabled> <!--OIDC path will be add dynamically in Tests--> </auth> <verifyIdentity>true</verifyIdentity> <smtpGreeting>Apache JAMES awesome SMTP Server</smtpGreeting> <handlerchain> <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/> </handlerchain> <gracefulShutdown>false</gracefulShutdown> </smtpserver> ===================================================== == File: server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java ===================================================== ===================================================== == File: server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/pom.xml ===================================================== ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerTLSDefaultAuth.xml ===================================================== <testserver enabled="true"> <tls socketTLS="true" startTLS="false"> <keystore>file://conf/keystore</keystore> <keystoreType>JKS</keystoreType> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> <clientAuth/> </tls> </testserver> ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerDisabled.xml ===================================================== <testserver enabled="false"> </testserver> ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerStartTLS.xml ===================================================== <testserver enabled="true"> <tls socketTLS="false" startTLS="true"> <keystore>file://conf/keystore</keystore> <keystoreType>JKS</keystoreType> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> </testserver> ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerTLSNeedAuth.xml ===================================================== <testserver enabled="true"> <tls socketTLS="true" startTLS="false"> <keystore>file://conf/keystore</keystore> <keystoreType>JKS</keystoreType> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> <clientAuth> <truststore>file://conf/truststore</truststore> <truststoreType>JKS</truststoreType> <truststoreSecret>james72laBalle</truststoreSecret> </clientAuth> </tls> </testserver> ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerDefaults.xml ===================================================== <testserver enabled="true"> </testserver> ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerPlain.xml ===================================================== <testserver enabled="true"> <jmxName>testserver-custom</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>150</connectionBacklog> <connectiontimeout>360</connectiontimeout> <connectionLimit>100</connectionLimit> <connectionLimitPerIP>5</connectionLimitPerIP> <helloName autodetect="false">custom-mailer</helloName> </testserver> ===================================================== == File: server/protocols/protocols-library/src/test/resources/testServerTLS.xml ===================================================== <testserver enabled="true"> <tls socketTLS="true" startTLS="false"> <keystore>file://conf/keystore</keystore> <keystoreType>JKS</keystoreType> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> </testserver> ===================================================== == File: server/protocols/protocols-managesieve/pom.xml ===================================================== <?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.james</groupId> <artifactId>james-server</artifactId> <version>3.9.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <artifactId>james-server-protocols-managesieve</artifactId> <name>Apache James :: Server :: ManageSieve</name> <dependencies> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-filesystem-api</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-protocols-library</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-util</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>testing-base</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>${james.protocols.groupId}</groupId> <artifactId>protocols-managesieve</artifactId> </dependency> <dependency> <groupId>${james.protocols.groupId}</groupId> <artifactId>protocols-netty</artifactId> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-handler</artifactId> </dependency> <dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> </dependency> <dependency> <groupId>jakarta.inject</groupId> ===================================================== == File: server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/resources/eml/emailWithOnlyAttachment.eml ===================================================== Return-Path: <abc@apache.org> Subject: 29989 btellier From: <any@mail.com> Content-Disposition: attachment MIME-Version: 1.0 Date: Sun, 02 Apr 2017 22:09:04 -0000 Content-Type: application/zip; name="9559333830.zip" To: <abc@apache.org> Message-ID: <149117094410.10639.6001033367375624@any.com> Content-Transfer-Encoding: base64 UEsDBBQAAgAIAEQeg0oN2YT/EAsAAMsWAAAIABwAMjIwODUuanNVVAkAAxBy4VgQcuFYdXgLAAEE AAAAAAQAAAAApZhbi1zHFYWfY/B/MP3i7kwj1/2CokAwBPIQ+sGPkgJ1tURkdeiMbYzQf8+3q8+M ZmQllgn2aHrqnNq1L2uvtavnj2/b7evz26/Op5M6q/P+8OUX77784g8/lQtLisXTU/68vfzCv/Lg D9vqs/3b8fNXf92273ey4XTCykk9w9LpfD7tX+zGzU83b8pPg39uBr/Kmxe7w9PLuP3xwpFKTJ32 AAEEAAAAAAQAAAAAUEsFBgAAAAABAAEATgAAAFILAAAAAA== ===================================================== == File: server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/resources/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/jwt_publickey ===================================================== -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh 16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi +d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+ GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6 U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj kwIDAQAB -----END PUBLIC KEY----- ===================================================== == File: server/protocols/webadmin-integration-test/postgres-webadmin-integration-test/src/test/resources/eml/emailWithOnlyAttachment.eml ===================================================== Return-Path: <abc@apache.org> Subject: 29989 btellier From: <any@mail.com> Content-Disposition: attachment MIME-Version: 1.0 Date: Sun, 02 Apr 2017 22:09:04 -0000 Content-Type: application/zip; name="9559333830.zip" To: <abc@apache.org> Message-ID: <149117094410.10639.6001033367375624@any.com> Content-Transfer-Encoding: base64 UEsDBBQAAgAIAEQeg0oN2YT/EAsAAMsWAAAIABwAMjIwODUuanNVVAkAAxBy4VgQcuFYdXgLAAEE AAAAAAQAAAAApZhbi1zHFYWfY/B/MP3i7kwj1/2CokAwBPIQ+sGPkgJ1tURkdeiMbYzQf8+3q8+M ZmQllgn2aHrqnNq1L2uvtavnj2/b7evz26/Op5M6q/P+8OUX77784g8/lQtLisXTU/68vfzCv/Lg D9vqs/3b8fNXf92273ey4XTCykk9w9LpfD7tX+zGzU83b8pPg39uBr/Kmxe7w9PLuP3xwpFKTJ32 AAEEAAAAAAQAAAAAUEsFBgAAAAABAAEATgAAAFILAAAAAA== ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties ===================================================== # Configuration urlPrefix for JMAP routes. url.prefix=http://domain.com websocket.url.prefix=ws://domain.com upload.max.size=20M webpush.maxTimeoutSeconds=10 webpush.maxConnections=10 dynamic.jmap.prefix.resolution.enabled=true ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/resources/rabbitmq.properties ===================================================== uri=amqp://james:james@rabbitmq_host:5672 management.uri=http://james:james@rabbitmq_host:15672/api/ ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/nested.eml ===================================================== Return-Path: <me@linagora.com> Delivered-To: me@linagora.com Content-Type: multipart/mixed; boundary="------------8Z6SfsfcYTjrhgeuagphvHB4" Message-ID: <bb76dd1c-044f-316f-c4aa-12d143256e0f@linagora.com> Date: Wed, 3 May 2023 07:37:27 +0700 MIME-Version: 1.0 References: <ed24d4ad-53c0-48c7-2fc9-39f762e4d98d@linagora.com> Subject: Fwd: test subject To: Me ME <me@linagora.com> From: Me ME <me@linagora.com> In-Reply-To: <ed24d4ad-53c0-48c7-2fc9-39f762e4d98d@linagora.com> X-Forwarded-Message-Id: <ed24d4ad-53c0-48c7-2fc9-39f762e4d98d@linagora.com> This is a multi-part message in MIME format. --------------8Z6SfsfcYTjrhgeuagphvHB4 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit CF the attachment --------------8Z6SfsfcYTjrhgeuagphvHB4 Content-Type: message/rfc822; name="test subject.eml" Content-Disposition: attachment; filename="test subject.eml" Content-Transfer-Encoding: 7bit Return-Path: <me@linagora.com> Delivered-To: me@linagora.com Content-Type: multipart/mixed; boundary="------------F6Ykx4Sf21a3Ovh9U5C4q1Qb" Message-ID: <ed24d4ad-53c0-48c7-2fc9-39f762e4d98d@linagora.com> Date: Wed, 3 May 2023 07:36:49 +0700 MIME-Version: 1.0 To: Me ME <me@linagora.com> From: Me ME <me@linagora.com> Subject: test subject This is a multi-part message in MIME format. --------------F6Ykx4Sf21a3Ovh9U5C4q1Qb Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit test body --------------F6Ykx4Sf21a3Ovh9U5C4q1Qb Content-Type: text/plain; charset=UTF-8; name="whatever.txt" Content-Disposition: attachment; filename="whatever.txt" Content-Transfer-Encoding: base64 dGVzdCBhdHRhY2htZW50Cg== --------------F6Ykx4Sf21a3Ovh9U5C4q1Qb-- ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/inlined-single-attachment.eml ===================================================== Date: Wed, 26 Jan 2022 12:21:37 +0100 From: Bob <bob@domain.tld> To: Alice <alice@domain.tld> Subject: My subject Message-ID: <20220126112137.wookj26xellphlam@W0248292> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="7f4cfz6rtfqdbqxn" Content-Disposition: inline Content-Transfer-Encoding: 8bit --7f4cfz6rtfqdbqxn Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Main test message... --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="yyy.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_complex.eml ===================================================== Return-Path: <tungexplorer@linagora.com> X-JAMES-MDN-JMAP-MESSAGE-ID: 49c73510-9108-11eb-a5a7-11eb7059e7ef Delivered-To: magiclan@linagora.com MIME-Version: 1.0 Content-Type: multipart/report; report-type=disposition-notification; boundary="-=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=-" To: magiclan@linagora.com X-LINAGORA-Copy-Delivery-Done: 1 From: tungexplorer@linagora.com Subject: Read: test Date: Tue, 30 Mar 2021 03:31:50 +0000 Message-ID: <Mime4j.f.9089aa43e656a14b.1788130035c@linagora.com> ---=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=- Content-Type: text/plain; charset=UTF-8 To: magiclan@linagora.com Subject: test Message was displayed on Tue Mar 30 2021 10:31:50 GMT+0700 (Indochina Time) ---=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=- Content-Type: message/disposition-notification; charset=UTF-8 Reporting-UA: OpenPaaS Unified Inbox; UA_Product Original-Recipient: rfc822; tungexplorer@linagora.com Final-Recipient: rfc822; tungexplorer@linagora.com Original-Message-ID: <633c6811-f897-ec7c-642a-2360366e1b93@linagora.com> Disposition: manual-action/MDN-sent-manually;displayed Error: Message1 Error: Message2 X-OPENPAAS-IP: 177.177.177.77 X-OPENPAAS-PORT: 8000 ---=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=- Content-Type: message/rfc822 Subject: test To: magiclan@linagora.com Content-Type: text/plain This is content of original message, that already on third bodypart ---=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=- ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/related_in_alternative_multipart.eml ===================================================== Return-Path: <from@linagora.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----sinikael-?=_1-16049770230370.5904051543231188" This is a multi-part message in MIME format. ------sinikael-?=_1-16049770230370.5904051543231188 Content-Type: multipart/alternative; boundary="----sinikael-?=_2-16049770230370.5904051543231188" ------sinikael-?=_2-16049770230370.5904051543231188 Content-Type: multipart/related; type="text/html"; boundary="----sinikael-?=_3-16049770230370.5904051543231188" ------sinikael-?=_3-16049770230370.5904051543231188 Content-Type: text/html Content-Transfer-Encoding: base64 PHRhYmxlPjwvdGFibGU+ ------sinikael-?=_3-16049770230370.5904051543231188-- ------sinikael-?=_2-16049770230370.5904051543231188 Content-Type: text/calendar; charset=UTF-8; method=CANCEL Content-Transfer-Encoding: base64 QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KUFJPRElEOi0vL1NhYnJlLy9TYWJyZSBWT2Jq ZWN0IDQuMS4zLy9FTg0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6Q0FOQ0VMDQpCRUdJTjpW VElNRVpPTkUNClRaSUQ6QXNpYS9KYWthcnRhDQpCRUdJTjpTVEFOREFSRA0KVFpPRkZTRVRGUk9N OiswNzAwDQpUWk9GRlNFVFRPOiswNzAwDQpUWk5BTUU6V0lCDQpEVFNUQVJUOjE5NzAwMTAxVDAw MDAwMA0KRU5EOlNUQU5EQVJEDQpFTkQ6VlRJTUVaT05FDQpCRUdJTjpWRVZFTlQNClVJRDpkYTdj MzljNS0xNzg3LTQ0MDktYjAwNS05MjBmZTBiMmMxYTINCkRUU1RBTVA6MjAyMDExMTBUMDI1NzAx Wg0KU0VRVUVOQ0U6MQ0KU1VNTUFSWTo8QVQ+IFZlcmlmeSBVc2VyIFNlbmQgRW1haWwgVG8gQXR0 ZW5kZWVzIFR1ZSBOb3ZlbWJlciAxMCAwOTo1MjoxMiBVDQogVEMgMjAyMA0KRFRTVEFSVDoyMDIw MTIwNlQwMzAwMDBaDQpEVEVORDoyMDIwMTIwNlQwNDAwMDBaDQpPUkdBTklaRVI7Q049VXNlciBB Om1haWx0bzp1c2VyYUBxYS5vcGVuLXBhYXMub3JnDQpBVFRFTkRFRTtDTj06bWFpbHRvOnVzZXJk QHFhLm9wZW4tcGFhcy5vcmcNCkVORDpWRVZFTlQNCkVORDpWQ0FMRU5EQVINCg== ------sinikael-?=_2-16049770230370.5904051543231188-- ------sinikael-?=_1-16049770230370.5904051543231188 Content-Type: application/ics; name=meeting.ics Content-Disposition: attachment; filename=meeting.ics Content-Transfer-Encoding: base64 QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KUFJPRElEOi0vL1NhYnJlLy9TYWJyZSBWT2Jq ZWN0IDQuMS4zLy9FTg0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6Q0FOQ0VMDQpCRUdJTjpW VElNRVpPTkUNClRaSUQ6QXNpYS9KYWthcnRhDQpCRUdJTjpTVEFOREFSRA0KVFpPRkZTRVRGUk9N OiswNzAwDQpUWk9GRlNFVFRPOiswNzAwDQpUWk5BTUU6V0lCDQpEVFNUQVJUOjE5NzAwMTAxVDAw MDAwMA0KRU5EOlNUQU5EQVJEDQpFTkQ6VlRJTUVaT05FDQpCRUdJTjpWRVZFTlQNClVJRDpkYTdj MzljNS0xNzg3LTQ0MDktYjAwNS05MjBmZTBiMmMxYTINCkRUU1RBTVA6MjAyMDExMTBUMDI1NzAx Wg0KU0VRVUVOQ0U6MQ0KU1VNTUFSWTo8QVQ+IFZlcmlmeSBVc2VyIFNlbmQgRW1haWwgVG8gQXR0 ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/alternative.cal.eml ===================================================== Return-Path: <j@linagora.com> MIME-version: 1.0 X-LINAGORA-Copy-Delivery-Done: 1 From: J <j@linagora.com> Message-ID: <00ecbe90-cdbc-7222-75c4-0e297c5a8eef@linagora.com> To: B <b@linagora.com> Date: Thu, 14 Oct 2021 16:04:30 +0200 Subject: A little explanation Content-type: multipart/mixed; boundary="Boundary_(ID_qyG4ZdjoAsiZ+Jo19dCbWQ)" --Boundary_(ID_qyG4ZdjoAsiZ+Jo19dCbWQ) Content-type: multipart/alternative; boundary="Boundary_(ID_ryU4ZdJoASiZ+Jo21dCbwA)" --Boundary_(ID_ryU4ZdJoASiZ+Jo21dCbwA) Content-type: text/plain; charset=UTF-8 Content-transfer-encoding: 8BIT J <j@linagora.com> a accepté votre invitation. --Boundary_(ID_ryU4ZdJoASiZ+Jo21dCbwA) Content-type: text/calendar; method=REPLY; charset=UTF-8 Content-transfer-encoding: 8BIT BEGIN:VCALENDAR VERSION:2.0 METHOD:REPLY BEGIN:VTIMEZONE END:VTIMEZONE BEGIN:VEVENT UID:08985ae5-8e62-4f3e-971d-27c8b40cf838 END:VEVENT END:VCALENDAR --Boundary_(ID_ryU4ZdJoASiZ+Jo21dCbwA)-- --Boundary_(ID_qyG4ZdjoAsiZ+Jo19dCbWQ) Content-type: application/ics; name=invite.ics Content-transfer-encoding: 8BIT Content-disposition: attachment; filename=invite.ics BEGIN:VCALENDAR VERSION:2.0 METHOD:REPLY BEGIN:VTIMEZONE END:VTIMEZONE BEGIN:VEVENT UID:08985ae5-8e62-4f3e-971d-27c8b40cf838 ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/html.eml ===================================================== Return-Path: <from@linagora.com> To: to@linagora.com From: Lina <from@linagora.com> Subject: MultiAttachment Message-ID: <13d4375e-a4a9-f613-06a1-7e8cb1e0ea93@linagora.com> Date: Mon, 27 Feb 2017 11:24:48 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------64D8D789FC30153D6ED18258" This is a multi-part message in MIME format. --------------64D8D789FC30153D6ED18258 Content-Type: text/html; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit <p>Send<br/>concerted from html</p> --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=UTF-8; name="text1" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="text1" LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBeDdQRzAr RS8vRU1wbTdJZ0k1UTlUTURTRnlhLzFoRSt2dlRKcmswaUdGbGxQZUhMCkE1L1ZsVE0wWVdn RzZYNTBxaU1mRTNWTGF6ZjJjMTlpWHJUMG1xLzIxUFoxd0Zub2d2NHp4VU5haWgrQm5nNjIK RjBTeXJ1RS9PL05qcXhoL0NjcTZLL2UwNVRWNFQ2NDNVU3hBZUcwS3BwbVlXOXg4SEEvR3ZW ODMyYXBadXhrVgppNk5Wa0RCcmZ6YVVDd3U0ekgrSHdPdi9wSTg3RTdLY2NIWUMrK0JpYWoz Cg== --------------64D8D789FC30153D6ED18258 Content-Type: application/vnd.ms-publisher; name="text2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="text2" c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFESHM4YlQ0VC84UXltYnNp QWpsRDFNd05JWEpyL1dFVDYrOU1tdVRTSVlXV1U5NGNzRG45V1ZNelJoYUFicGZuU3FJeDhU ZFV0ck4vWnpYMkpldFBTYXIvYlU5blhBV2VpQy9qUEZRMXFLSDRHZURyWVhSTEt1NFQ4Nzgy T3JHSDhKeXJvcjk3VGxOWGhQcmpkUkxFQjRiUXFtbVpoYjNId2NEOGE5WHpmWnFsbTdHUldM bzFXUU1HdC9OcFFMQzdqTWY0ZkE2LytranpzVHNweHdkZ0w3NEdKcVBmT1hPaXdnTEhYOENa Ni81UnlUcWhUNnBEM01rdFNOV2F6L3pJSFBORXFmNUJZOUNCTTFURlI1dys2TURIbzBnbWlJ c1hGRUpUUG5maEJ2SERoU2pCMVJJMEt4VUNseVlySjRmQmxVVmVLZm5hd29WY3U3WXZDcUY0 RjUgcXV5bmhubkBsaW5hZ29yYQo= --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=UTF-8; ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/inlined-mixed.eml ===================================================== Date: Wed, 26 Jan 2022 12:21:37 +0100 From: Bob <bob@domain.tld> To: Alice <alice@domain.tld> Subject: My subject Message-ID: <20220126112137.wookj26xellphlam@W0248292> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="7f4cfz6rtfqdbqxn" Content-Disposition: inline Content-Transfer-Encoding: 8bit --7f4cfz6rtfqdbqxn Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Main test message... --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="yyy.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="xxx.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn-- ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/multipart_simple.eml ===================================================== Return-Path: <from@linagora.com> To: to@linagora.com From: Lina <from@linagora.com> Subject: MultiAttachment Message-ID: <13d4375e-a4a9-f613-06a1-7e8cb1e0ea93@linagora.com> Date: Mon, 27 Feb 2017 11:24:48 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------64D8D789FC30153D6ED18258" This is a multi-part message in MIME format. --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Send --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=UTF-8; name="text1" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="text1" LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBeDdQRzAr RS8vRU1wbTdJZ0k1UTlUTURTRnlhLzFoRSt2dlRKcmswaUdGbGxQZUhMCkE1L1ZsVE0wWVdn RzZYNTBxaU1mRTNWTGF6ZjJjMTlpWHJUMG1xLzIxUFoxd0Zub2d2NHp4VU5haWgrQm5nNjIK RjBTeXJ1RS9PL05qcXhoL0NjcTZLL2UwNVRWNFQ2NDNVU3hBZUcwS3BwbVlXOXg4SEEvR3ZW ODMyYXBadXhrVgppNk5Wa0RCcmZ6YVVDd3U0ekgrSHdPdi9wSTg3RTdLY2NIWUMrK0JpYWoz Cg== --------------64D8D789FC30153D6ED18258 Content-Type: application/vnd.ms-publisher; name="text2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="text2" c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFESHM4YlQ0VC84UXltYnNp QWpsRDFNd05JWEpyL1dFVDYrOU1tdVRTSVlXV1U5NGNzRG45V1ZNelJoYUFicGZuU3FJeDhU ZFV0ck4vWnpYMkpldFBTYXIvYlU5blhBV2VpQy9qUEZRMXFLSDRHZURyWVhSTEt1NFQ4Nzgy T3JHSDhKeXJvcjk3VGxOWGhQcmpkUkxFQjRiUXFtbVpoYjNId2NEOGE5WHpmWnFsbTdHUldM bzFXUU1HdC9OcFFMQzdqTWY0ZkE2LytranpzVHNweHdkZ0w3NEdKcVBmT1hPaXdnTEhYOENa Ni81UnlUcWhUNnBEM01rdFNOV2F6L3pJSFBORXFmNUJZOUNCTTFURlI1dys2TURIbzBnbWlJ c1hGRUpUUG5maEJ2SERoU2pCMVJJMEt4VUNseVlySjRmQmxVVmVLZm5hd29WY3U3WXZDcUY0 RjUgcXV5bmhubkBsaW5hZ29yYQo= --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=UTF-8; ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_simple.eml ===================================================== Return-Path: <tungexplorer@linagora.com> X-JAMES-MDN-JMAP-MESSAGE-ID: 49c73510-9108-11eb-a5a7-11eb7059e7ef Delivered-To: magiclan@linagora.com MIME-Version: 1.0 Content-Type: multipart/report; report-type=disposition-notification; boundary="-=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=-" To: magiclan@linagora.com X-LINAGORA-Copy-Delivery-Done: 1 From: tungexplorer@linagora.com Subject: Read: test Date: Tue, 30 Mar 2021 03:31:50 +0000 Message-ID: <Mime4j.f.9089aa43e656a14b.1788130035c@linagora.com> ---=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=- Content-Type: text/plain; charset=UTF-8 This is simple body of human-readable part ---=Part.e.fbba3f3ef449cf21.1788130035a.be0dce94fc2486bf=- Content-Type: message/disposition-notification; charset=UTF-8 Final-Recipient: rfc822; tungexplorer@linagora.com Disposition: manual-action/MDN-sent-manually;displayed ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/multipart_complex.eml ===================================================== Date: Tue, 03 Jan 2017 16:05:01 +0100 From: sender <sender@james.org> MIME-Version: 1.0 To: David DOLCIMASCOLO <david.ddo@linagora.com> Subject: Re: [Internet] Rendez-vous References: <9b6a4271-69fb-217a-5c14-c68c68375d96@linagora.com> In-Reply-To: <d5c6f1d6-96e7-8172-9fe6-41fa6c9bd6ec@linagora.com> X-Gie-Attachments: none Cc: Content-type: multipart/mixed; boundary="----------=_1483455916-7086-3" This is a multi-part message in MIME format... ------------=_1483455916-7086-3 Content-Type: multipart/alternative; boundary="------------060506070600060108040700" This is a multi-part message in MIME format. --------------060506070600060108040700 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit /blabla/ *bloblo* --------------060506070600060108040700 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit <i>blabla</i> <b>bloblo</b> --------------060506070600060108040700-- ------------=_1483455916-7086-3 Content-ID: <14672787885774e5c4d4cee471352039@linagora.com> Content-Type: text/plain; charset="iso-8859-1"; name="avertissement.txt" Content-Disposition: inline; filename="avertissement.txt" Content-Transfer-Encoding: binary inline attachment ------------=_1483455916-7086-3-- ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/mdn_relate_original_message.eml ===================================================== Return-Path: <return.path@james.apache.org> Mailing-List: contact contact1@james.apache.org; run by ABC Message-ID: <messageId1@Atlassian.JIRA> In-Reply-To: <JIRA.12781874.1426269127000@Atlassian.JIRA> References: <JIRA.12781874.1426269127000@Atlassian.JIRA> <JIRA.12781874.1426269127444@arcas> Subject: This is subject of original message that mdn has been related MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 ---------------------------------- This is body content --------------------------------------------------------------------- To unsubscribe, e-mail: server1@james.apache.org ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/html_body.eml ===================================================== Return-Path: <hmavu@example.com> org.apache.james.rspamd.flag: NO org.apache.james.rspamd.status: No, actions=no action score=0.0 requiredScore=15.0 Delivered-To: dphamhoang@example.com Received: from 172.17.0.1 (EHLO incoming.example.com) ([172.17.0.1]) by incoming.example.com (JAMES SMTP Server ) with ESMTP ID c8ca0690; Wed, 10 May 2022 03:16:53 +0000 (UTC) Received: from smtp.example.com (smtp.example.com [54.36.8.78]) by incoming.example.com (Postfix) with ESMTPS id 48A1C9C401; Wed, 10 May 2022 03:16:53 +0000 (UTC) Received: from ?Open?PaaS?SMTP?server?for?example? (unknown [51.83.109.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.example.com (Postfix) with ESMTPSA id 0F0B73EE62; Wed, 10 May 2022 05:16:54 +0200 (CEST) DKIM-Signature: a=rsa-sha256; b=clyJAm7d7I1D+H1Q9461DlJT10TYuocQAkK0z1ybeYYKqrjax6BjH3t+Cxkq/B1qt5hibD6Hg9rSVKMn6nG8ye3ghzYSGJg5CYNl/ozEWIUM976+JVpf2qDmTlukRzs25GAESKeBt0UTmsn6lusiXtf0kR5hWr0j8ryT5Z8UpzaaLlnMtWBXvx3mQzVltj7OTyd4mx8JRiZE5bV65dS1S0SZOmp9iCEq9+vNQaL3M3m6N7s1xGV2J5Htz7tRVy3NWczJdDVtRHY0u3xJNetYjSVbzxCsciqPy+xSFYj1DHyPMVqVjLGxALBpJ953qFBZi4d17D9BfRONbg6yCmbxkg==; s=smtpoutjames; d=example.com; v=1; bh=A/3l3MmJvs/qsqAqSuiuPhfTOrrap3TVn5YAOKn155E=; h=from : reply-to : subject : date : to : cc : resent-date : resent-from : resent-sender : resent-to : resent-cc : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-example-Copy-Delivery-Done: 1 From: Ha Minh Anh VU <hmavu@example.com> Sender: Ha Minh Anh VU <hmavu@example.com> Reply-To: hmavu@example.com To: Anton SHEPILOV <ashepilov@example.com> Cc: Dat PHAM HOANG <dphamhoang@example.com>, The Dat VU <tdvu@example.com>, VN HR <vnhr@example.com>, =?ISO-8859-1?Q?Beno=EEt_TELLIER?= <btellier@example.com> Subject: Re: Cong hoa Xa Hoi Chu Nghia Viet Nam Message-ID: <Mime4j.7a.a9c00d8d7ab83180.18803a95977@example.com> Date: Wed, 10 May 2022 03:16:50 +0000 References: <Mime4j.671.1acd13bc529da6f9.187fa2ec03e@example.com> <Mime4j.49.89784d872ecab223.1880019b684@example.com> <p>Dear Anton, </p><p>Can we arrange an interview for you and XXXXXXXXXXXX = XXXXXXXXXXXX Developer at 04 p=2Em (Paris Time) on this Thursday (11/05/202= 3)?</p><p>If you are not available at that time, kindly suggest us your ava= ilable time</p><p>Thank you & Best regards,</p><div class=3D"openpaas-s= ignature">-- <p><span style=3D"color:rgb(51, 51, 51);">Vu Ha Minh Anh (Ms)= </span><br style=3D"color:rgb(51, 51, 51);"><span style=3D"color:rgb(= 51, 51, 51);">HR Department </span><br style=3D"color:rgb(51, 51, 51);= "><font color=3D"#9c0000"><b>example VIETNAM</b></font><br style=3D"color:= rgb(51, 51, 51);"><span style=3D"color:rgb(51, 51, 51);">5 Dien Bien Phu St= r=2E, Ba Dinh Dist=2E, Ha Noi</span><br style=3D"color:rgb(51, 51, 51);"><s= pan style=3D"color:rgb(51, 51, 51);">(+84) 901735987 </span><br style= =3D"color:rgb(51, 51, 51);"><font color=3D"#424242">https://example=2Evn</= font><br></p></div><cite>On May 10, 2023 6:35 AM, from gagagagagaga@example= =2Ecom</cite><blockquote>Hi Anton, <div><br></div><div>Because at that= time, before the barcamp, we was considering about the Matrix, about organ= ization, =E2=80=A6 so we postponed the process=2E </div><div>At the mo= ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/alternative.eml ===================================================== Return-Path: <from@linagora.com> To: to@linagora.com From: Lina <from@linagora.com> Subject: MultiAttachment Message-ID: <13d4375e-a4a9-f613-06a1-7e8cb1e0ea93@linagora.com> Date: Mon, 27 Feb 2017 11:24:48 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------64D8D789FC30153D6ED18258" This is a multi-part message in MIME format. --------------64D8D789FC30153D6ED18258 Content-Type: text/html; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit <p>Send<br/>concerted from html</p> --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=UTF-8; name="text1" Content-Transfer-Encoding: 7bit I am the text plain part! --------------64D8D789FC30153D6ED18258 ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/resources/eml/nested2.eml ===================================================== Content-Type: multipart/mixed; boundary="------------6a0Tq7Y8z9M0dIG10PnZ7l7E" Message-ID: <b3493b24-116a-4d6b-a61c-1a3b09e44619@linagora.com> Date: Wed, 21 Feb 2024 22:58:55 +0100 MIME-Version: 1.0 References: <Mime4j.8f3.69abfdd624c15c44.18dcdad3859@linagora.com> Subject: Fwd: Will be nested To: btellier@linagora.com From: "btellier@linagora.com" <btellier@linagora.com> In-Reply-To: <Mime4j.8f3.69abfdd624c15c44.18dcdad3859@linagora.com> X-Forwarded-Message-Id: <Mime4j.8f3.69abfdd624c15c44.18dcdad3859@linagora.com> This is a multi-part message in MIME format. --------------6a0Tq7Y8z9M0dIG10PnZ7l7E Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit --------------6a0Tq7Y8z9M0dIG10PnZ7l7E Content-Type: message/rfc822; name="Will be nested.eml" Content-Disposition: attachment; filename="Will be nested.eml" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 Subject: Will be nested From: Benoit TELLIER <bxxxx@linagora.com> To: =?ISO-8859-1?Q?Beno=EEt_TELLIER?= <bxxxx@linagora.com> Reply-To: btellier@linagora.com Date: Wed, 21 Feb 2024 21:58:17 +0000 Message-ID: <Mime4j.8f3.69abfdd624c15c44.18dcdad3859@linagora.com> Content-Type: multipart/mixed; boundary="-=Part.8f5.4ee8b8343a133e4f.18dcdad38b0.f1b9fcef27eb8231=-" ---=Part.8f5.4ee8b8343a133e4f.18dcdad38b0.f1b9fcef27eb8231=- Content-Type: multipart/alternative; boundary="-=Part.8f4.9ab3439f1c0c1361.18dcdad38b0.b6d054e4dd1744c7=-" ---=Part.8f4.9ab3439f1c0c1361.18dcdad38b0.b6d054e4dd1744c7=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Nested body --=C2=A0 Best regards, Benoit TELLIER ---=Part.8f4.9ab3439f1c0c1361.18dcdad38b0.b6d054e4dd1744c7=- Content-Type: text/html; charset=UTF-8 ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties ===================================================== # Configuration urlPrefix for JMAP routes. url.prefix=http://domain.com websocket.url.prefix=ws://domain.com upload.max.size=20M webpush.maxTimeoutSeconds=10 webpush.maxConnections=10 dynamic.jmap.prefix.resolution.enabled=true ===================================================== == File: server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/resources/jmap.properties ===================================================== # Configuration urlPrefix for JMAP routes. url.prefix=http://domain.com websocket.url.prefix=ws://domain.com upload.max.size=20M dynamic.jmap.prefix.resolution.enabled=true ===================================================== == File: server/protocols/protocols-pop3/src/test/resources/pop3server.xml ===================================================== <?xml version="1.0"?> <pop3server enabled="true"> <jmxName>pop3server</jmxName> <bind>127.0.0.1:0</bind> <helloName>myMailServer</helloName> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <connectiontimeout>3600</connectiontimeout> <handlerchain> <handler class="org.apache.james.pop3server.core.CoreCmdHandlerLoader"/> </handlerchain> <gracefulShutdown>false</gracefulShutdown> </pop3server> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslJKSNotFound.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.notfound.jks</keystore> <keystoreType>JKS</keystoreType> <secret>123456</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPEM.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <privateKey>private.key</privateKey> <certificates>certs.self-signed.csr</certificates> <secret>123456</secret> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthAllowed.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSSLCompress.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="true" startTLS="false"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <plainAuthDisallowed>false</plainAuthDisallowed> <compress>true</compress> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslDefaultJKS.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.jks</keystore> <secret>123456</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthEnabledWithoutRequireSSL.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> </auth> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/oauth.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <privateKey>private.key</privateKey> <certificates>certs.self-signed.csr</certificates> <secret>123456</secret> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> <requireSSL>true</requireSSL> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsTrueAndStartSSLIsFalse.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="false"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> <requireSSL>true</requireSSL> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthDisabled.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <plainAuthEnabled>false</plainAuthEnabled> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMBadPass.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <privateKey>private.key</privateKey> <certificates>certs.self-signed.csr</certificates> <secret>badbad</secret> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerProxy.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>65536</inMemorySizeLimit> <!-- 64 KB --> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> <proxyRequired>true</proxyRequired> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.p12</keystore> <keystoreType>PKCS12</keystoreType> <secret>123456</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSSL.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="true" startTLS="false"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMNoPass.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <privateKey>private.nopass.key</privateKey> <certificates>certs.self-signed.csr</certificates> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerCompress.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <compress>true</compress> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>65536</inMemorySizeLimit> <!-- 64 KB --> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerImapConnectCheck.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> <additionalConnectionChecks>org.apache.james.imapserver.netty.IpConnectionCheck</additionalConnectionChecks> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/private.nopass.key ===================================================== -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAsjjah2w8AKpnGKya4QG/tdRoR9pJkKWfyf17ywcYWBxcpj0Q +dkn+CXvBafhQ2zlf+bPkWxYhBuXyMB8QNCp/sMlaQ8dGFw/LGojglHk8T4aIu+a Ffy0hgN9yniuEHmFdjP2XECbA7UbHQPZTO/DU3QJ0FabqKO61pHB4bliNsTWGjzg seU5kdS1Uup0AK/URO2pSLpnDPV/l0yNmxvGfO/ulPNVJyxiJuT+Rl51LlxpWhu3 G/hFX2mJP0Mn/cX3xNm2HrYIaasglum7bXN/vfiqSFAg46LgT7UJ4pCHoLI99K7Z OpgBqK/Q4P4UxOggxkawI+JmVLTmCpz1c6JR3QIDAQABAoIBAEvx7DVfCuahtpMO ImWVkDMUk2di/owz97ZkXRc0K8yIMXbpeM1vGxgkWgmH83b+9YEeQv9OMx4AgBqc 45XfFUGpuMxfE1/pF0Z+6CjFaxDeDNcsUPXjnK2q2TSpXktI7XVkSSwgn63hw+8G T9f4J7ztKq1r6qLfOmPq8rqUe+SoH5tkwmJJgnxx3Qt2xZ4nmFXiuscOcVUjV3D/ EdghjcExNSgxmo8HN34DLQPZrDDwarrYJouiufe7m0Etk8m9bOWkNsoCif0wQ0mS uQVAHMzCKqrUmAM3X1IimTnwOWu2sYle9VXYijwDkZ0PGQnS4rywz9D9MWy57ZLM zklb5MUCgYEA5qrK9PmMGNi6ihhjkDw6b4sqOs4Dec89jdkhhYdrbPVXZzB+Shmh CDhviXhLi7m5G5d707DLPloPR0LdNmf3YsLCvMej70O8DrDG/z1Vv++DF2XcAtvW TLoXOcSS1E3tKRSp2Uks7osWIwUAomhkEIXsDJ+esH9wHD7rOYA02fsCgYEAxcuR Sp0rcVqwyuINEmrvH5zxSWk0O5MqM95kyvElFuPCPAKv0EK9t8T7dv7fEtQoupqa hbDGzatif7B4tVaeWZRYJUrr9uwIyZfVSfYUi5y2KwHGJJPH+EkoQ6sZlRw6Aqj/ AeW4/cnmhK+IrgBDKF99DiVs1nVTgeA0vEneVAcCgYBh9l0VpznJf5nRdkQqiHmk z6ySptWxEMOqj3F+HSIRdyy0hVLNM49BR36PGoizAaBMyIvtPqNCisr8T7hVF9hn mCFOPVcxEUo3zvnkgm79gcHh2P+UMzsTAOFGRma5RZMYJE9yGXK8qFMxcjlvv/fn UIkMX2nsuWKqjEon9Hv9qwKBgFLk760/lVdaVMGSXzwayMCM+6pyhst477TxPXi3 +31OUrbnwVscvXno+iJyynaPp8ocxSnGXmsPqqYtBUmqVY7hVte6QI4peb1S/raS hSXFtarsgWgO7z2lG1TQvlX5kG5Q+R6IcjEajpuJHVUfEwY2jqiBEs4GOcsydad7 pcu9AoGBANHQQS7U1o0Ks2H9iB02b72rq0Lr7d4xJ7bbeL0PdJNxnKWYtYYrNKvu R7wWF6MBH+pfm0CzJo0Pog58wkAiKnD8nPuVUdXgi/3PQXu/ZARY0g30wqubaBeZ UN7bL/TrIc67ldEi07A8Wo6H5Gd6jIHBnmO93an2zXlrvhrvACRX -----END RSA PRIVATE KEY----- ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12MissingPassword.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.p12</keystore> <keystoreType>PKCS12</keystoreType> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServer.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> <concurrentRequests>20</concurrentRequests> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslJKSBadPassword.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.jks</keystore> <keystoreType>JKS</keystoreType> <secret>badbad</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMExtraPass.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <privateKey>private.nopass.key</privateKey> <certificates>certs.self-signed.csr</certificates> <secret>123456</secret> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerNoLimits.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>65536</inMemorySizeLimit> <!-- 64 KB --> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslNoKeys.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapSSL.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="true" startTLS="false"> <privateKey>private.key</privateKey> <certificates>certs.self-signed.csr</certificates> <secret>123456</secret> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> <requireSSL>true</requireSSL> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/private.key ===================================================== -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,5D8E78A6193D484A YaZzaxmoE+/F5WUWlWAsKXY4e+9oSjYDFFcutiFgxK7UOIFnITTK15ri6VrPzh4R /VlXVyxNp37NRLiHKG4t+w7F12Vo8j2V6n+3DInOBRjh2z7rP4k9WTefTX8QoXgT pHXAUf8p3mcooHPhsLk2rQAPmzDXGG7fg9UMoFIVXTvyDi0alLmm8+k2HT0pllIp drhUg5Rknm09JcD/js45r4qkOVLMh8guU5g+M7x1jOf4PzF8CWTJSLpXmXPwwEHI DquwjDbaDN2543qOQZYPtJQ6LBlE1vfybFsy8IsYfcfrf6hkXrBdCTUx9FZgOOiF B9c9gkxWDkZ4Gc2qC7NYebGKsvzg5sKeED/g8ynMCzSQnn6WuhWmsqCmAJR+B0vm DeBioHW4hfbge+qfkRtcivodxFOGhJkMvBQ5nee84XK5ivZRR7YfBdNO9ES7uYgX 1zr7XvkwOW9tZKDHSPfgwWXcNY7oZ9JgIHbDKp6sndeVJDEA/pJzfNSHWmIjWmld r7WTAZPghB+I2H2rPGYTUs1iuenyaZVYMX2RAX23zZEBx/TZSmEKp2dO12G2M0ru LX7ft0gcj7wmT376WnJJ07OG41R041+RAlAr6Im1oUAx7PhPTj21sM8WFsmczip7 RdVBbUCdRd0UjIfd7PjNlut0RFTtctC+oTgD+bOp1jx/UB1bSu/i6JRO52zsggxP T6yRg59a2TzZEoM4gmRKyF5TFIlTDAsRJXStL2v847pA442fA0S6kaa9sFEf9PrT CipSCb/DJeVZxslAOZwKMWG/XK3/L3zZ9ctDvqw+OxSYGKKZHcAdNa/nJTZ7f1W9 aSMWBHViZz3nxsuJ2Q8eVGG5YETtyzqgDJ1R16bfBjDGJvR4fdghJge2Nqhliz4G NeJWqoXdvKobj4CdoGLT6mWlyrmZ/Z9kKKtKm0Oc0MY6MijkKGwJWDjn7ybrsN5h LG2fYoyBly95n+1phxLXxmJMrCBSyhuxIMnXmFEn/0jYDleHRR+lN95ZFWrmXpPC vDSBLxmp03EMqj5BpVXwTA3S3WUOlk5Ao8tgvg8MXvzNbZ5Sgzix9Ms/H+ofK53k YLfpurKZ6rfMF+tbN0cZ4WSYZUJil6vBu03xxJJ2hyGt2b9cupT1ftxewjjBvq4W C4+eI86WRsTxRfVnsBob9Ok+A0IxxR8MNHfQVBFLTm2XgjFKdMku+eqop5nV3m3m iltSEoJlkBmCfBsDvkeueTG3M9Gg96MJ05LZQtmdYcW79R6ynvdVeA/KFJ1I7PbM tmZ5UjyVnbIsEjEw+O++uG7xQWQBqnI4tU6wPqYpJDND4Hsp3CWP5zW0LfFXzzdG e473CQTJRhiyBHUUhE1+RzHNt1GY5mR9DNfwS3nJdL36k9Hnu2mo+Vzif1JLs2pE LjKg62lYSic3g73AlnB02tAsjxRA1Pv2OZjhIMQ3WT+caqpckt1Xvqc4ABS9fT8c 4d3kQ4bcsSoRN7lyO+KPwqGl7YPK8+utih12P8ZUqgxhYuCqpWVf7YxEQVzZqmWO uHx1fpFCbzmDnoIhUQOOMAwxMpDus8huwroycfr67ukzpwxje+6shA== -----END RSA PRIVATE KEY----- ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerHealthCheck.xml ===================================================== <imapservers> <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <maxQueueSize>10</maxQueueSize> <concurrentRequests>1</concurrentRequests> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> <additionalConnectionChecks>org.apache.james.imapserver.netty.IpConnectionCheck</additionalConnectionChecks> </imapserver> <imapserver enabled="true"> <jmxName>imapserver2</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <maxQueueSize>10</maxQueueSize> <concurrentRequests>1</concurrentRequests> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> <additionalConnectionChecks>org.apache.james.imapserver.netty.IpConnectionCheck</additionalConnectionChecks> </imapserver> </imapservers> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerIdCommandResponseFields.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> <idCommandResponse> <field name="name" value="Apache James"/> <field name="version" value="3.9.0"/> </idCommandResponse> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsFalseAndStartSSLIsTrue.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> <requireSSL>false</requireSSL> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsTrueAndStartSSLIsTrue.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> <requireSSL>true</requireSSL> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerPlainAuthDisallowed.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="false"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <plainAuthDisallowed>true</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerStartTLS.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <connectionBacklog>200</connectionBacklog> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <inMemorySizeLimit>64K</inMemorySizeLimit> <literalSizeLimit>128K</literalSizeLimit> <plainAuthDisallowed>false</plainAuthDisallowed> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslJKS.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.jks</keystore> <keystoreType>JKS</keystoreType> <secret>123456</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPEMMissingPass.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <privateKey>private.key</privateKey> <certificates>certs.self-signed.csr</certificates> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/certs.csr ===================================================== -----BEGIN CERTIFICATE REQUEST----- MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBALI42odsPACqZxismuEBv7XUaEfaSZCln8n9e8sH GFgcXKY9EPnZJ/gl7wWn4UNs5X/mz5FsWIQbl8jAfEDQqf7DJWkPHRhcPyxqI4JR 5PE+GiLvmhX8tIYDfcp4rhB5hXYz9lxAmwO1Gx0D2Uzvw1N0CdBWm6ijutaRweG5 YjbE1ho84LHlOZHUtVLqdACv1ETtqUi6Zwz1f5dMjZsbxnzv7pTzVScsYibk/kZe dS5caVobtxv4RV9piT9DJ/3F98TZth62CGmrIJbpu21zf734qkhQIOOi4E+1CeKQ h6CyPfSu2TqYAaiv0OD+FMToIMZGsCPiZlS05gqc9XOiUd0CAwEAAaAAMA0GCSqG SIb3DQEBCwUAA4IBAQCLTucL2oggfXTuGZTHVv1N6U9ZlTh7ikMDex3aCTlZZG1m rT3BJ0Z7QcvJDkUOT0iEgrES6ta61uy2l9BFbfBYgIWJUXaCijid1oaB3YaxFeHb Y8rTGsJQqHPxjy720ZUiNXrOQuF+QA++auHIAzC2t51H6e3EjIrpNqio8IWYhmEH wSpYERm5yQ7WSPcWWXI0GoCSYsOgJeE9VwrlXaTv62UwJKfCJM6dUgieKXxtEHpX eAviSOqU1WJhCQqNJaqtP78Q2g95qMdf7193WigtsMqqgeyT5ewozvQCe8V9Y0H0 zjwS/1kBp50gGs5PWizQJYHra/KVzgIaobgD5u3Z -----END CERTIFICATE REQUEST----- ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/certs.self-signed.csr ===================================================== -----BEGIN CERTIFICATE----- MIIDETCCAfkCFEng6ISWvEq/JkD8u64MA+x2VhS/MA0GCSqGSIb3DQEBCwUAMEUx CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjEwODMwMDQwMzIwWhcNMjIwODMwMDQw MzIwWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAsjjah2w8AKpnGKya4QG/tdRoR9pJkKWfyf17ywcYWBxcpj0Q +dkn+CXvBafhQ2zlf+bPkWxYhBuXyMB8QNCp/sMlaQ8dGFw/LGojglHk8T4aIu+a Ffy0hgN9yniuEHmFdjP2XECbA7UbHQPZTO/DU3QJ0FabqKO61pHB4bliNsTWGjzg seU5kdS1Uup0AK/URO2pSLpnDPV/l0yNmxvGfO/ulPNVJyxiJuT+Rl51LlxpWhu3 G/hFX2mJP0Mn/cX3xNm2HrYIaasglum7bXN/vfiqSFAg46LgT7UJ4pCHoLI99K7Z OpgBqK/Q4P4UxOggxkawI+JmVLTmCpz1c6JR3QIDAQABMA0GCSqGSIb3DQEBCwUA A4IBAQAzSrClRytVW1fzL1rXMw7rYVoyoQ6ar3+e/SYiy5p+uSlEda9M/suNSvnV HAdoZS5Ka6v4AAsWtc6gfwa91jGzxMr5O+mvcx/VCCwahwzQe9KOm17WDhHfObq0 sWDkXSVrrXiZC7gWkB4tczHQJNJKD3aNzYmlKX6GaCKVdBT3eCgIzMkolvIQdW5r lexckmoeEI+52UzgSyLFYzw+HLphmvszsYNLo6s6LBqgHWLdjVA1KsqSKGrqaNJd xdjw3S5PHAgOdwxNgip5Vdg1Rq8MjtoVGSC2fn678SyZYOAqxEeKf1CtkYTLySjz w0ipBFOo1qLHlaT5lHQxOIAmKsK1 -----END CERTIFICATE----- ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerRequireSSLIsFalseAndStartSSLIsFalse.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="false"> <keystore>classpath://keystore</keystore> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <auth> <plainAuthEnabled>true</plainAuthEnabled> <requireSSL>false</requireSSL> </auth> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/protocols/protocols-imap4/src/test/resources/imapServerSslPKCS12WrongPassword.xml ===================================================== <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:0</bind> <tls socketTLS="false" startTLS="true"> <keystore>keystore.p12</keystore> <keystoreType>PKCS12</keystoreType> <secret>badbad</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <gracefulShutdown>false</gracefulShutdown> </imapserver> ===================================================== == File: server/Overview.md ===================================================== Apache James Server =================== This document is an effort to document the architecture and components that make Apache James. As a new committer to the project I found out fast that the lack of documentation made development slow. On my quest to solving issues I decided to document what I understand about Apache James. Feel free to add/change things if you think it's required. Server structure: components and services ========================================= The directory structure is presented bellow. All directories are maven projects and correspond roughly to a component/service. I'll explain what I mean by 'component' and 'service' bellow. ~~~ |-- app |-- container `-- cli `-- core `-- lifecycle-api `-- filesystem-api `-- mailbox-adapter `-- spring `-- util |-- data `-- data-api `-- data-file `-- data-jdbc `-- data-jpa `-- data-ldap `-- data-library |-- dns-service `-- dnsservice-api `-- dnsservice-dnsjava `-- dnsservice-library |-- karaf `-- distribution `-- features `-- integration |--mailet `-- mailetcontainer-api `-- mailetcontainer-camel `-- mailets |-- protocols `-- protocols-imap4 `-- protocols-library `-- protocols-lmtp `-- protocols-pop3 `-- protocols-smtp ===================================================== == File: server/mailet/rate-limiter-redis/redis.properties ===================================================== redisURL=redis://redis:6379 redis.topology=standalone #redis.readFrom=master ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/redis.properties ===================================================== redisURL=redis-sentinel://secret1@sentinel-1:26379,sentinel-2:26379,sentinel-3:26379?sentinelMasterId=mymaster redis.topology=master-replica #redis.readFrom=master ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/docker-compose-with-redis-sentinel.yml ===================================================== version: '3' services: redis-master: image: redis:7.2.5 container_name: redis-master restart: always ports: - "6379:6379" command: sh /usr/local/etc/redis/docker-entrypoint.sh volumes: - ./config-template/master/redis.conf.template:/usr/local/etc/redis/redis.conf.template - ./config-template/master/docker-entrypoint-master.sh:/usr/local/etc/redis/docker-entrypoint.sh healthcheck: test: ["CMD", "redis-cli", "ping", "|", "grep", "PONG"] interval: 10s timeout: 10s retries: 5 networks: - emaily-net redis-replica-1: image: redis:7.2.5 container_name: redis-replica-1 depends_on: redis-master: condition: service_healthy ports: - "6380:6379" command: sh /usr/local/etc/redis/docker-entrypoint.sh volumes: - ./config-template/replica/redis.conf.template:/usr/local/etc/redis/redis.conf.template - ./config-template/replica/docker-entrypoint-replica.sh:/usr/local/etc/redis/docker-entrypoint.sh networks: - emaily-net redis-replica-2: image: redis:7.2.5 container_name: redis-replica-2 depends_on: redis-master: condition: service_healthy ports: - "6381:6379" command: sh /usr/local/etc/redis/docker-entrypoint.sh volumes: - ./config-template/replica/redis.conf.template:/usr/local/etc/redis/redis.conf.template - ./config-template/replica/docker-entrypoint-replica.sh:/usr/local/etc/redis/docker-entrypoint.sh networks: - emaily-net ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/README.md ===================================================== # Rate limiting for Apache James on top of Redis sentinel ## Introduction This guide provides step-by-step instructions for deploying a rate limiter for Apache James using Redis Sentinel. The redis-sentinel in lab environment is structured with 6 nodes: - 1 master node (M1) - 2 replica nodes (R1, R2) - 3 sentinel nodes (S1, S2, S3) ## Configuration file - `redis.properties` file sample: ``` redisURL=redis-sentinel://your_password@redis-sentinel-1:26379,redis-sentinel-2:26379,redis-sentinel-3:26379?sentinelMasterId=mymaster redis.topology=master-replica ``` - Another configuration file of Apache James is similar to the one in the [rate-limiter-redis](../README.adoc) guide. ### How to run Run docker-compose with the following command: ```bash docker-compose up -d -f docker-compose-with-redis-sentinel.yml ``` ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/config-template/replica/redis.conf.template ===================================================== loglevel debug appendonly yes replicaof redis-master 6379 masterauth secret1 requirepass secret1 ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/config-template/replica/docker-entrypoint-replica.sh ===================================================== #!/bin/sh cp /usr/local/etc/redis/redis.conf.template /usr/local/etc/redis/redis.conf chmod 777 /usr/local/etc/redis/redis.conf redis-server /usr/local/etc/redis/redis.conf ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/config-template/sentinel/docker-entrypoint-sentinel.sh ===================================================== #!/bin/sh cp /usr/local/etc/redis/sentinel.conf.template /usr/local/etc/redis/sentinel.conf chmod 777 /usr/local/etc/redis/sentinel.conf redis-sentinel /usr/local/etc/redis/sentinel.conf ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/config-template/sentinel/sentinel.conf.template ===================================================== port 26379 loglevel debug sentinel monitor mymaster redis-master 6379 2 sentinel auth-pass mymaster secret1 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1 sentinel resolve-hostnames yes ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/config-template/master/redis.conf.template ===================================================== loglevel debug appendonly yes requirepass secret1 ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose-sample/config-template/master/docker-entrypoint-master.sh ===================================================== #!/bin/sh cp /usr/local/etc/redis/redis.conf.template /usr/local/etc/redis/redis.conf chmod 777 /usr/local/etc/redis/redis.conf redis-server /usr/local/etc/redis/redis.conf ===================================================== == File: server/mailet/rate-limiter-redis/extensions.properties ===================================================== guice.extension.module=org.apache.james.rate.limiter.redis.RedisRateLimiterModule ===================================================== == File: server/mailet/rate-limiter-redis/docker-compose.yml ===================================================== version: '3' services: redis: image: redis:7.2.5 command: - "--loglevel" - "debug" james: image: apache/james:memory-latest depends_on: - redis container_name: james hostname: james.local command: - --generate-keystore volumes: - $PWD/target/james-server-rate-limiter-redis-jar-with-dependencies.jar:/root/extensions-jars/james-server-rate-limiter-redis.jar - $PWD/extensions.properties:/root/conf/extensions.properties - $PWD/redis.properties:/root/conf/redis.properties - $PWD/mailetcontainer.xml:/root/conf/mailetcontainer.xml - $PWD/healthcheck.properties:/root/conf/healthcheck.properties ===================================================== == File: server/mailet/rate-limiter-redis/README.adoc ===================================================== = Distributed Rate limiting for Apache James on top of Redis This package provides distributed rate limiting using Redis as a shared data store. It reuses work of xref:../rate-limiter/README.adoc[the Rate Limiter extensions] but substitute a Redis implementation for the underlying rate limiting. == Running rate limiting with the memory implementation - 1. Compile this project. - 2. Place the generated "jar with dependencies" in James `extensions-jars` folder. - 3. Configure James to use the redis implementation for Rate Limiting by putting the following content within `extension.properties`: ---- guice.extension.module=org.apache.james.rate.limiter.redis.RedisRateLimiterModule ---- - 4. Provide a `redis.properties` file: ---- redisURL=redis://redis:6379 redis.topology=standalone ---- - 5. Use the rate limiting mailets within `mailetcontainer.xml` We provide a sample `docker-compose` demonstrating this setup. ===================================================== == File: server/mailet/rate-limiter-redis/healthcheck.properties ===================================================== additional.healthchecks=org.apache.james.backends.redis.RedisHealthCheck ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/message-multipart-8bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID 926590876 for <bob@james.james.org>; Tue, 21 Jan 2020 07:12:56 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.68.1]) by incoming.james.org (Postfix) with ESMTPS id B39A643 for <bob@james.james.org>; Tue, 21 Jan 2020 07:12:56 +0000 (UTC) Received: from duc-HP-ProBook-450-G4 (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id F11B13F386 for <bob@james.org>; Tue, 21 Jan 2020 08:12:55 +0100 (CET) Date: Tue, 21 Jan 2020 14:12:39 +0700 (ICT) X-LINAGORA-Copy-Delivery-Done: 1 From: bob@james.org To: bob@james.org Message-ID: <423733503.3.1579590775567@duc-HP-ProBook-450-G4> Subject: UTF-8 8bit multipart Content-Type: multipart/mixed; boundary="----=_Part_0_238762799.1579590759052" ------=_Part_0_238762799.1579590759052 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A 8bit encoded body with €uro symbol. ------=_Part_0_238762799.1579590759052 Content-Type: application/octet-stream; name=james-logo.png Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=james-logo.png iVBORw0KGgoAAAANSUhEUgAAANkAAABaCAYAAAA1mvMAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAFB1JREFUeNrsXV2MI9lVvuX+m2EXrTtLQGwydPVsRlmkSOOW+BNItB2t NiAk2n5BeYG2EwkpiSLbPPAjAW7zQiQe3C0SkBBg9ysv7ZZ4AGWFa/KClJeuRQhls2SnOj1pYIfN 1EhICRLj4pzyufbt6rrlW+W/cvc90lGVXVW37r11vnt+7h/zPI/JeJnp8jOmyTRpmhNF4Shzg8ud 059eUxrIiNJYhmEssybL4/G1f3SsGaSNAM7STxfeYWtR0ppMRqs3uNwu8D6wNQVQoelZBc6HaUi4 jgeH3nUKoOtqsdN04zUZCf8ZCPzOhNqwQeCKC/Aj4EN4v6vF7HZrspsOsjYcHoGgd2I+lyVw1SQA CpqHWYkPiPc24f2HWgw1yG4qyFADnQAXVP0meKZMADOFv9H8O0VzENJxxrxvD7gYeB7NyJLWahpk Nw5kJPgnJPCVKKBJwNUhTeQkDI6gH1cWtFpBB0k0yG4iyNCU65E51yGNxDUK/veQNE92GuCSBE0a BDYNNA2ymwcyQdgPSLNkJbeg4B+jaTgNcEnA1qIgigaaBtnNA1nAb+L9XA6xPU1/6eL+G3nhp0ns B0wyr/5fnt3t733sG+/vaNHUILuRIJsmAZhM0kwPCbi5CE3J/TIMojzC4733v6UDIbcAZKu6emID C4G0z65HEMcB6xRApTupbyFpkKkBK0uBi6oisJAs9PEAWB1dgxpkmqLNwQa7Hn2MIgRVE8Dl6BrU pEEWrblqLDoaGTQJ/WFU2s/SpEE2HmB5OLRjmIWoueoaXJo0yNS0l2y8osznqmizUJMGmTrA+KgQ FdMQfS496FeTBpkiwHIEMBXfC0dplLT20qRBNhuAdQBcFS0ymmYOMhDMtn9isNN731neztWYAKvo /i5NSSn2sKqLB2+gYOaZMfRPuj7g3l0ewJEP9lgDTNO0aLrDqjLMYSPsZeG8DMfyxU+/4cI5Au3o 3r99K+0jzLUG0zQ3ir8k3Ao7959aIc4Qr3hZlvHKwGcXn/okcjmlWgynm+Q0wDSl11z81CfzpAkC N4clMJikeO9f3rVTArDwvOsgh6YZmotJFje1h9prqMUCv0f/gXaLvdLTLKmtUj4NME0LNRfv/eu7 ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/mail_with_no_signature.eml ===================================================== From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" test SMIME ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/crypted.eml ===================================================== To: sender@localdomain From: sender <sender@localdomain> Subject: test Message-ID: <7fe4c217-ab73-d149-9bd0-e6aa3aebfc14@localdomain> Date: Tue, 3 Jan 2017 16:30:03 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" Content-Description: =?UTF-8?Q?Message_chiffr=c3=a9_S/MIME?= MIAGCSqGSIb3DQEHA6CAMIACAQAxggKHMIICgwIBADBrMGYxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIDAZGcmFuY2UxDTALBgNVBAcMBEx5b24xETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYDVQQL DAVKYW1lczEUMBIGA1UEAwwLbG9jYWxkb21haW4CAQEwDQYJKoZIhvcNAQEBBQAEggIAjNnW 2EhtDcfG/naGChQPZ2EOiPo5BRabR3dXvLcOPImX97mV51B4sggqpYdUrirD/beRkpbr814i 0LCFbNh3Xm6ojhZGiBHscStNysNjun7MOtUHXs5eDVOthsPVes/YjkHklxtJKH9J7QYwJY/m L9MgQES2HkALhfqiQDN9UDtn7AE89m70FZfkxJQZSD1NByF7dxiFvhZbd8CFmcV1C0vZRlH9 opZcVg9AkbDytKO+U4FF9/uGmiIQ99Qng0YqcG7abZqwouJ59yxmKTwrggk1+MyJ0NqB1wVP w2t1C/8hmvMISiij2bidoTTIYCybwvbuM/35POmDJVsvakLMZLG7aHSKvA+Bj+iR/RBgHHvd c7UdDMvkH0O8tYDsuAW8uh0H8LkvJ/ZWbOsev8DuAVYTm85Zd8d7islgDqfYmjvPeTHqSSgA sIFdPikRxtetU3JJKRls2BrKV6gM06++/Su+IFvTMaQYRbiQOeGc0ZfGHtlz3BSAeK32tjZu OrVrxR+BLP4huBqctvcfgjiqtRB5i06wX4q5v/5UNMq9BAtQEDEhERAoXSOWSu3wvocBWtlX xY5xw34KoFvsztHewakENjgfBG3ysH031UoOIZD0OvHyQ7BGUiu+lM22rj4Pnp6M2W+V1Jjm OHmV9siU2YsUBE78Lu+hiOcrbydgptswgAYJKoZIhvcNAQcBMBQGCCqGSIb3DQMHBAiTtikP UrH82KCABHhPrx30MofZ4L1e9dmHrvHo32h93dFJpTLqG0E3T8y8Y5fySEu7x3jWtZNIXERs /SJYDeww9tOi4tjV2z+3OCXMQjy7P9Pzb+sekX9GuVo640q7Z/2F6C1hShqyLVa7eJFZK8Na 1JasVj9lst+HD+A0SBA63Z+90bsECIXa4/tJqoBPAAAAAAAAAAAAAA== ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/mail_with_bad_signature.eml ===================================================== From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----D7BE5BC017D8AA46CAD456402C09CEA5" This is an S/MIME signed message ------D7BE5BC017D8AA46CAD456402C09CEA5 Content-Type: text/plain From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 test SMIME ------D7BE5BC017D8AA46CAD456402C09CEA5 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIAwggVrMIID UwIBATANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJGUjEPMA0GA1UECAwGRnJhbmNlMQ0wCwYD VQQHDARMeW9uMREwDwYDVQQKDAhMaW5hZ29yYTEOMAwGA1UECwwFSmFtZXMxFDASBgNVBAMMC2xv Y2FsZG9tYWluMB4XDTE3MDEwMzE1MjcxOFoXDTQ0MDUyMjE1MjcxOFowgZAxCzAJBgNVBAYTAkZS MQ8wDQYDVQQIDAZGcmFuY2UxDTALBgNVBAcMBEx5b24xETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYD VQQLDAVKYW1lczEbMBkGA1UEAwwSc2VuZGVyQGxvY2FsZG9tYWluMSEwHwYJKoZIhvcNAQkBFhJz ZW5kZXJAbG9jYWxkb21haW4wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDhLZTb9UW/ X3ZMZd9XubSah2T986WlBRXKMb8yCmKMNnr/wCexF6DjWFQLTMFI//kAv7IqXkwseZAgkrPL6qXN y/aLFe+r1DGWhSjx0+4mU28dI/trwmBHsVoq4Z2pUwSH1fl1DXb9qzENgUZE0dRGefrBERyPiPOo O9bukeKqtwMgMwnc7oIYkmcVgHH/ULKmya5EGcDQNfwF+BTZeemVQg4pwfDG5rhq9RfyW/HcfaXx BWzXUotwZZEt1ebuArr7b1FsYW4sOGunUADy6vL+KhzqTJtcnsFJTYah9BSrZZR+SnTlvh/LkOuV RwAj9LBndTmQKyz+/Zz7oezGlQQh/IGIXdf6GwdgKEz5B26RK8GhrqJTNkIA3ghsgZAmi6lG0MW/ B8eB7uTCO7zeq5fZcAatHqcJANgchTNtBppjgomsXAhxwpp2iItbFfdv2WIlhvzCgLE0XmYYBaK2 JeaEqMN2Blo6CRE7Msc7+FMycyHDGnXn79opoFIO823HwqDR2hRS9s5g4AOpWPE1OC3PfV6mJdoF 6hNpe9nmv8LlIvWg373bTnHn4BINwhk7H1hjob/UnFLQH8t6Bt0e/RPlgOQefAx38Z1C2L9hz3Jh kvfGXomf3BSmS4KE1sPtpGKP2r1QWN6Zmhdz9lpT2Pbdsqu+x8xhQh217xAt8AkRdQIDAQABMA0G CSqGSIb3DQEBCwUAA4ICAQBK0hK0qdwJJt0poAJ59H6rjCbniQb1or0XvnhGHD+TrmlYdGnpnKfE Vs4Tso4rX1MuAhZRlW5XfyAbCl8Bi8eKv5rirweLd7FPWR1ir6Eswl9Zq40juOktFzDdZNqzITXH a4bHhIPEjeSttdyjYkidtVrYnJXmO8pl8VOHGgmDld3a8sZ4Htbp2d5YxLP7MbK8b95hhnWj3Ec9 QXq6w3FdQgmm/qPKgOAxvLlbpN/KuTGqL7cYgo3apFQUXREyM2qBlypl2WWe4B+RKEWvh4esE9B2 pcsjx21O1MFfROwiShd2vgmGsVZH+otmBaew3bFNdEOETgb/wIKGfdnnILF+qYcKwdpqxLzJQEjy WBRuO6B9c1wVu5AanhjtW1FdEjUybkTZM97Og3V9f89Pp1on2ZV/UsTiMqm8zJKUC+q5MkQ6aOar dD9L/Xml/XkOqrDQEVllXoZNp9+SdicsBicHq0rzW3JQ+H3aF8giJz0lHcuEkcZibvF9Zdq3aYyV RsWQj0BzbfHo19hXijJQQ4vkHIBe1saQZTx8VpMQA8VtBTwC/GsfNK2nKHIT3yU0Umd/uM68UIfy ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/non_smime_mail.eml ===================================================== From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 test SMIME ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/message-multipart-7bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -973333758 for <bob@james.james.org>; Wed, 22 Jan 2020 03:47:32 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id 8151D43 for <bob@james.james.org>; Wed, 22 Jan 2020 03:47:32 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id D6C653F38C for <bob@james.org>; Wed, 22 Jan 2020 04:47:31 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: multipart Message-ID: <69bd7da2-5b13-de50-bd77-c985f6b0215c@james.org> Date: Wed, 22 Jan 2020 10:47:17 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: multipart/mixed; boundary="------------C3FD44EAF9B6A93E163D9176" Content-Language: en-US This is a multi-part message in MIME format. --------------C3FD44EAF9B6A93E163D9176 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable A quoted-printable encoded body with =E2=82=ACuro symbol. --------------C3FD44EAF9B6A93E163D9176 Content-Type: image/png; name="james-logo.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="james-logo.png" iVBORw0KGgoAAAANSUhEUgAAANkAAABaCAYAAAA1mvMAAAAAGXRFWHRTb2Z0d2FyZQBBZG9i ZSBJbWFnZVJlYWR5ccllPAAAFB1JREFUeNrsXV2MI9lVvuX+m2EXrTtLQGwydPVsRlmkSOOW +BNItB2tNiAk2n5BeYG2EwkpiSLbPPAjAW7zQiQe3C0SkBBg9ysv7ZZ4AGWFa/KClJeuRQhl s2SnOj1pYIfN1EhICRLj4pzyufbt6rrlW+W/cvc90lGVXVW37r11vnt+7h/zPI/JeJnp8jOm yTRpmhNF4Shzg8ud059eUxrIiNJYhmEssybL4/G1f3SsGaSNAM7STxfeYWtR0ppMRqs3uNwu 8D6wNQVQoelZBc6HaUi4jgeH3nUKoOtqsdN04zUZCf8ZCPzOhNqwQeCKC/Aj4EN4v6vF7HZr spsOsjYcHoGgd2I+lyVw1SQACpqHWYkPiPc24f2HWgw1yG4qyFADnQAXVP0meKZMADOFv9H8 ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/dlp_read_mail_with_attachment.eml ===================================================== To: user2@james.org From: user@james.org Subject: dlp subject Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------589DDD2515E3B3CC74D74E40" Content-Language: en-US This is a multi-part message in MIME format. --------------589DDD2515E3B3CC74D74E40 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit matchAnother --------------589DDD2515E3B3CC74D74E40 Content-Type: image/jpeg; name="linux.jpeg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="linux.jpeg" /9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMSEhIQEBIVFRUXFRcYFhgVFxUVGBUQFRgW FhcVFxUdHSggGBonGxUWITIlJSkrLi4uFx8/ODMsNygtLisBCgoKDg0OGhAQGjMlICY4Mi83 NSs3LTcyMC8wLTAtLS0tLy0tNS0vLzUtLS0tLS0tLzYvKy0tLS0tLy0tLS0tLf/AABEIAOEA 4QMBIgACEQEDEQH/xAAcAAEAAgIDAQAAAAAAAAAAAAAAce BgcEBQIDCAH/xABDEAABAwICBwUE CAMGBwAAAAABAAIDBBEFIQYHEjFBUWETInGBkTJSobEUI0JicoLB0QiS8BUzotLh8SRDY3OD ssL/xAAaAQEAAgMBAAAAAAAAAAAAAAAABAUBAgMG/8QALBEBAAIBAwIEBQUBAQAAAAAAAAEC AwQRIQUSEzFBUSIzgZGhYXGx0fBDMv/aAAwDAQACEQMRAD8AvFERAREQEREBERAREQEREBV/ pJrPjildSUELqydtw7YIEUbhlZ8m7eCFia0tK3hww2lkLHubtVEjfaihO5jTwe7PPgLqJ4OI 4WCOJoa0cuJ5k8SgkDcWxqe5NRS0o4BkZlcByJcbX8Fk08mNRi7a6mqD7ssJjv8AmYcj5LCp q3qtrTVqDMwrWGGytpsUgNHK42Y8kOglP3ZdwO7I8+CnQKr7E6WKrhfTztDmOHHe08HDkQo1 qq0ykpqp+B1zy7Ye5lPI43yHsxk8i3NvjbkguZERAREQEREBERAREQEREBERAREQEREBERAR EQFh4viDKeCaok9iKN73fhY0uIHM5LMVda+sQMWEyMBzmkjj67Id2h/9APNBTVLiz5nyVMpv JM90jvPcB0AAHktvTVvVQXDqk7IHJbemrUZTimreq2lNWqD01atrTVqCcU1b1VM6f1t8Tnli cQWujsRkRJHHGLjqHNUyxPSFtPEXk3duaObuHkqpnmL3Oe43c4kk8yTcow9haD479Ooaary2 nxjbtwmb3Xi3AbQNuhC3qqf+HOuL6CeE7o5zbwe0H9FbCAiIgIiICIiAiIgIiICIiAiIgIiI CIiAiIgKvNbOCitdQ07yQwPkkkAyLmsa1oF+Fy4eV1YahGsev7FrntNntppXN42s6Nu1bkC4 HyQU5p3oKKSP6XSXDG2EjCS6zSbB4JztfeoPHWDjkVdmi2JMqjNh8kjpw6Fzmuk2S4syZIxx aAD7bSMuJ5KisRpTFLLCd7HuZ47JIv8ABBt6Ss2nBrLucdwaC4nwAzWzxCSpp2bTqaVo957S Gjr/AL2Voar9FYqOkbVSgCWVge97v+XHvDB7uWZ5nwCkcOLUtQ4wB4cXA2a9pAe3js7Qs7yQ 3eYayrfK7akNz8AOQC6FL9ZujAoKu0QtDK3bj+6b2cy/GxsfBwUQQXp/DVL3a1nWM/AhXeqX /hrj+prXf9Rg6+ySroQEREBERAREQEREBERAREQEREBERAREQEREBVXrZqmCtoYJHbLKmGop ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/message-text-only-8bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id CCCA943 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393 for <bob@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: quoted Message-ID: <f4d046a8-e563-1e92-dbd9-c5038603e3a2@james.org> Date: Wed, 22 Jan 2020 11:11:38 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US A 8bit encoded body with €uro symbol. ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/crypted_with_attachment.eml ===================================================== Return-Path: <sender@localdomain> MIME-Version: 1.0 Delivered-To: sender@localdomain Received: from 172.17.0.1 (EHLO [127.0.0.1]) ([172.17.0.1]) by localdomain (JAMES SMTP Server ) with ESMTP ID 1899632362 for <sender@localdomain>; Thu, 05 Jan 2017 14:37:00 +0000 (UTC) To: sender@localdomain From: sender <sender@localdomain> Subject: with attachment Message-ID: <6e654951-2131-11df-2949-ce94c5a9f629@localdomain> Date: Thu, 5 Jan 2017 15:37:00 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" Content-Description: =?UTF-8?Q?Message_chiffr=c3=a9_S/MIME?= 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 ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/message-text-only-7bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id CCCA943 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393 for <bob@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: quoted Message-ID: <f4d046a8-e563-1e92-dbd9-c5038603e3a2@james.org> Date: Wed, 22 Jan 2020 11:11:38 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable A quoted-printable encoded body with =E2=82=ACuro symbol. ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/calendar.eml ===================================================== Return-Path: <local@localhost.com> MIME-Version: 1.0 Delivered-To: to@localhost.com From: User From <fromUser@localhost.com> Message-ID: <2d0fa16c-4c37-58de-1acc-50b5f6a23a60@localhost.com> To: User To <toUser@linagora.com> Date: Wed, 26 Jul 2017 10:34:02 +0200 Subject: Any subject Content-class: urn:content-classes:calendarmessage Content-Type: text/calendar; method=REPLY; charset=UTF-8 Content-transfer-encoding: 8BIT BEGIN:VCALENDAR PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN VERSION:2.0 METHOD:REPLY BEGIN:VEVENT CREATED:20170726T081145Z LAST-MODIFIED:20170726T083402Z DTSTAMP:20170726T083402Z UID:f1514f44bf39311568d6407249cb76c48103fcd1fb398c3c501cb72b2d293f36e04 b2aab16e43439a608f28671ab7c10e754cbc85ddee4a07fa8cf8f4f7af05bfb502b8f6 SUMMARY:[A CONFIRMER] Call OVH PRIORITY:5 ORGANIZER;CN=User;X-OBM-ID=id:mailto:userTo@localhost.com ATTENDEE;CN=User;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL;X-OBM-ID=810: mailto:user1To@linagora.com DTSTART:20170727T130000Z DURATION:PT1H TRANSP:OPAQUE SEQUENCE:2 X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for X property. Rem oving entire property: CLASS:PUBLIC X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:uuid_value LOCATION:01.78.14.42.61 / 1586 X-OBM-ALERT;X-OBM-ID=486:600 END:VEVENT END:VCALENDAR ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/bad_crypted.eml ===================================================== Return-Path: <bad@localdomain> MIME-Version: 1.0 Delivered-To: bad@localdomain Received: from 172.17.0.1 (EHLO [127.0.0.1]) ([172.17.0.1]) by HOSTNAME (JAMES SMTP Server ) with ESMTP ID 1133072046 for <bad@localdomain>; Wed, 04 Jan 2017 11:00:49 +0000 (UTC) To: bad@localdomain From: bad <bad@localdomain> Subject: test Message-ID: <6a568227-58c9-a3bc-f0d4-dd3eeb6bce43@localdomain> Date: Wed, 4 Jan 2017 12:00:49 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type=enveloped-data Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" Content-Description: =?UTF-8?Q?Message_chiffr=c3=a9_S/MIME?= MIAGCSqGSIb3DQEHA6CAMIACAQAxggKpMIICpQIBADCBjDCBhjELMAkGA1UEBhMCRlIxDzAN BgNVBAgMBkZyYW5jZTENMAsGA1UEBwwETHlvbjERMA8GA1UECgwITGluYWdvcmExDjAMBgNV BAsMBUphbWVzMRQwEgYDVQQDDAtsb2NhbGRvbWFpbjEeMBwGCSqGSIb3DQEJARYPYmFkQGxv Y2FsZG9tYWluAgEBMA0GCSqGSIb3DQEBAQUABIICAI1UxuCdpInNJ0BRSWReJNkt1N+hX+dr JrRlFRT2BnLcpzumGtVr9uEYC6JIkgAg3NVMqI7E9LQG260NSoQfKgDkBli/x9S5DJMtvqCz wlOj3uyMKXK1rRKvLlVm3wJJHsO2n2oMRsDkf8cStshGBYsvMObxENt5n6X7HGsa9oF8KpwD WPwdjN6OvFIkfRW+v5y6SLrjH4sZUm2kSIAdDgrZym3ELgUrtus0LMklMzpRiUAuqgRKXoga DmX/7TrbdZrZPjQi7Pe4jc1A2i8m9xQFcctgcn2IbCxAV9o8wHkmMAOh70SOijMI+kNeyh6r PiLcRH18EWhv/kdWcRX41wEGhV9RFQObH1CyOBoy5LJIkfITggo4qz4Pa1Z25LM5ma3ajHu8 6u2TImH/Dx2szQm3FiQ3+zA3WlRQjnN+TbOPvfx0wl+Ve7jDHC0wkW0L5w3c3esUsH1ftk2b S8hG1RLK3gBSOF0nKPcG0nK7AF0d2sd7FA71ao4PR4de7LE2tABNVDuMWVggwCYL4pfh77VM kKH7vhA1YWwn7oAo/3ZWoPOWUSJaHJYbb65APjRQ+yVl3ucwl/ok6vrU+YoQZATIcu+kU56e ZsaJiFyEmv7j9K3sEtjvwkoAYwf5sQmIbtZo+Dux6IisTFNWDQhGSmjfImuoYQ8kLckj2Wx1 wyv+MIAGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIlSYUQVkU/yqggAR44PWcNvdwIMSxYl/t ZtCd6BGwHPDRGOKAzsYcRuIWwA2wHQljjqTDiORW7uqVDyiEMDPd2nVXtAbjkZN4sujVbh5q TNbDUOihMiUn+gXcYq4Go6UD4djqx6K7YT6LIHONtP6zgygeS+EfM/9CaJd/7Z/bfuY4Jcko BAhb/n3N2DrjfgAAAAAAAAAAAAA= ===================================================== == File: server/mailet/integration-testing/src/main/resources/eml/yahooInvitation.eml ===================================================== Return-Path: <do-not-reply@yahoo.com> Date: 23 Jan 2017 12:16:35 +0000 To: raph.ouazana@linagora.com From: "OBM Linagora" <obmlinagora@yahoo.fr> Reply-To: "OBM Linagora" <obmlinagora@yahoo.fr> MIME-Version: 1.0 X-Yahoo-Newman-Property: calendar-remind X-Yahoo-Newman-Id: calendar-remind-87cf88d6-0909-4010-99a4-f156b375adbd Subject: ***SPAM*** =?UTF-8?Q?Invitation=C3=82=C2=A0:?= Test from Yahoo Content-Type: multipart/mixed; boundary="_004_CD15A92E9002734AADB6F2075789C4D70108100CB8EDEGLEX07VS01_" Message-Id: <20170123121641.2505248D3F@obm3-ui.linagora.dc1> --_004_CD15A92E9002734AADB6F2075789C4D70108100CB8EDEGLEX07VS01_ Content-Type: multipart/alternative; boundary="_000_CD15A92E9002734AADB6F2075789C4D70108100CB8EDEGLEX07VS01_" --_000_CD15A92E9002734AADB6F2075789C4D70108100CB8EDEGLEX07VS01_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable --_000_CD15A92E9002734AADB6F2075789C4D70108100CB8EDEGLEX07VS01_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 8bit <div style="min-width: 300px; max-width: 585px; padding: 15px 15px 15px 15px; font-family: Helvetica Neue, Helvetica, Arial, sans-serif; font-size: 13px; "> <table style="margin: 0px 0px 0px 0px" cellspacing="0" cellpadding="0"> <tr> <td> <div style="width:55px;height:55px;border-radius:5px;text-align:center;font-family:Helvetica Neue medium, Helvetica, Arial, sans-serif;color:white;background-color:#400090;"> <div style="padding-top:5px;line-height:20px"> <div style="font-size:12px;font-weight:lighter;"> JANV. </div> <div style="font-size:32px;font-weight:bolder;font-family:Helvetica Neue bold, Helvetica, Arial, sans-serif;"> 27 </div> </div> </div> </td> <td width="40px" /> <td style="font-size: 24px; vertical-align: middle; color: #454545; font-weight: lighter; line-height: 26px;"> "Test from Yahoo" ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/instruction.md ===================================================== These resources were created by openssl tool: ``` openssl genrsa -out rootCA.private.key openssl req -x509 -key rootCA.private.key -days 100000 -out rootCA.crt openssl genrsa -out private.key openssl req -new -key private.key -out request.csr openssl x509 -req -in request.csr -CA rootCA.crt -CAkey rootCA.private.key -CAcreateserial -out certificate.crt -days 100000 keytool -import -alias testalias -file rootCA.crt -keystore trusted_cert_keystore -deststoretype PKCS12 ``` trusted_cert_keystore file is located in the parent directory mail_with_signature.eml was based on the result of the following command: ``` openssl smime -sign -in message -out signed-message -signer certificate.crt -inkey private.key -text ``` mail_with_signaturemail_with_signature_and_content_type_xpkcs7mime.eml was based on the result of the following command: ``` openssl smime -sign -in message -out signed-message -signer certificate.crt -inkey private.key -text -nodetach ``` mail-with-signature-and-multi-certs.eml was based on the result of the following command: ``` openssl smime -sign -in message -out signed-message-multi-cert -signer certificate.crt -inkey private.key -certfile rootCA.crt -nodetach ``` For more detail: https://certificate.nikhef.nl/info/smime-manual.html password for everything: secret ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.srl ===================================================== 0D7772E97111FE45872B8D654C9C552705CF650E ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail_with_signature.eml ===================================================== From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="----B1F607CD791E8C470233D073A0704182" This is an S/MIME signed message ------B1F607CD791E8C470233D073A0704182 Content-Type: text/plain From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +0700 test SMIME ------B1F607CD791E8C470233D073A0704182 Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIIGdAYJKoZIhvcNAQcCoIIGZTCCBmECAQExDzANBglghkgBZQMEAgEFADALBgkq hkiG9w0BBwGgggOMMIIDiDCCAnACFA13culxEf5FhyuNZUycVScFz2UOMA0GCSqG SIb3DQEBCwUAMIGAMQswCQYDVQQGEwJWTjEOMAwGA1UECAwFSGFub2kxDjAMBgNV BAcMBUhhbm9pMREwDwYDVQQKDAhMaW5hZ29yYTEOMAwGA1UECwwFSmFtZXMxDjAM BgNVBAMMBWFkbWluMR4wHAYJKoZIhvcNAQkBFg9hZG1pbkBqYW1lcy5vcmcwIBcN MjQwODE1MDkyNjQwWhgPMjI5ODA1MzEwOTI2NDBaMH4xCzAJBgNVBAYTAlZOMQ4w DAYDVQQIDAVIYW5vaTEOMAwGA1UEBwwFSGFub2kxETAPBgNVBAoMCExpbmFnb3Jh MQ4wDAYDVQQLDAVKYW1lczENMAsGA1UEAwwEdXNlcjEdMBsGCSqGSIb3DQEJARYO dXNlckBqYW1lcy5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC 3GcBrtVznej/7/hqpTp3n5h9mNRdBntYUXpt/nO//xm0bcV5mMhsVuqCjFu7nTj3 dGxhwly5N1R/JdPL60re+8oeOCUr6472HTJIaqE6SetxWS+/mqNYhCmlHZGK2yCv H1bpgGGIc66Bjhu+vbAMDDAfVnz/4R0MklzacG3KtJb0j+kauBKnAe1JcIv+WJ95 BbFyEmY992/PGJMUIeSPFMEKCa6rOkKYMDQUV+brlls3ha1qHH+eI61s6EZVcEts PTOVK+RGTzrbIOzRisPRr50KK8c/+y3dGFMW6FEYDHk5E7p4/I0ojbX7gZVSMGAW Xh58ME7+7UMaGEtnQriHAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACDnWoIqpUCx UdYzbu6MABXliudgyCHRvzRkc8l1h0J7QsLnimhfmV9ujZw+u0dBy722ueToecqM Ro3CQhVz/KdGOsXKmRF5uOk4A6fWEJcpxwVNfHmMz99JUOQFryZlirAAmJVKWQYH BizQX2PSRG8bBA9pS3GpLgaA9b2ltxE0B/E5GSivIEeA2CwwUjhPBFTxpgdTbEYC DwhLhQ3d68i2jL8/NuUA+6RlYESJiJuJa6VXinbl3LEjNCGoaw8S+Jln6XMtF+KN pLfiZcY4fA92k18nYxEYYBYHDk2B457LlknIHHYlAvwVA85a2PfaRuIuEzJtfdui 1QHv9JZIKL4xggKsMIICqAIBATCBmTCBgDELMAkGA1UEBhMCVk4xDjAMBgNVBAgM BUhhbm9pMQ4wDAYDVQQHDAVIYW5vaTERMA8GA1UECgwITGluYWdvcmExDjAMBgNV BAsMBUphbWVzMQ4wDAYDVQQDDAVhZG1pbjEeMBwGCSqGSIb3DQEJARYPYWRtaW5A amFtZXMub3JnAhQNd3LpcRH+RYcrjWVMnFUnBc9lDjANBglghkgBZQMEAgEFAKCB ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.private.key ===================================================== -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAxKGiOzUxcvQgACOa4tNig3NcZON+yZ0iL4z2f8jn5AamLFxD Npfm6eI/pv4CCwiFGVA835aLHBaamcOFm75tXtuAkpe/RiagpoZAYNvk389+4Ol8 a5XNCmGOO1A/uOZbfCmrM1owFPTfPmcr9YHF4wlcT1tg1Pms/bxgIODR/yxIpJmQ xR2Vh+hSb69gf35uYjDNpMXqRFzoz6f8QvMO8NL4p6+0nerg/vXSpO6Qfu5cRUTO z+VRJW0deD8esnu2V3dueuoBIMHQSY+WOqOwckH9/efg+hP8Cexzivi+MBJAI/Ov bKrp7uMedT5A3ilcZRC/lF3MapOE5JGfK9BKBwIDAQABAoIBAQCV54/RyaTQOXMo B/ztzi+9fTZEJ/eh5uyICdRm6Rh4i+UlzpTjSv0c84KJYf7WwIEQIk62OoQFPupQ LXJvoMaq2Xb0y0FkTtCNA66S6TFcu0jEWNyk/Ihb0LHpYC2kXeIDD5VYSfp8D48e ePNXcL8Xbix0x3pUA6CxtGooxpzyBkzrBmH9g2Ep/SL6DU3UVPbcpgRv4AYJsofs 66ENkGD26Zat19SSlyCzqfLDTrVVY28JZsYwxWPrg7oyo0rKyjEI5ZUiLLz1foCI +r7JsxQ9g5i5RuB0Cb3+8Rjv0PVO2DS5HzB6Y34zxFvE2AITeOWoIJFMf1CT2Hc7 jWhel7bpAoGBAP6Vmn4AGVPnAnXuVbtU3U/aJTEhTaJ2QyY8y0mafuHv3tcHYG2T i6CX/1HxuBRVFRLptxRBB57sSepnLbK8Ik51BhWwESRdUzaGQCOjnfH7IinDvX77 0KtXnSBT7OE4N2rNcEes4A2Uu1qTEpzVfIYJPzZ1SWoUjvXtadjANahTAoGBAMW5 iP2G4jXeFa0/YUJ+kYGOSWizy4rkbqxn5XG/tA/H//bbD8QW8TjGIP39phvQsNzf V/jVwCyqu9gFKGj0R4ERSVMjDxjVY3i7hU9jH83NjFRGyumdg7dKtNFXvJZT1aE6 MH5+8NSEPUG5Bw6q821Z/5dZjzdl1wCfDbnjNVD9AoGBAOU+xd1MLYJ19KtJMH39 z0PGhdMV0BjJMXJPMCdZLYQ6QYmTpOtG/2ZfOJQLe90jOFTNjAR7AmfDElQ3ENlv u9y2WAJThzwdpX7lqP/up51srLi6//pGuwJvZJflutqbiptr3v1L2H2iPoszAIGl Y/o2fWuGddNGK+2cGcIKYsbtAoGAPhJW3TBhB4QmzfKdt+BAEan3hbUb6wh3bgxX zXPfNS0WQArZUjfZlncsmE/uu8CyJUTAO0/vOpaGzfQgkYJOiEhC+qSA8szao2ZL HXcC3vruWO64eMqINRxw0191xsOexzSbULrNJAo3qNBLVOF59hRQ1tS4zy1bZ8iG 6JpZfIkCgYAb5ZA4Pr9JuzJDGCMsytZUvcuSjceCidJL1Ls///FJiLboSPSacLpn TjIEdZ9+GAUb5zsKMezt6sWA98G7GY4KKcwS0hn0Op0piihkIf0AII97BiVmqhqI yc6WSpCGTy5PgnL22UcAnZZcVa8hS4V2v11Qblw46UGLHEn9nyIguQ== -----END RSA PRIVATE KEY----- ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail_with_signature_and_content_type_xpkcs7mime.eml ===================================================== From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +070 MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIIHRwYJKoZIhvcNAQcCoIIHODCCBzQCAQExDzANBglghkgBZQMEAgEFADCB3QYJ KoZIhvcNAQcBoIHPBIHMQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQoNCkZyb206 IHVzZXJAamFtZXMub3JnDQpUbzogdXNlcjJAamFtZXMub3JnDQpTdWJqZWN0OiB0 ZXN0DQpNZXNzYWdlLUlEOiA8ZGY3M2MwNWEtMmUxOC0zZTIyLTA0MGMtOWVkYTZh YmUwMmFlQG9wZW4tcGFhcy5vcmc+DQpEYXRlOiBGcmksIDEgTm92IDIwMTkgMTA6 MjE6MzkgKzA3MDANCg0KdGVzdCBTTUlNRQ0KoIIDjDCCA4gwggJwAhQNd3LpcRH+ RYcrjWVMnFUnBc9lDjANBgkqhkiG9w0BAQsFADCBgDELMAkGA1UEBhMCVk4xDjAM BgNVBAgMBUhhbm9pMQ4wDAYDVQQHDAVIYW5vaTERMA8GA1UECgwITGluYWdvcmEx DjAMBgNVBAsMBUphbWVzMQ4wDAYDVQQDDAVhZG1pbjEeMBwGCSqGSIb3DQEJARYP YWRtaW5AamFtZXMub3JnMCAXDTI0MDgxNTA5MjY0MFoYDzIyOTgwNTMxMDkyNjQw WjB+MQswCQYDVQQGEwJWTjEOMAwGA1UECAwFSGFub2kxDjAMBgNVBAcMBUhhbm9p MREwDwYDVQQKDAhMaW5hZ29yYTEOMAwGA1UECwwFSmFtZXMxDTALBgNVBAMMBHVz ZXIxHTAbBgkqhkiG9w0BCQEWDnVzZXJAamFtZXMub3JnMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAwtxnAa7Vc53o/+/4aqU6d5+YfZjUXQZ7WFF6bf5z v/8ZtG3FeZjIbFbqgoxbu50493RsYcJcuTdUfyXTy+tK3vvKHjglK+uO9h0ySGqh OknrcVkvv5qjWIQppR2Ritsgrx9W6YBhiHOugY4bvr2wDAwwH1Z8/+EdDJJc2nBt yrSW9I/pGrgSpwHtSXCL/lifeQWxchJmPfdvzxiTFCHkjxTBCgmuqzpCmDA0FFfm 65ZbN4Wtahx/niOtbOhGVXBLbD0zlSvkRk862yDs0YrD0a+dCivHP/st3RhTFuhR GAx5ORO6ePyNKI21+4GVUjBgFl4efDBO/u1DGhhLZ0K4hwIDAQABMA0GCSqGSIb3 DQEBCwUAA4IBAQAg51qCKqVAsVHWM27ujAAV5YrnYMgh0b80ZHPJdYdCe0LC54po X5lfbo2cPrtHQcu9trnk6HnKjEaNwkIVc/ynRjrFypkRebjpOAOn1hCXKccFTXx5 jM/fSVDkBa8mZYqwAJiVSlkGBwYs0F9j0kRvGwQPaUtxqS4GgPW9pbcRNAfxORko ryBHgNgsMFI4TwRU8aYHU2xGAg8IS4UN3evItoy/PzblAPukZWBEiYibiWulV4p2 5dyxIzQhqGsPEviZZ+lzLRfijaS34mXGOHwPdpNfJ2MRGGAWBw5NgeOey5ZJyBx2 JQL8FQPOWtj32kbiLhMybX3botUB7/SWSCi+MYICrDCCAqgCAQEwgZkwgYAxCzAJ BgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5vaTEOMAwGA1UEBwwFSGFub2kxETAPBgNV BAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVKYW1lczEOMAwGA1UEAwwFYWRtaW4xHjAc BgkqhkiG9w0BCQEWD2FkbWluQGphbWVzLm9yZwIUDXdy6XER/kWHK41lTJxVJwXP ZQ4wDQYJYIZIAWUDBAIBBQCggeQwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc BgkqhkiG9w0BCQUxDxcNMjQwODE1MTAwMDE0WjAvBgkqhkiG9w0BCQQxIgQgP96w mwYh+ZfDZNWF2mFe1tO7jf97tDQmQ5wgNcGocDoweQYJKoZIhvcNAQkPMWwwajAL BglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0D BzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZI hvcNAwICASgwDQYJKoZIhvcNAQEBBQAEggEAMBaNPzd7aIcPN3zmB/FXv+aKqPhA qXJVa4QEuX01ngQ3ac7/ncDSHHJVBqGuIQziO/331bkJgY6qE3tYY/kJVjzcJOHm m6wLoFFBmUm1kUkjJD6Li+jK11Ws+/V8XCDlrxxwIyjeSF6TIDnmEVxJsQfnD1fx ed0xtBg9UFg7bKTdvC0UXDzmUCoRZb3zf5xuW4NhAHYGklhyuaiUlaJu/PMGomY5 20KfS+xY+knHM/7VLzjc3PZxppITIGX0exDaJuaOede8oseZ9zIAD0DOQYG/y8+h 3UfXrmbUCSEl9+HfLDW7sV9ZTndFiPRvFTawNjBNjhdhxJ1fZRpbxSNspQ== ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/private.key ===================================================== -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAwtxnAa7Vc53o/+/4aqU6d5+YfZjUXQZ7WFF6bf5zv/8ZtG3F eZjIbFbqgoxbu50493RsYcJcuTdUfyXTy+tK3vvKHjglK+uO9h0ySGqhOknrcVkv v5qjWIQppR2Ritsgrx9W6YBhiHOugY4bvr2wDAwwH1Z8/+EdDJJc2nBtyrSW9I/p GrgSpwHtSXCL/lifeQWxchJmPfdvzxiTFCHkjxTBCgmuqzpCmDA0FFfm65ZbN4Wt ahx/niOtbOhGVXBLbD0zlSvkRk862yDs0YrD0a+dCivHP/st3RhTFuhRGAx5ORO6 ePyNKI21+4GVUjBgFl4efDBO/u1DGhhLZ0K4hwIDAQABAoIBAQCCyVGttH35qswf NB6E3b9fWNQNwI0QnvAcuBs3RmjEPeEv09mOIriq1q9xzekoBH+evxqbhsubWQKy kF4WaSeIgHEJVV/FmcYLdE8ygbcTG1gWbOj6bj0ihRo6g50TGL5YK+22rX9JCXPf 6tS+cix9+ZQ3BGLDj4Fi1b3Ss1FNkjnjHycnEvhIhEunJ+DGYRj18SycZL7OyDRU khksMVuimcW8jx8kxvH38sj+MDbTvaFc/ukoS46tBKz9ZDJ553I0PTSHZfMw77+a x346j1gvkQCejjlVD2J7kRlEMYdPn52wzXmJyzAE/UpragSL1mxDaE0Yhl1qkGDG asAZZh2pAoGBAOs7zTF48b+NDbgQlDR57yaIiyDaMX2o9N0t+ob+y5HQr6F9LHE/ Bjs83X7IMqFQsc25Ytd8jsYzX7qfjVuhMs+wMhRyTO8+nYAYHBTKL8UvCU+xzA5z xzcNLHOOyx2G4ZAb5aSgrX8/BZpZPxLictf8H/IPh42FNZv4b6YNezrTAoGBANQQ MVih4nM68BGncQpuX25dR/InoMchzJktlYILlHgYmeJu/FTiHqdaLZDgbIBnXdVB GGlMXIjesiC7gSGM23s8Yau047Pn8PQsC1a9Q8fS9CXmhqJmqjE3Fl793Q6vemQj cPc1Glg2wQ8iZ9mpAiRSQBRcNCMNZgnVFs7MllL9AoGBAN6NcZEA0BdeKECgztbn Fe/q91ZZmME+fIxV19Soc4i9W6z5dHagHhElgJlWZzBf3Bi68FzXJ201Zbh3A5JR bHU6Sec2TLt9Dh4GsWqp75Aq9DBGEr0JpMzc1dVun5SL7BQfkKC0s/DTe0WQcjA3 tlfJ3Z9yOdkW0qWB4n/D+XapAoGBAI3gP4Ny2xQIzHCjO6ek7EfkNKw4AwL3A/E/ ZBVbNfubSekKI9uOZL/GP1H8M9s8TLTOFkzsf8Q6aaYojF4r5PNwFFBSdzz34mcZ yIRBn8Vix2FL96tTUG4Y0ui+o1Sd5h5077EUYAnAqC098YjX38z5ElIM1fzVi/zs CZRVoATpAoGAP2UyFMYfXBAc4KmWsr8qLRegVHSsdWtuKDNxffM3kLS4AVYUF0Sl yGvit2PZG/z1FfjQTVuVjuTK/01xw7fWaVU16oqictneIQT7RS2Q5q0dNRxca9G5 f2+Cbztk8Hkqak4SEpMclq0FoIjwIiX586x0DuA2V37ApL21l1He+no= -----END RSA PRIVATE KEY----- ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/rootCA.crt ===================================================== -----BEGIN CERTIFICATE----- MIID5TCCAs2gAwIBAgIUASoDQ2Wf0Mef+y9bfCqSMy6hFfMwDQYJKoZIhvcNAQEL BQAwgYAxCzAJBgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5vaTEOMAwGA1UEBwwFSGFu b2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVKYW1lczEOMAwGA1UEAwwF YWRtaW4xHjAcBgkqhkiG9w0BCQEWD2FkbWluQGphbWVzLm9yZzAgFw0yNDA4MTUw ODQzNDBaGA8yMjk4MDUzMTA4NDM0MFowgYAxCzAJBgNVBAYTAlZOMQ4wDAYDVQQI DAVIYW5vaTEOMAwGA1UEBwwFSGFub2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYD VQQLDAVKYW1lczEOMAwGA1UEAwwFYWRtaW4xHjAcBgkqhkiG9w0BCQEWD2FkbWlu QGphbWVzLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMShojs1 MXL0IAAjmuLTYoNzXGTjfsmdIi+M9n/I5+QGpixcQzaX5uniP6b+AgsIhRlQPN+W ixwWmpnDhZu+bV7bgJKXv0YmoKaGQGDb5N/PfuDpfGuVzQphjjtQP7jmW3wpqzNa MBT03z5nK/WBxeMJXE9bYNT5rP28YCDg0f8sSKSZkMUdlYfoUm+vYH9+bmIwzaTF 6kRc6M+n/ELzDvDS+KevtJ3q4P710qTukH7uXEVEzs/lUSVtHXg/HrJ7tld3bnrq ASDB0EmPljqjsHJB/f3n4PoT/Ansc4r4vjASQCPzr2yq6e7jHnU+QN4pXGUQv5Rd zGqThOSRnyvQSgcCAwEAAaNTMFEwHQYDVR0OBBYEFJLv8+NebeBDDJWLpb3cD+kF aIjeMB8GA1UdIwQYMBaAFJLv8+NebeBDDJWLpb3cD+kFaIjeMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFal8TpKaOBESJC9Nhb71Ivw8fV+kGdq YySdseOnuXgAorXfs6MK0ko/rbrTJjS9JImbFcxTqHim+kTTsiy3wvYBUi77DKoS XVhl5EuNkdkMG1EhR1kC7SUJv5C4o7i1OZIJwf7ATWyo/KbEezIIlvS7Jz9q7EOG 9zm57k+noY/BvbcRCh0CmOyD5MuyFGw+PitPiWzsWTK0PCBKRKwzRi0hbw/w4PHk ur+/0bhMVU4kuE7SquRn3pjoxtQqYGy55xEAl/Rkzd5a9PD7vTnf3o2RcA5/K/5N HJL1vvH3jMNLXBy/t3Uek5H/6BM8qxtAqNoJcnCfbm7zYz2GFGXThr0= -----END CERTIFICATE----- ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/request.csr ===================================================== -----BEGIN CERTIFICATE REQUEST----- MIIC2jCCAcICAQAwfjELMAkGA1UEBhMCVk4xDjAMBgNVBAgMBUhhbm9pMQ4wDAYD VQQHDAVIYW5vaTERMA8GA1UECgwITGluYWdvcmExDjAMBgNVBAsMBUphbWVzMQ0w CwYDVQQDDAR1c2VyMR0wGwYJKoZIhvcNAQkBFg51c2VyQGphbWVzLm9yZzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMLcZwGu1XOd6P/v+GqlOnefmH2Y 1F0Ge1hRem3+c7//GbRtxXmYyGxW6oKMW7udOPd0bGHCXLk3VH8l08vrSt77yh44 JSvrjvYdMkhqoTpJ63FZL7+ao1iEKaUdkYrbIK8fVumAYYhzroGOG769sAwMMB9W fP/hHQySXNpwbcq0lvSP6Rq4EqcB7Ulwi/5Yn3kFsXISZj33b88YkxQh5I8UwQoJ rqs6QpgwNBRX5uuWWzeFrWocf54jrWzoRlVwS2w9M5Ur5EZPOtsg7NGKw9GvnQor xz/7Ld0YUxboURgMeTkTunj8jSiNtfuBlVIwYBZeHnwwTv7tQxoYS2dCuIcCAwEA AaAXMBUGCSqGSIb3DQEJBzEIDAZzZWNyZXQwDQYJKoZIhvcNAQELBQADggEBAIdD YsObgyH00x9ZFM8R8i2ILlcbx8G1yAnJMvSLM0twQBGLbKjgUMsjK48qMog9WuD9 Ze85z/7T9xPXbybvCxqEYUo+qKXL//dFl5Bigw4f6yNYhw2R0EjdTHolGJ3EqkKv 1XhwtOYXGLQugld1yLBVhsBRLHZUzGc77mbHSlmbD4KiwEhsxkue+Zwl46nrZHlu G887kQyQVs+Kd0s8onrL1VLn5/qOqVTo2oh17YjbWcvjk/Tz+jb6qe0f8iMnrJxs LToYPYL4OEhLE1SyND2x9j5gfZHw1pi/JxR7z+E+iVErYgWYcX4Ruqrcnf4klG3y XAF2nsLLDrCoe9GxKsQ= -----END CERTIFICATE REQUEST----- ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/mail-with-signature-and-multi-certs.eml ===================================================== From: user@james.org To: user2@james.org Subject: test Message-ID: <df73c05a-2e18-3e22-040c-9eda6abe02ae@open-paas.org> Date: Fri, 1 Nov 2019 10:21:39 +070 MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIILFAYJKoZIhvcNAQcCoIILBTCCCwECAQExDzANBglghkgBZQMEAgEFADCBwQYJ KoZIhvcNAQcBoIGzBIGwRnJvbTogdXNlckBqYW1lcy5vcmcNClRvOiB1c2VyMkBq YW1lcy5vcmcNClN1YmplY3Q6IHRlc3QNCk1lc3NhZ2UtSUQ6IDxkZjczYzA1YS0y ZTE4LTNlMjItMDQwYy05ZWRhNmFiZTAyYWVAb3Blbi1wYWFzLm9yZz4NCkRhdGU6 IEZyaSwgMSBOb3YgMjAxOSAxMDoyMTozOSArMDcwMA0KDQp0ZXN0IFNNSU1FDQqg ggd1MIID5TCCAs2gAwIBAgIUASoDQ2Wf0Mef+y9bfCqSMy6hFfMwDQYJKoZIhvcN AQELBQAwgYAxCzAJBgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5vaTEOMAwGA1UEBwwF SGFub2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVKYW1lczEOMAwGA1UE AwwFYWRtaW4xHjAcBgkqhkiG9w0BCQEWD2FkbWluQGphbWVzLm9yZzAgFw0yNDA4 MTUwODQzNDBaGA8yMjk4MDUzMTA4NDM0MFowgYAxCzAJBgNVBAYTAlZOMQ4wDAYD VQQIDAVIYW5vaTEOMAwGA1UEBwwFSGFub2kxETAPBgNVBAoMCExpbmFnb3JhMQ4w DAYDVQQLDAVKYW1lczEOMAwGA1UEAwwFYWRtaW4xHjAcBgkqhkiG9w0BCQEWD2Fk bWluQGphbWVzLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMSh ojs1MXL0IAAjmuLTYoNzXGTjfsmdIi+M9n/I5+QGpixcQzaX5uniP6b+AgsIhRlQ PN+WixwWmpnDhZu+bV7bgJKXv0YmoKaGQGDb5N/PfuDpfGuVzQphjjtQP7jmW3wp qzNaMBT03z5nK/WBxeMJXE9bYNT5rP28YCDg0f8sSKSZkMUdlYfoUm+vYH9+bmIw zaTF6kRc6M+n/ELzDvDS+KevtJ3q4P710qTukH7uXEVEzs/lUSVtHXg/HrJ7tld3 bnrqASDB0EmPljqjsHJB/f3n4PoT/Ansc4r4vjASQCPzr2yq6e7jHnU+QN4pXGUQ v5RdzGqThOSRnyvQSgcCAwEAAaNTMFEwHQYDVR0OBBYEFJLv8+NebeBDDJWLpb3c D+kFaIjeMB8GA1UdIwQYMBaAFJLv8+NebeBDDJWLpb3cD+kFaIjeMA8GA1UdEwEB /wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFal8TpKaOBESJC9Nhb71Ivw8fV+ kGdqYySdseOnuXgAorXfs6MK0ko/rbrTJjS9JImbFcxTqHim+kTTsiy3wvYBUi77 DKoSXVhl5EuNkdkMG1EhR1kC7SUJv5C4o7i1OZIJwf7ATWyo/KbEezIIlvS7Jz9q 7EOG9zm57k+noY/BvbcRCh0CmOyD5MuyFGw+PitPiWzsWTK0PCBKRKwzRi0hbw/w 4PHkur+/0bhMVU4kuE7SquRn3pjoxtQqYGy55xEAl/Rkzd5a9PD7vTnf3o2RcA5/ K/5NHJL1vvH3jMNLXBy/t3Uek5H/6BM8qxtAqNoJcnCfbm7zYz2GFGXThr0wggOI MIICcAIUDXdy6XER/kWHK41lTJxVJwXPZQ4wDQYJKoZIhvcNAQELBQAwgYAxCzAJ BgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5vaTEOMAwGA1UEBwwFSGFub2kxETAPBgNV BAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVKYW1lczEOMAwGA1UEAwwFYWRtaW4xHjAc BgkqhkiG9w0BCQEWD2FkbWluQGphbWVzLm9yZzAgFw0yNDA4MTUwOTI2NDBaGA8y Mjk4MDUzMTA5MjY0MFowfjELMAkGA1UEBhMCVk4xDjAMBgNVBAgMBUhhbm9pMQ4w DAYDVQQHDAVIYW5vaTERMA8GA1UECgwITGluYWdvcmExDjAMBgNVBAsMBUphbWVz MQ0wCwYDVQQDDAR1c2VyMR0wGwYJKoZIhvcNAQkBFg51c2VyQGphbWVzLm9yZzCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMLcZwGu1XOd6P/v+GqlOnef mH2Y1F0Ge1hRem3+c7//GbRtxXmYyGxW6oKMW7udOPd0bGHCXLk3VH8l08vrSt77 yh44JSvrjvYdMkhqoTpJ63FZL7+ao1iEKaUdkYrbIK8fVumAYYhzroGOG769sAwM MB9WfP/hHQySXNpwbcq0lvSP6Rq4EqcB7Ulwi/5Yn3kFsXISZj33b88YkxQh5I8U wQoJrqs6QpgwNBRX5uuWWzeFrWocf54jrWzoRlVwS2w9M5Ur5EZPOtsg7NGKw9Gv nQorxz/7Ld0YUxboURgMeTkTunj8jSiNtfuBlVIwYBZeHnwwTv7tQxoYS2dCuIcC AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAIOdagiqlQLFR1jNu7owAFeWK52DIIdG/ ===================================================== == File: server/mailet/integration-testing/src/main/resources/smime-test-resource-set/certificate.crt ===================================================== -----BEGIN CERTIFICATE----- MIIDiDCCAnACFA13culxEf5FhyuNZUycVScFz2UOMA0GCSqGSIb3DQEBCwUAMIGA MQswCQYDVQQGEwJWTjEOMAwGA1UECAwFSGFub2kxDjAMBgNVBAcMBUhhbm9pMREw DwYDVQQKDAhMaW5hZ29yYTEOMAwGA1UECwwFSmFtZXMxDjAMBgNVBAMMBWFkbWlu MR4wHAYJKoZIhvcNAQkBFg9hZG1pbkBqYW1lcy5vcmcwIBcNMjQwODE1MDkyNjQw WhgPMjI5ODA1MzEwOTI2NDBaMH4xCzAJBgNVBAYTAlZOMQ4wDAYDVQQIDAVIYW5v aTEOMAwGA1UEBwwFSGFub2kxETAPBgNVBAoMCExpbmFnb3JhMQ4wDAYDVQQLDAVK YW1lczENMAsGA1UEAwwEdXNlcjEdMBsGCSqGSIb3DQEJARYOdXNlckBqYW1lcy5v cmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC3GcBrtVznej/7/hq pTp3n5h9mNRdBntYUXpt/nO//xm0bcV5mMhsVuqCjFu7nTj3dGxhwly5N1R/JdPL 60re+8oeOCUr6472HTJIaqE6SetxWS+/mqNYhCmlHZGK2yCvH1bpgGGIc66Bjhu+ vbAMDDAfVnz/4R0MklzacG3KtJb0j+kauBKnAe1JcIv+WJ95BbFyEmY992/PGJMU IeSPFMEKCa6rOkKYMDQUV+brlls3ha1qHH+eI61s6EZVcEtsPTOVK+RGTzrbIOzR isPRr50KK8c/+y3dGFMW6FEYDHk5E7p4/I0ojbX7gZVSMGAWXh58ME7+7UMaGEtn QriHAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACDnWoIqpUCxUdYzbu6MABXliudg yCHRvzRkc8l1h0J7QsLnimhfmV9ujZw+u0dBy722ueToecqMRo3CQhVz/KdGOsXK mRF5uOk4A6fWEJcpxwVNfHmMz99JUOQFryZlirAAmJVKWQYHBizQX2PSRG8bBA9p S3GpLgaA9b2ltxE0B/E5GSivIEeA2CwwUjhPBFTxpgdTbEYCDwhLhQ3d68i2jL8/ NuUA+6RlYESJiJuJa6VXinbl3LEjNCGoaw8S+Jln6XMtF+KNpLfiZcY4fA92k18n YxEYYBYHDk2B457LlknIHHYlAvwVA85a2PfaRuIuEzJtfdui1QHv9JZIKL4= -----END CERTIFICATE----- ===================================================== == File: server/mailet/ldap/src/test/resources/ldif-files/populate.ldif ===================================================== dn: ou=people, dc=james,dc=org ou: people objectClass: organizationalUnit dn: ou=empty, dc=james,dc=org ou: empty objectClass: organizationalUnit dn: ou=groups, dc=james,dc=org ou: groups objectClass: organizationalUnit dn: ou=whatever, dc=james,dc=org ou: whatever objectClass: organizationalUnit dn: uid=james-user, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user cn: james-user sn: james-user mail: james-user@james.org userPassword: secret description: abcdef dn: uid=james-user1, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user1 cn: james-user1 sn: james-user1 mail: james-user1@james.org userPassword: secret description: cn=active,ou=accountStatus,ou=whatever,o=gov,c=vn dn: uid=bob, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: bob cn: bob sn: bob mail: bob@james.org userPassword: secret description: Extra user dn: cn=mygroup,ou=groups, dc=james,dc=org objectclass: top objectclass: groupofnames member: uid=james-user,ou=people,dc=james,dc=org member: uid=not-found,ou=people,dc=james,dc=org cn: mygroup ou: groups ===================================================== == File: server/mailet/ldap/README.md ===================================================== # LDAP matchers for Apache James This project is an extension for Apache James that allows configuring conditions based on LDAP content within Apache James mailetcontainer. Those include: - LDAP conditions based on attributes of the recipients - LDAP conditions based on attributes of the sender - LDAP groups of the recipients Support is planned for LDAP groups both for sender and recipients. ## Set up Build this project. For the root of the repository: ```bash mvn clean install -DskipTests --am --pl :james-server-mailet-ldap ``` Then copy the JAR located in `/target` into the `extensions-jars` folder of your Apache James installation. ## Configuration The LDAP settings are reused from the `usersrepository.xml` configuration file. Then LDAP matchers can be configured within `mailetcontainer.xml`. For instance: ```xml <!-- Matches recipients that have the following attribute with the specified value--> <mailet matcher="HasLDAPAttribute=description:blocked" class="Null"> </mailet> ``` or ```xml <!-- Matches sender that have the following attribute with the specified value--> <mailet matcher="SenderHasLDAPAttribute=description:blocked" class="Null"> </mailet> ``` or ```xml ===================================================== == File: server/mailet/rate-limiter/extensions.properties ===================================================== guice.extension.module=org.apache.james.rate.limiter.memory.MemoryRateLimiterModule ===================================================== == File: server/mailet/rate-limiter/docker-compose.yml ===================================================== version: '3' services: james: image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - $PWD/target/james-server-rate-limiter-jar-with-dependencies.jar:/root/extensions-jars/james-server-rate-limiter.jar - $PWD/extensions.properties:/root/conf/extensions.properties - $PWD/mailetcontainer.xml:/root/conf/mailetcontainer.xml ===================================================== == File: server/mailet/rate-limiter/README.adoc ===================================================== = Rate limiting for Apache James This maven module provide a James extension allowing one to enforce rate limiting for Apache James email processing. == Running rate limiting with the memory implementation - 1. Compile this project. - 2. Place the generated "jar with dependencies" in James `extensions-jars` folder. - 3. Configure James to use the memory implementation for Rate Limiting by putting the following content within `extension.properties`: ---- guice.extension.module=org.apache.james.rate.limiter.memory.MemoryRateLimiterModule ---- - 4. Use the rate limiting mailets within `mailetcontainer.xml` We provide a sample `docker-compose` demonstrating this setup. == Mailets === PerSenderRateLimit *PerSenderRateLimit* allows defining and enforcing rate limits for the sender of matching emails. This allows writing rules like: - A sender can send 10 emails per hour - A sender can send email to a total of 20 recipients per hour - A sender can send 100 MB of emails (total computed taking only the email size into account) per hour - A sender can send 200 MB of emails (total computed taking each recipient copies into account) per hour Depending on its position and the matcher it is being combined with, those rate limiting rules could be applied to submitted emails, received emails or emitted email being relayed to third parties. Here are supported configuration parameters: - *keyPrefix*: An optional key prefix to apply to rate limiting. Choose distinct values if you specify this mailet twice within your `mailetcontainer.xml` file. Defaults to none. - *exceededProcessor*: Processor to which emails whose rate is exceeded should be redirected to. Defaults to error. Use this to customize the behaviour upon exceeded rate. - *duration*: Duration during which the rate limiting shall be applied. Compulsory, must be a valid duration of at least one second. Supported units includes s (second), m (minute), h (hour), d (day). - *precision*: Defines the time precision that will be used to approximate the sliding window. A lower duration increases precision but requests more computing power. The precision must be greater than 1 second. Optional, default to duration means fixed window counters. Supported units includes s (second), m (minute), h (hour), d (day). - *count*: Count of emails allowed for a given sender during duration. Optional, if unspecified this rate limit is not applied. - *recipients*: Count of recipients allowed for a given sender during duration. Optional, if unspecified this rate limit is not applied. - *size*: Size of emails allowed for a given sender during duration (each email count one time, regardless of recipient count). Optional, if unspecified this rate limit is not applied. Supported units : B ( 2^0 ), K ( 2^10 ), M ( 2^20 ), G ( 2^30 ), defaults to B. - *totalSize*: Size of emails allowed for a given sender during duration (each recipient of the email email count one time). Optional, if unspecified this rate limit is not applied. Supported units : B ( 2^0 ), K ( 2^10 ), M ( 2^20 ), G ( 2^30 ), defaults to B. Note that totalSize is limited in increments of 2exp(31) - ~2 billions: sending a 10MB file to more than 205 recipients will be rejected if this parameter is enabled. ===================================================== == File: server/mailet/mailets/src/main/resources/managesieve.help.txt ===================================================== managesieve implements the commands defined by RFC 5804 ((http://tools.ietf.org/html/rfc5804) to manage sieve scripts via mail messages. A mail is sent to the managesieve user with the command and parameters in the subject header. Sieve scripts are exchanged as mail attachments. Consult your mail administrator for the name of the managesieve user configured for your installation. Users MUST be SMTP authenticated to execute all except the CAPABILITY and HELP commands (see note (1) below). Commands are executed and answered within the namespace of the sending user as denoted by the sender header of the mail. Thus, a command such as LISTSCRIPTS lists the scripts within namespace of the user identified by the sender header. The supported commands are summarised in "Command Summary" below. Generally the responses are self describing. For full details see RFC 5804 - Commands (http://tools.ietf.org/html/rfc5804#section-2). In these descriptions the following keywords apply: - sieve-name The name of a sieve script enclosed in parentheses, eg: "my script". An empty name is not allowed. - active-sieve-name As sieve-name, except an empty name, eg: "", is allowed. - old-sieve-name As sieve-name - new-sieve-name As sieve-name - sieve-script A mail attachment recognised as a sieve script. This is the first attachment in a mail satisfying any of these characteristics: - A MIME type of "application/sieve" - A filename with the suffix ".sieve" - A filename with the suffix ".siv" Returned sieve-scripts always have the MIME type of "application/sieve" Command Summary --------------- CAPABILITY Subject: CAPABILITY Attachments: none Answers the capabilities of the underlying sieve inplementation. CHECKSCRIPT Subject: CHECKSCRIPT Attachments: sieve-script Verifies the attached sieve-script without storing it on the server. DELETESCRIPT Subject: DELETESCRIPT sieve-name Attachments: none Deletes the named sieve script. ===================================================== == File: server/mailet/mailets/src/test/resources/noReplyTo.eml ===================================================== Return-Path: <root-bounces@listes.apache.org> Content-Type: multipart/mixed; boundary="----------=_1433322346-12583-0" MIME-Version: 1.0 From: "Content-filter at spam.apache.org" <postmaster@apache.org> Date: Wed, 3 Jun 2015 09:05:46 +0000 (UTC) To: <root@listes.apache.org> Message-ID: <VASs-IZaXqmZao@spam.apache.org> Subject: Original subject X-BeenThere: root@listes.apache.org Errors-To: root-bounces@listes.apache.org Sender: "root" <root-bounces@listes.apache.org> Reply-To: <> This is a multi-part message in MIME format... ------------=_1433322346-12583-0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 7bit No viruses were found. Content type: Unchecked Internal reference code for the message is 12583-16/Ss-IZaXqmZao According to a 'Received:' trace, the message apparently originated at: [198.252.153.129], [127.0.0.1] localhost [127.0.0.1] Authenticated sender: quentin.h Return-Path: <quentin.h@apache.org> From: Quentin <quentin.h@apache.org> Message-ID: <556EC361.6000308@apache.org> Subject: XYZ Not quarantined. The message WILL BE relayed to: <xxx@apache.org> ------------=_1433322346-12583-0 Content-Type: text/rfc822-headers; name="header" Content-Disposition: inline; filename="header" Content-Transfer-Encoding: 7bit Content-Description: Message header section Return-Path: <quentin.h@apache.org> Message-ID: <556EC361.6000308@apache.org> Date: Wed, 03 Jun 2015 11:05:37 +0200 From: Quentin <quentin.h@apache.org> MIME-Version: 1.0 ===================================================== == File: server/mailet/mailets/src/test/resources/brokenReplyTo.eml ===================================================== Return-Path: <root-bounces@listes.minet.net> Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Wed, 03 Jun 2015 11:05:45 +0200 X-Sieve: CMU Sieve 2.4 Reply-To: <invalid@domain.com Received: from smtp.minet.net (smtp.minet.net [192.168.102.18]) by mx1.minet.net (Postfix) with ESMTP id F06FE610F72; Wed, 3 Jun 2015 11:05:48 +0200 (CEST) Received: from listes.minet.net (listes.minet.net [192.168.102.29]) by smtp.minet.net (Postfix) with ESMTP id AAB15610F70; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=minet.net; s=mail; t=1433322348; bh=8OtmVRMX7IWWyQo8WQIi5rKeDEQFghSX2r1WN9/pqUk=; h=From:Date:To:Subject:List-Id:List-Unsubscribe:List-Post:List-Help: List-Subscribe:From; b=UkthSFXn5mtPnn7sYvDJIxgCk1O36L0p+hTOnI/xTF2WRMGJyXtLyCdFdE5jQ5gE4 EGNdhwmfjaKsoE7IDtc/4GrPvbnM8i9ojpSOBW1hXJPOeYnRgah/4gsXsMJWvmmq/A 4oTnw8ZswFXiShDmBMyaSEZuVrWTdaPBgUhVhGw8= Received: from listes.minet.net (listes.minet.net [127.0.0.1]) by listes.minet.net (Postfix) with ESMTP id 9CD5BA27FF9; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) X-Original-To: root@listes.minet.net Delivered-To: root@listes.minet.net Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by listes.minet.net (Postfix) with ESMTP id B8C1FA27FEF for <root@listes.minet.net>; Wed, 3 Jun 2015 09:05:46 +0000 (UTC) Received: from localhost (spam.minet.net [192.168.102.97]) by mx1.minet.net (Postfix) with ESMTP id AD28B610F6D for <root@listes.minet.net>; Wed, 3 Jun 2015 11:05:46 +0200 (CEST) Content-Type: multipart/mixed; boundary="----------=_1433322346-12583-0" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 From: "Content-filter at spam.minet.net" <postmaster@minet.net> Date: Wed, 3 Jun 2015 09:05:46 +0000 (UTC) To: <root@listes.minet.net> Message-ID: <VASs-IZaXqmZao@spam.minet.net> Subject: Original subject X-BeenThere: root@listes.minet.net X-Mailman-Version: 2.1.15 Errors-To: root-bounces@listes.minet.net Sender: "root" <root-bounces@listes.minet.net> This is a multi-part message in MIME format... ------------=_1433322346-12583-0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 7bit ===================================================== == File: server/mailet/mailets/src/test/resources/spamMail.eml ===================================================== Return-Path: <root-bounces@listes.minet.net> Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Wed, 03 Jun 2015 11:05:45 +0200 X-Sieve: CMU Sieve 2.4 Received: from smtp.minet.net (smtp.minet.net [192.168.102.18]) by mx1.minet.net (Postfix) with ESMTP id F06FE610F72; Wed, 3 Jun 2015 11:05:48 +0200 (CEST) Received: from listes.minet.net (listes.minet.net [192.168.102.29]) by smtp.minet.net (Postfix) with ESMTP id AAB15610F70; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=minet.net; s=mail; t=1433322348; bh=8OtmVRMX7IWWyQo8WQIi5rKeDEQFghSX2r1WN9/pqUk=; h=From:Date:To:Subject:List-Id:List-Unsubscribe:List-Post:List-Help: List-Subscribe:From; b=UkthSFXn5mtPnn7sYvDJIxgCk1O36L0p+hTOnI/xTF2WRMGJyXtLyCdFdE5jQ5gE4 EGNdhwmfjaKsoE7IDtc/4GrPvbnM8i9ojpSOBW1hXJPOeYnRgah/4gsXsMJWvmmq/A 4oTnw8ZswFXiShDmBMyaSEZuVrWTdaPBgUhVhGw8= Received: from listes.minet.net (listes.minet.net [127.0.0.1]) by listes.minet.net (Postfix) with ESMTP id 9CD5BA27FF9; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) X-Original-To: root@listes.minet.net Delivered-To: root@listes.minet.net Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by listes.minet.net (Postfix) with ESMTP id B8C1FA27FEF for <root@listes.minet.net>; Wed, 3 Jun 2015 09:05:46 +0000 (UTC) Received: from localhost (spam.minet.net [192.168.102.97]) by mx1.minet.net (Postfix) with ESMTP id AD28B610F6D for <root@listes.minet.net>; Wed, 3 Jun 2015 11:05:46 +0200 (CEST) Content-Type: multipart/mixed; boundary="----------=_1433322346-12583-0" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 From: "Content-filter at spam.minet.net" <postmaster@minet.net> Date: Wed, 3 Jun 2015 09:05:46 +0000 (UTC) To: <root@listes.minet.net> Message-ID: <VASs-IZaXqmZao@spam.minet.net> Subject: Original subject X-BeenThere: root@listes.minet.net X-Mailman-Version: 2.1.15 Errors-To: root-bounces@listes.minet.net Sender: "root" <root-bounces@listes.minet.net> This is a multi-part message in MIME format... ------------=_1433322346-12583-0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 7bit No viruses were found. ===================================================== == File: server/mailet/mailets/src/test/resources/eml/gmail.eml ===================================================== Return-Path: <aduprat@linagora.com> Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (aduprat@linagora.com) To: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <tellier@linagora.com> From: aduprat <duprat@linagora.com> X-Forwarded-Message-Id: <001a114380a6a260d105467765ab@google.com> Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8a6b@linagora.com> Date: Thu, 19 Jan 2017 20:36:37 +0100 MIME-Version: 1.0 In-Reply-To: <001a114380a6a260d105467765ab@google.com> Content-Type: multipart/mixed; boundary="------------17D96D411CBD55D8239A8C1F" This is a multi-part message in MIME format. --------------17D96D411CBD55D8239A8C1F Content-Type: multipart/alternative; boundary="------------64D716A3DDAEC185D3E67448" --------------64D716A3DDAEC185D3E67448 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit -------- Message transéré -------- Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (duprat@linagora.com) Date : Thu, 19 Jan 2017 19:18:23 +0000 De : Antoine Duprat <duprat@gmail.com> Répondre à : antduprat@gmail.com Pour : aduprat@linagora.com --------------64D716A3DDAEC185D3E67448 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <p><br> </p> ===================================================== == File: server/mailet/mock-smtp-server/README.adoc ===================================================== = James Mock SMTP server This is our custom made Mock SMTP server that we use for some of our tests in James. == Dockerized Mock SMTP server Compile and build the image into a tarball with maven: $ mvn compile jib:buildTar *Note* : You can add the option '-DskipTests' if you want to skip tests After Jib created the image, you can load it into Docker with: $ docker load --input target/jib-image.tar You can alternatively directly build your image directly to a Docker daemon. To to so: $ mvn compile jib:dockerBuild Then run it with: $ docker run --rm -p 25:25 -p 8000:8000 linagora/mock-smtp-server Where ports: * 25 : SMTP * 8000 : HTTP interface for setting mock SMTP server behavior Then you can use the http endpoints. Let's demonstrate them via the standard unix `curl` command. Right after startup, the server should have no emails, no behaviors. ---- $ curl -X GET localhost:8000/smtpBehaviors [] $ curl -X GET localhost:8000/smtpMails [] $ curl -X GET localhost:8000/smtpMailsCount 0 $ ---- Given you send an email on port 25, the counter updates to 1 and you're able to observe the email via the smtpMails endpoint. ---- $ cat mail.txt From: Alice To: Bob ===================================================== == File: server/mailet/mock-smtp-server/src/main/jib/logback.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %highlight([%-5level]) %logger{15} - %msg%n%rEx</pattern> <immediateFlush>false</immediateFlush> </encoder> </appender> <root level="WARN"> <appender-ref ref="CONSOLE" /> </root> <logger name="org.apache.james.mock.smtp.server" level="DEBUG"/> <logger name="org.subethamail.smtp" level="DEBUG"/> </configuration> ===================================================== == File: server/mailet/mock-smtp-server/src/test/java/org/apache/james/mock/smtp/server/ConfigurationClientTest.java ===================================================== /**************************************************************** * 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/LICENSE2.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.mock.smtp.server; import static org.apache.james.mock.smtp.server.Fixture.BEHAVIOR_LIST; import static org.assertj.core.api.Assertions.assertThat; import org.apache.james.core.MailAddress; import org.apache.james.mock.smtp.server.Fixture.MailsFixutre; import org.apache.james.mock.smtp.server.model.Mail; import org.apache.james.mock.smtp.server.model.SMTPExtension; import org.apache.james.mock.smtp.server.model.SMTPExtensions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.google.common.collect.ImmutableList; class ConfigurationClientTest { private ConfigurationClient testee; private HTTPConfigurationServer.RunningStage server; private SMTPBehaviorRepository behaviorRepository; private ReceivedMailRepository mailRepository; @BeforeEach void setUp() { behaviorRepository = new SMTPBehaviorRepository(); mailRepository = new ReceivedMailRepository(); server = HTTPConfigurationServer.onRandomPort(behaviorRepository, mailRepository) .start(); testee = ConfigurationClient.fromServer(server); } ===================================================== == File: server/container/filesystem-api/src/test/resources/classpathTest.txt ===================================================== Non empty ===================================================== == File: server/container/filesystem-api/src/test/resources/class path Test.txt ===================================================== Non empty ===================================================== == File: server/container/core/src/test/resources/JAMES-1593.eml ===================================================== Return-Path: <c@yahoo.com> Received: from 10.6.1.81 (EHLO ws1.comp.us/127.0.0.1) ([10.6.1.81]) by ws1.comp.us (JAMES SMTP Server ) with ESMTP ID 273836343 for <s@yahoo.com>; Fri, 10 Jul 2015 19:30:01 +0000 (UTC) Delivered-To: d@f.com Received: from 10.6.1.53 (EHLO egate3.comp.us) ([10.6.1.53]) by ws1.comp.us (JAMES SMTP Server ) with ESMTP ID 18268234 for <d@f.com>; Wed, 08 Jul 2015 19:35:41 +0000 (UTC) Received: from nm2-vm2.bullet.mail.ne1.yahoo.com (nm2-vm2.bullet.mail.ne1.yahoo.com [98.138.91.18]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by egate3.comp.us (Postfix) with ESMTPS id 5CA816007B for <d@f.com>; Wed, 8 Jul 2015 19:35:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1436384127; bh=FSXIN3+naGGGcYCXqSW4VRdVxpAgX6l36HzbsAmcUMs=; h=To:Date:From:Subject:From:Subject; b=aoCPczTdZENebjurWW5X8+IOGzgTp2AJ2TF0Cg5Zr0wCGPnNa3pzLN7XtpcCkQAaHpzpvSn/WLxVosJiV9ylnDyFTJg/i+ik1937k2LTaCP7Dc9bjqLSrZAjFd+u2YalXanSOXrKIz6L05xrwEeIgBV+IvarvleEZ4/mSRtAwKJJ2w8nZOKX1hxJ1uN/rYMUAhNaNnafHKZ9ZTj6Bb2PWQLKylHy98dq48PJYOe757Ns3I5DhxyS1swVvuNv7ROj1ix+wIK5vgchMliF5C50IAF4HZ9GZwlBCSUUV6C0fiyp7p2MbtDO1cdNGzUUAyrSt9UiwBX/OyIkPcya7Bzxjg== Received: from [98.138.226.176] by nm2.bullet.mail.ne1.yahoo.com with NNFMP; 08 Jul 2015 19:35:27 -0000 Received: from [98.138.226.56] by tm11.bullet.mail.ne1.yahoo.com with NNFMP; 08 Jul 2015 19:35:27 -0000 Received: from [127.0.0.1] by smtp207.mail.ne1.yahoo.com with NNFMP; 08 Jul 2015 19:35:27 -0000 X-Yahoo-Newman-Id: 948689.21253.bm@smtp207.mail.ne1.yahoo.com Message-ID: <948689.21253.bm@smtp207.mail.ne1.yahoo.com> X-Yahoo-Newman-Property: ymail-5 X-YMail-OSG: PKdW3f0VM1mqo5bJtNcAn9nrmSrO6somPjt3dkTFZefq.k9 8mtErk2hfr0pzo.g4.3D1TYDy1yPA52CEt1K7yWtY4G54.wVaqrTbNsp1SHi YOVrR_WNprH82OItTUXOWs4b6tIZjrnQwhvgiYNQ0v0y.5mavYexI7V7vHjE AQau2gFnHDMI4VkGKk5VtkVYo7m9kyLljxFn6JBpDfm2BHCQ6nB44vr_KEGb fu4siLPPBgE3DD2x1jPSgZuePniFPh94ohDe_ZDsbYXPM4Fy1udmEuial5Me lrgOmh8mjeybAFdj_y4kbpHb.xjlxg_AgrZEY5LjdL2_xp8JljEZyvKo5ccA CTVQSOEe5m8qlhRIWMGLqqp3DLOBwgQ4lKfOXyt3.MaFgClF1yPm5aSFxG.g O52rSXRe9QwcFLgeLk3U6h2fuUGnH4Ejw75ni0rPKFEBQn9y0X3vVtjgQPbc K3fZUXI48vD3IjhR4ZdnoRfuJDmdgjmV_MbGVQ_IglrFNWe5dKb0WmCr455A E.B_E_RcROdsq06R72Be7Nap1ySUo X-Yahoo-SMTP: P5ZpI6KswBDOCixizgOFZTojz9DhLg.Dm91rJ0th To: <d@f.com> Date: Wed, 8 Jul 2015 12:35:24 -0700 From: =?UTF-8?B?QmV2ZXJseSBIaWxscyBNRA0==?= <c@yahoo.com> Subject: =?ISO-8859-1?Q?How=20to=20lift=20saggy=20skin,=20without=20surgery=20(Video)?= Msg-Id: <993367577.OlyOp7onoD1vcPAHU+z/IXX2rD.secm@nycaptrentals.com> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0000_047F21AD.5CEFB1C0" Content-Transfer-Encoding: "base64" X-comp-Information: Please contact administrator@comp.com for more information X-comp-ID: 5CA816007B.A1BA5 X-comp-general: Clean X-comp-SpamCheck: spam, SpamAssassin (not cached, score=12.4, required 3, autolearn=disabled, BASE64_LENGTH_79_INF 2.02, BODY_URI_ONLY 1.00, DKIM_ADSP_CUSTOM_MED 0.00, DKIM_SIGNED 0.10, FREEMAIL_FROM 0.00, FROM_EXCESS_BASE64 0.10, HTML_IMAGE_ONLY_12 1.63, HTML_MESSAGE 0.00, HTML_SHORT_LINK_IMG_1 0.14, MIME_HTML_MOSTLY 0.00, ===================================================== == File: server/container/core/src/test/resources/invalid.eml ===================================================== From: XXXX <xxxx@govmu.org> Message-Id: <343A4DE5-9329-4487-A570-29A91E669CB9@govmu.org> Content-Type: multipart/alternative; boundary="Apple-Mail=_F2D44D4D-8BA8-476D-B874-23E3A91AB142" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.400.131.1.6\)) Subject: YYYY Date: Wed, 5 Feb 2025 10:28:42 +0400 X-Mailer: Apple Mail (2.3826.400.131.1.6) --Apple-Mail=_F2D44D4D-8BA8-476D-B874-23E3A91AB142 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 This email (including any attachments) is intended for the person to = whom it is addressed. If you are not the addressee or have received this = email in error, please notify the sender immediately, delete it from = your system and do not copy, disclose or otherwise act upon it. Click = Here <https://www.sicom.mu/en/email-disclaimer> to consult the full = disclaimer. --Apple-Mail=_F2D44D4D-8BA8-476D-B874-23E3A91AB142 Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_E197F722-9914-4A5D-854C-81A1C1BED428" --Apple-Mail=_E197F722-9914-4A5D-854C-81A1C1BED428 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 href=3D"https://www.sicom.mu/en/email-disclaimer" target=3D"_blank"><span = style=3D"color: rgb(51, 153, 255);">Click Here</span></a></u><span = class=3D"Apple-converted-space"> </span>to consult the full = disclaimer.</span></div></div></blockquote></div><br></div></div></body></= html>= --Apple-Mail=_E197F722-9914-4A5D-854C-81A1C1BED428 Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=Outlook-vehhhgpe.png Content-Type: image/png; x-unix-mode=0666; name="Outlook-vehhhgpe.png" Content-Id: <8175aa72-15e0-4f9b-b5d4-fe005f7490ad> iVBORw ===================================================== == File: server/container/core/src/test/resources/mail-containing-unicode-characters.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id CCCA943 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393 for <bob@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: quoted Message-ID: <f4d046a8-e563-1e92-dbd9-c5038603e3a2@james.org> Date: Wed, 22 Jan 2020 11:11:38 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Unicode €uro symbol. ===================================================== == File: server/container/guice/memory/README.md ===================================================== # James Memory server In order to build both the ZIP and docker packaging, run: ``` mvn clean install -DskipTests ``` ## ZIP distribution Available in `target` directory, the ZIP include detailed instructions. ## Docker distribution To import the image locally: ``` docker image load -i target/jib-image.tar ``` Then run it: ``` docker run apache/james:memory-latest ``` For security reasons you are required to generate your own keystore, that you can mount into the container via a volume: ``` keytool -genkey -alias james -keyalg RSA -keystore keystore docker run -v $PWD/keystore:/root/conf/keystore apache/james:cassandra-latest ``` Use the [JAVA_TOOL_OPTIONS environment option](https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#jvm-flags) to pass extra JVM flags. For instance: ``` docker run -e "JAVA_TOOL_OPTIONS=-Xmx500m -Xms500m" apache/james:memory-latest ``` [Glowroot APM](https://glowroot.org/) is packaged as part of the docker distribution to easily enable valuable performances insights. Disabled by default, its java agent can easily be enabled: ``` docker run -e "JAVA_TOOL_OPTIONS=-javaagent:/root/glowroot.jar" apache/james:memory-latest ``` The [CLI](https://james.apache.org/server/manage-cli.html) can easily be used: ``` ===================================================== == File: server/container/guice/configuration/src/test/resources/b.properties ===================================================== prop=value2 ===================================================== == File: server/container/guice/configuration/src/test/resources/a.properties ===================================================== prop=value1 keyByList=value1, value2, value3, value4, value5 thisIsEmpty= ===================================================== == File: server/container/guice/configuration/src/test/resources/env.properties ===================================================== keyByEnv=${env:PROPERTIES_PROVIDER_ENV_VARIABLES} ===================================================== == File: server/container/guice/common/src/test/resources/eml/mail-containing-unicode-characters.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id CCCA943 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393 for <bob@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: quoted Message-ID: <f4d046a8-e563-1e92-dbd9-c5038603e3a2@james.org> Date: Wed, 22 Jan 2020 11:11:38 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Unicode €uro symbol. ===================================================== == File: server/container/guice/common/src/test/resources/test.properties ===================================================== # Configuration file for cassandra mailbox cassandra.nodes=127.0.0.1:9142 cassandra.keyspace=apache_james cassandra.replication.factor=1 ===================================================== == File: server/container/guice/protocols/webadmin/src/test/resources/webadmin-two.properties ===================================================== extensions.routes=org.apache.custom.webadmin.CustomRoute,org.apache.custom.webadmin.AnotherCustomRoute ===================================================== == File: server/container/guice/protocols/webadmin/src/test/resources/webadmin-one.properties ===================================================== extensions.routes=org.apache.custom.webadmin.CustomRoute ===================================================== == File: server/container/guice/protocols/webadmin/src/test/resources/webadmin-empty.properties ===================================================== extensions.routes= ===================================================== == File: server/container/guice/protocols/webadmin/src/test/resources/webadmin-none.properties ===================================================== ===================================================== == File: server/container/guice/utils/src/test/resources/extensions-empty.properties ===================================================== guice.extension.module= ===================================================== == File: server/container/guice/utils/src/test/resources/extensions-two.properties ===================================================== guice.extension.module=org.apache.custom.extensions.CustomExtension,org.apache.custom.extension.AnotherCustomExtension ===================================================== == File: server/container/guice/utils/src/test/resources/extensions-none.properties ===================================================== ===================================================== == File: server/container/guice/utils/src/test/resources/extensions-one.properties ===================================================== guice.extension.module=org.apache.custom.extensions.CustomExtension ===================================================== == File: server/container/guice/testing/custom-mailets/README.md ===================================================== # How to This project is used to generate custom mailet / matcher used in unit tests of the underlying Guice project. This associated JAR is in the test resources. Run: ``` mvn clean install ``` And overwrite it in *server/container/guice/mailet/src/test/resources/recursive/extensions-jars/\*.jar* to update it. ===================================================== == File: server/container/guice/cassandra/src/test/resources/modules/mailbox/cassandra.properties ===================================================== mailbox.max.retry.acl=1 mailbox.max.retry.modseq=2 mailbox.max.retry.uid=3 mailbox.max.retry.message.flags.update=4 mailbox.max.retry.message.id.flags.update=5 fetch.advance.row.count=6 chunk.size.message.read=7 chunk.size.expunge=8 mailbox.blob.part.size=9 attachment.v2.migration.read.timeout=10 message.attachmentids.read.timeout=11 ===================================================== == File: server/container/mailbox-jmx/src/test/resources/eml/frnog.eml ===================================================== Message-ID: <556D7ED7.2090108> Date: Tue, 2 Jun 2015 12:00:55 +0200 From: sender <sender@domain.com> MIME-Version: 1.0 To: <list@james.org> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Bonjour Je cherche un partenaire. Merci d'avance ! Cordialement, ===================================================== == File: server/data/data-library/src/test/resources/sieve/my_sieve ===================================================== require ["reject"]; if size :over 100K { reject "Email too big"; } ===================================================== == File: server/data/data-library/src/test/resources/cucumber/rewrite_tables.feature ===================================================== Feature: Rewrite Tables tests @readonly Scenario: rewrite tables should be empty when none defined Then mappings should be empty # Regexp mapping Scenario: stored regexp mapping should be retrieved when one mapping matching Given store "(.*)@localhost:user@localhost" regexp mapping for user "test" at domain "localhost" Then mappings for user "test" at domain "localhost" should contain only "user@localhost" Scenario: stored regexp mapping should be retrieved when two mappings matching Given store "(.*)@localhost:user@localhost" regexp mapping for user "test" at domain "localhost" And store "tes(.+)@localhost:user2@localhost" regexp mapping for user "test" at domain "localhost" Then mappings for user "test" at domain "localhost" should contain only "user@localhost, user2@localhost" Scenario: stored regexp mapping should not be retrieved by another user Given store "(.*)@localhost:user@localhost" regexp mapping for user "test" at domain "localhost" And store "tes(.+)@localhost:user2@localhost" regexp mapping for user "test" at domain "localhost" Then mappings for user "test2" at domain "localhost" should be empty Scenario: removing a stored regexp mapping should work Given store "(.*)@localhost:user@localhost" regexp mapping for user "test" at domain "localhost" And store "tes(.+)@localhost:user2@localhost" regexp mapping for user "test" at domain "localhost" When user "test" at domain "localhost" removes a regexp mapping "tes(.+)@localhost:user2@localhost" Then mappings for user "test" at domain "localhost" should contain only "user@localhost" Scenario: storing an invalid regexp mapping should not work When store an invalid ".*):" regexp mapping for user "test" at domain "localhost" Then a "InvalidRegexException" exception should have been thrown Scenario: storing a wrong formatted regexp mapping should not be retrieved Given store "(.*)@localhost" regexp mapping for user "test" at domain "localhost" Then mappings for user "test" at domain "localhost" should be empty Scenario: chained stored regexp mapping should be retrieved when two levels Given store "(.*)@localhost:user@localhost" regexp mapping for user "test" at domain "localhost" And store "use(.+)@localhost:final@localhost" regexp mapping for user "user" at domain "localhost" Then mappings for user "test" at domain "localhost" should contain only "final@localhost" # Address mapping Scenario: stored address mapping should be retrieved when one mapping matching Given store "test@localhost2" address mapping for user "test" at domain "localhost" Then mappings for user "test" at domain "localhost" should contain only "test@localhost2" Scenario: stored address mapping should be retrieved when two mappings matching Given store "test@localhost2" address mapping for user "test" at domain "localhost" And store "test@james" address mapping for user "test" at domain "localhost" ===================================================== == File: server/data/data-postgres/src/test/resources/log4j.properties ===================================================== log4j.rootLogger=WARN, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout # Print the date in ISO 8601 format log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ===================================================== == File: server/data/data-postgres/pom.xml ===================================================== <?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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.james</groupId> <artifactId>james-server</artifactId> <version>3.9.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <artifactId>james-server-data-postgres</artifactId> <name>Apache James :: Server :: Data :: Postgres</name> <dependencies> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-backends-postgres</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>apache-james-backends-postgres</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>blob-api</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>blob-memory</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-core</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-data-api</artifactId> </dependency> <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-data-api</artifactId> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> ===================================================== == File: server/data/data-ldap/src/test/resources/usersrepository-enableVirtualHosting.xml ===================================================== <usersrepository name="LocalUsers" class="org.apache.james.user.ldap.ReadOnlyUsersLDAPRepository" ldapHost="ldap://myldapserver:389" principal="uid=ldapUser,ou=system" credentials="password" userBase="ou=People,o=myorg.com,ou=system" userIdAttribute="uid" userObjectClass="person"> <enableVirtualHosting>true</enableVirtualHosting> </usersrepository> ===================================================== == File: server/data/data-ldap/src/test/resources/invalid/ldif-files/populate.ldif ===================================================== dn: ou=people, dc=james,dc=org ou: people objectClass: organizationalUnit dn: uid=james-user, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user cn: james-user sn: james-user userPassword: secret description: James user ===================================================== == File: server/data/data-ldap/src/test/resources/localpartLogin/ldif-files/populate.ldif ===================================================== dn: ou=people, dc=james,dc=org ou: people objectClass: organizationalUnit dn: ou=empty, dc=james,dc=org ou: empty objectClass: organizationalUnit dn: ou=whatever, dc=james,dc=org ou: whatever objectClass: organizationalUnit dn: uid=james-user, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user cn: james-user sn: james-user mail: james-user@james.org userPassword: secret description: James user dn: uid=james-user-app1, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user-app1 cn: james-user sn: james-user mail: james-user@james.org userPassword: secret description: James user App 1 dn: uid=james-user-app2, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user-app2 cn: james-user sn: james-user mail: james-user@james.org userPassword: secret description: James user App 2 dn: uid=alice, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: alice cn: alice-cn sn: alice-sn mail: alice@james.org userPassword: secret description: Alice user dn: uid=alice-app1, ou=people, dc=james,dc=org objectClass: inetOrgPerson ===================================================== == File: server/data/data-ldap/src/test/resources/ldif-files/populate.ldif ===================================================== dn: ou=people, dc=james,dc=org ou: people objectClass: organizationalUnit dn: ou=empty, dc=james,dc=org ou: empty objectClass: organizationalUnit dn: ou=whatever, dc=james,dc=org ou: whatever objectClass: organizationalUnit dn: uid=james-user, ou=people, dc=james,dc=org objectClass: inetOrgPerson uid: james-user cn: james-user sn: james-user mail: james-user@james.org userPassword: secret description: James user dn: uid=bob, ou=whatever, dc=james,dc=org objectClass: inetOrgPerson uid: bob cn: bob sn: bob mail: bob@extra.org userPassword: secret description: bob user ===================================================== == File: server/data/data-ldap/src/test/resources/usersrepository-supportsVirtualHosting.xml ===================================================== <usersrepository name="LocalUsers" class="org.apache.james.user.ldap.ReadOnlyUsersLDAPRepository" ldapHost="ldap://myldapserver:389" principal="uid=ldapUser,ou=system" credentials="password" userBase="ou=People,o=myorg.com,ou=system" userIdAttribute="uid" userObjectClass="person"> <supportsVirtualHosting>true</supportsVirtualHosting> </usersrepository> ===================================================== == File: server/data/data-ldap/src/test/resources/usersrepository-default.xml ===================================================== <usersrepository name="LocalUsers" class="org.apache.james.user.ldap.ReadOnlyUsersLDAPRepository" ldapHost="ldap://myldapserver:389" principal="uid=ldapUser,ou=system" credentials="password" userBase="ou=People,o=myorg.com,ou=system" userIdAttribute="uid" userObjectClass="person"> </usersrepository> ===================================================== == File: server/data/data-jpa/src/test/resources/log4j.properties ===================================================== log4j.rootLogger=WARN, A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout # Print the date in ISO 8601 format log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ===================================================== == File: server/data/data-file/src/test/resources/org/apache/james/mailrepository/testdata/Inbox ===================================================== From - Sat Sep 16 14:01:26 2006 X-Account-Key: account4 X-UIDL: Mail1158408075937-0 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000 Message-ID: <12617107.11158408076390.JavaMail.maurer@byteacti-757792> MIME-Version: 1.0 Return-Path: <nm@localhost> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Delivered-To: test@localhost Received: from localhost ([127.0.0.1]) by byteacti-757792 (JAMES SMTP Server 3.0-dev) with SMTP ID 842 for <test@localhost>; Sat, 16 Sep 2006 14:01:14 +0200 (CEST) Date: Sat, 16 Sep 2006 14:01:14 +0200 (CEST) From: nm@localhost invalid test: test test From - Sat Sep 16 14:02:40 2006 X-Account-Key: account4 X-UIDL: Mail1158408158171-1 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000 Message-ID: <3534544.31158408158203.JavaMail.maurer@byteacti-757792> MIME-Version: 1.0 Return-Path: <nm@localhost> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Delivered-To: test@localhost Received: from localhost ([127.0.0.1]) by byteacti-757792 (JAMES SMTP Server 3.0-dev) with SMTP ID 317 for <test@localhost>; Sat, 16 Sep 2006 14:02:38 +0200 (CEST) Date: Sat, 16 Sep 2006 14:02:38 +0200 (CEST) From: nm@localhost testmail test: test test ===================================================== == File: server/data/data-jmap/src/test/java/org/apache/james/jmap/api/upload/UploadUsageRepositoryContract.scala ===================================================== package org.apache.james.jmap.api.upload import org.apache.james.core.Username import org.apache.james.core.quota.QuotaSizeUsage import org.apache.james.jmap.api.upload.UploadUsageRepositoryContract.USER_NAME import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import reactor.core.publisher.Mono import reactor.core.scala.publisher.SMono object UploadUsageRepositoryContract { val USER_NAME = Username.of("james@abc.com") } trait UploadUsageRepositoryContract { def uploadUsageRepository: UploadUsageRepository def resetCounterToZero(): Unit = { Mono.from(uploadUsageRepository.resetSpace(USER_NAME, QuotaSizeUsage.size(0))).block } @Test def increaseSpaceShouldIncreaseSuccessfully(): Unit = { SMono.fromPublisher(uploadUsageRepository.increaseSpace(USER_NAME, QuotaSizeUsage.size(100))).block() val expected = SMono.fromPublisher(uploadUsageRepository.getSpaceUsage(USER_NAME)).block() assertThat(expected.asLong()).isEqualTo(100) } @Test def decreaseSpaceShouldDecreaseSuccessfully(): Unit = { SMono.fromPublisher(uploadUsageRepository.increaseSpace(USER_NAME, QuotaSizeUsage.size(200))).block() SMono.fromPublisher(uploadUsageRepository.decreaseSpace(USER_NAME, QuotaSizeUsage.size(100))).block() val expected = SMono.fromPublisher(uploadUsageRepository.getSpaceUsage(USER_NAME)).block() assertThat(expected.asLong()).isEqualTo(100) } @Test def resetSpaceShouldResetSuccessfully(): Unit = { SMono.fromPublisher(uploadUsageRepository.increaseSpace(USER_NAME, QuotaSizeUsage.size(200))).block() SMono.fromPublisher(uploadUsageRepository.resetSpace(USER_NAME, QuotaSizeUsage.size(99))).block() val expected = SMono.fromPublisher(uploadUsageRepository.getSpaceUsage(USER_NAME)).block() assertThat(expected.asLong()).isEqualTo(99) } @Test def getSpaceUsageShouldReturnZeroWhenRecordDoesNotExist(): Unit = { assertThat(SMono.fromPublisher(uploadUsageRepository.getSpaceUsage(Username.of("aaa"))).block().asLong()).isEqualTo(0) } } ===================================================== == File: server/grafana-reporting/prometheus-datasource/README.md ===================================================== # Dashboards for James on top of Prometheus / Grafana The boards are slightly different than what we used to do with ES reporter, as we count now on Prometheus to scrap metrics from the /metrics endpoint exposed from James. This is just a rough conversion for starters, it will likely need more refining over time. # Grafana reporting This is a collection of Grafana dashboards to display James metrics. ## Expose metrics for Prometheus collection To enable James metrics, add ``extensions.routes`` to [webadmin.properties]( https://github.com/apache/james-project/blob/master/server/apps/distributed-app/docs/modules/ROOT/pages/configure/webadmin.adoc) file: ``` extensions.routes=org.apache.james.webadmin.dropwizard.MetricsRoutes ``` ## Configure Prometheus Data source You need to set up [Prometheus](https://prometheus.io/docs/prometheus/latest/getting_started/) first to scrape James metrics.\ Add Apache James WebAdmin Url or IP address to `prometheus.yaml` configuration file. ``` scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'WebAdmin url Example' scrape_interval: 5s metrics_path: /metrics static_configs: - targets: ['james-webamin-url'] - job_name: 'WebAdmin IP Example' scrape_interval: 5s metrics_path: /metrics static_configs: - targets: ['192.168.100.10:8000'] ``` For Kubernetes deployment, we recommend using Prometheus `ServiceMonitor` to collect James metrics through James Webadmin service. Please see our James Helm-chart for more information. ## Connect Data source to Grafana Add Prometheus data source to Grafana.\ You can do this either from [Grafana UI](https://prometheus.io/docs/visualization/grafana/) or from a [configuration file](https://grafana.com/docs/grafana/latest/datasources/prometheus/). The following `docker-compose.yaml` will help you install a simple Prometheus/ Grafana stack : ``` version: '3' #Metric monitoring grafana: image: grafana/grafana:latest ===================================================== == File: server/grafana-reporting/es-datasource/README.md ===================================================== # Grafana reporting This is a collection of Grafana dashboards to display James metrics. ## Run Grafana The following command allow you to run a fresh grafana server : ``` docker run -i -p 3000:3000 grafana/grafana ``` ## Configure a data source Once running, you need to set up an [ElasticSearch data-source](https://grafana.com/docs/grafana/latest/datasources/elasticsearch/). You can do this either from UI or from a configuration file. ## Setting up via UI - name it DS_JAMES_ES - select proxy mode - Select version 6.x of ElasticSearch - make the URL point your ES node - Specify the index name. By default, it should be : ``` [james-metrics-]YYYY-MM ``` ## Setting up using a configuration file Look up file grafana-datasource.yaml from Grafana and add following data source into it: ``` apiVersion: 1 datasources: - name: DS_JAMES_ES type: elasticsearch access: proxy database: "[james-metrics-]YYYY-MM" url: http://elasticsearch:9200 version: 6 editable: true jsonData: interval: Daily timeField: "@timestamp" ``` ## Getting dashboards Import the different dashboard JSON files in this directory to Grafana via UI ===================================================== == File: mailet/icalendar/src/test/resources/ics_in_header.eml ===================================================== MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_80_888179120.1536742699653" From: Alice <alice@linagora.com> Message-ID: <82eb227b-d3e1-3d7a-3220-8a1b4e96a85b@linagora.com> To: Bob <bob@linagora.com> Date: Wed, 12 Sep 2018 10:58:18 +0200 Subject: Event Invitation Reply (Accepted): Point Produit ------=_Part_80_888179120.1536742699653 BEGIN:VCALENDAR PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN VERSION:2.0 METHOD:REPLY BEGIN:VEVENT CREATED:20180911T144134Z LAST-MODIFIED:20180912T085818Z DTSTAMP:20180912T085818Z UID:f1514f44bf39311568d64072945fc3b2973debebb0d550e8c841f3f0604b2481e047fe b2aab16e43439a608f28671ab7c10e754cbbe63441a01ba232a553df751eb0931728d67672 SUMMARY:Point Produit PRIORITY:5 ORGANIZER;CN=Bob;X-OBM-ID=348:mailto:bob@linagora.com ATTENDEE;CN=Alice;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL;X-OBM-ID=810: mailto:alice@linagora.com DTSTART:20180919T123000Z DURATION:PT1H TRANSP:OPAQUE SEQUENCE:0 X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for X property. Rem oving entire property: CLASS:PUBLIC X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:Téléphone END:VEVENT END:VCALENDAR Content-class: urn:content-classes:calendarmessage Content-type: text/calendar; method=REPLY; charset=UTF-8 Content-transfer-encoding: 8BIT Content-Disposition: attachment ------=_Part_80_888179120.1536742699653-- ===================================================== == File: mailet/icalendar/src/test/resources/ics/no_event.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483703436 VERSION:2.0 METHOD:REQUEST END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/meeting_without_dtstamp.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483703436 VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT CREATED:20170106T115035Z LAST-MODIFIED:20170106T115036Z DTSTART:20170111T090000Z DURATION:PT1H30M TRANSP:OPAQUE SEQUENCE:0 SUMMARY:Sprint planning #23 DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=128;CN=Raphael OUAZANA:MAILTO:ouazana@linagora.com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:Hangout CATEGORIES: X-OBM-COLOR: UID:f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047fe b2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Matthieu EXT_BAECHLER;PARTSTAT=NEE DS-ACTION;X-OBM-ID=302:MAILTO:baechler@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Laura ROYET;PARTSTAT=NEEDS-ACTION; X-OBM-ID=723:MAILTO:royet@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Raphael OUAZANA;PARTSTAT=ACCEPTED; X-OBM-ID=128:MAILTO:ouazana@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Luc DUZAN;PARTSTAT=NEEDS-ACTION;X- OBM-ID=715:MAILTO:duzan@linagora.com ATTENDEE;CUTYPE=RESOURCE;CN=Salle de reunion Lyon;PARTSTAT=ACCEPTED;X-OBM- ID=66:MAILTO:noreply@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Antoine DUPRAT;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=453:MAILTO:duprat@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Benoît TELLIER;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=623:MAILTO:tellier@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Quynh Quynh N NGUYEN;PARTSTAT=NEED S-ACTION;X-OBM-ID=769:MAILTO:nguyen@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/ics_with_error.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483703436 VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT CREATED:20170106T115035Z LAST-MODIFIED:20170106T115036Z DTSTAMP:20170106T115036Z DTSTART;TZID="Pacific Time (US & Canada),Tijuana":20041011T223000 DURATION:PT1H30M TRANSP:OPAQUE SEQUENCE:0 VEVENT:62 SUMMARY:Sprint planning #23 DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=128;CN=Raphael OUAZANA:MAILTO:ouazana@linagora.com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:Hangout CATEGORIES: X-OBM-COLOR: UID:f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047fe b2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Matthieu EXT_BAECHLER;PARTSTAT=NEE DS-ACTION;X-OBM-ID=302:MAILTO:baechler@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Laura ROYET;PARTSTAT=NEEDS-ACTION; X-OBM-ID=723:MAILTO:royet@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Raphael OUAZANA;PARTSTAT=ACCEPTED; X-OBM-ID=128:MAILTO:ouazana@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Luc DUZAN;PARTSTAT=NEEDS-ACTION;X- OBM-ID=715:MAILTO:duzan@linagora.com ATTENDEE;CUTYPE=RESOURCE;CN=Salle de reunion Lyon;PARTSTAT=ACCEPTED;X-OBM- ID=66:MAILTO:noreply@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Antoine DUPRAT;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=453:MAILTO:duprat@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Benoît TELLIER;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=623:MAILTO:tellier@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Quynh Quynh N NGUYEN;PARTSTAT=NEED S-ACTION;X-OBM-ID=769:MAILTO:nguyen@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/meeting_without_sequence.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483439571 VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT CREATED:20170103T103250Z LAST-MODIFIED:20170103T103250Z DTSTAMP:20170103T103250Z DTSTART:20170120T100000Z DURATION:PT30M TRANSP:OPAQUE SUMMARY:Sprint Social #3 Demo DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=468;CN=Attendee 1:MAILTO:attendee1@linagora. com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:hangout CATEGORIES: X-OBM-COLOR: UID:f1514f44bf39311568d64072ac247c17656ceafde3b4b3eba961c8c5184cdc6ee047fe b2aab16e43439a608f28671ab7c10e754c301b1e32001ad51dd20eac2fc7af20abf4093bbe ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Attendee 2;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=348:MAILTO:attendee2@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/meeting_2.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483439571 VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT CREATED:20170103T103250Z LAST-MODIFIED:20170103T103250Z DTSTAMP:20170103T103250Z DTSTART:20170120T100000Z DURATION:PT30M TRANSP:OPAQUE SEQUENCE:0 SUMMARY:Sprint Social #3 Demo DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=468;CN=Attendee 1:MAILTO:attendee1@linagora. com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:hangout CATEGORIES: X-OBM-COLOR: UID:f1514f44bf39311568d64072ac247c17656ceafde3b4b3eba961c8c5184cdc6ee047fe b2aab16e43439a608f28671ab7c10e754c301b1e32001ad51dd20eac2fc7af20abf4093bbe ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Attendee 2;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=348:MAILTO:attendee2@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/meeting_without_uid.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483439571 VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT CREATED:20170103T103250Z LAST-MODIFIED:20170103T103250Z DTSTAMP:20170103T103250Z DTSTART:20170120T100000Z DURATION:PT30M TRANSP:OPAQUE SEQUENCE:0 SUMMARY:Sprint Social #3 Demo DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=468;CN=Attendee 1:MAILTO:attendee1@linagora. com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:hangout CATEGORIES: X-OBM-COLOR: ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Attendee 2;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=348:MAILTO:attendee2@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/meeting.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483703436 VERSION:2.0 METHOD:REQUEST BEGIN:VEVENT CREATED:20170106T115035Z LAST-MODIFIED:20170106T115036Z DTSTAMP:20170106T115036Z DTSTART:20170111T090000Z DURATION:PT1H30M TRANSP:OPAQUE SEQUENCE:0 SUMMARY:Sprint planning #23 DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=128;CN=Raphael OUAZANA:MAILTO:ouazana@linagora.com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:Hangout CATEGORIES: X-OBM-COLOR: UID:f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047fe b2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Matthieu EXT_BAECHLER;PARTSTAT=NEE DS-ACTION;X-OBM-ID=302:MAILTO:baechler@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Laura ROYET;PARTSTAT=NEEDS-ACTION; X-OBM-ID=723:MAILTO:royet@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Raphael OUAZANA;PARTSTAT=ACCEPTED; X-OBM-ID=128:MAILTO:ouazana@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Luc DUZAN;PARTSTAT=NEEDS-ACTION;X- OBM-ID=715:MAILTO:duzan@linagora.com ATTENDEE;CUTYPE=RESOURCE;CN=Salle de reunion Lyon;PARTSTAT=ACCEPTED;X-OBM- ID=66:MAILTO:noreply@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Antoine DUPRAT;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=453:MAILTO:duprat@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Benoît TELLIER;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=623:MAILTO:tellier@linagora.com ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Quynh Quynh N NGUYEN;PARTSTAT=NEED S-ACTION;X-OBM-ID=769:MAILTO:nguyen@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/icalendar/src/test/resources/ics/meeting_without_method.ics ===================================================== BEGIN:VCALENDAR PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR CALSCALE:GREGORIAN X-OBM-TIME:1483439571 VERSION:2.0 BEGIN:VEVENT CREATED:20170103T103250Z LAST-MODIFIED:20170103T103250Z DTSTAMP:20170103T103250Z DTSTART:20170120T100000Z DURATION:PT30M TRANSP:OPAQUE SEQUENCE:0 SUMMARY:Sprint Social #3 Demo DESCRIPTION: CLASS:PUBLIC PRIORITY:5 ORGANIZER;X-OBM-ID=468;CN=Attendee 1:MAILTO:attendee1@linagora. com X-OBM-DOMAIN:linagora.com X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922 LOCATION:hangout CATEGORIES: X-OBM-COLOR: UID:f1514f44bf39311568d64072ac247c17656ceafde3b4b3eba961c8c5184cdc6ee047fe b2aab16e43439a608f28671ab7c10e754c301b1e32001ad51dd20eac2fc7af20abf4093bbe ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Attendee 2;PARTSTAT=NEEDS-ACTI ON;X-OBM-ID=348:MAILTO:attendee2@linagora.com END:VEVENT END:VCALENDAR ===================================================== == File: mailet/standard/src/test/resources/mime/sendToRemoteHttp.mime ===================================================== Return-Path: <aduprat@linagora.com> Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (aduprat@linagora.com) To: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <tellier@linagora.com> From: aduprat <duprat@linagora.com> X-Forwarded-Message-Id: <001a114380a6a260d105467765ab@google.com> Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8a6b@linagora.com> Date: Thu, 19 Jan 2017 20:36:37 +0100 MIME-Version: 1.0 In-Reply-To: <001a114380a6a260d105467765ab@google.com> Content-Type: multipart/mixed; boundary="------------17D96D411CBD55D8239A8C1F" This is a multi-part message in MIME format. --------------17D96D411CBD55D8239A8C1F Content-Type: multipart/alternative; boundary="------------64D716A3DDAEC185D3E67448" --------------64D716A3DDAEC185D3E67448 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit -------- Message transéré -------- Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (duprat@linagora.com) Date : Thu, 19 Jan 2017 19:18:23 +0000 De : Antoine Duprat <duprat@gmail.com> Répondre à : antduprat@gmail.com Pour : aduprat@linagora.com --------------64D716A3DDAEC185D3E67448 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <p><br> </p> <div class="moz-forward-container"><br> ===================================================== == File: mailet/standard/src/test/resources/mime/gmail.mime ===================================================== Return-Path: <aduprat@linagora.com> Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (aduprat@linagora.com) To: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <tellier@linagora.com> From: aduprat <duprat@linagora.com> X-Forwarded-Message-Id: <001a114380a6a260d105467765ab@google.com> Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8a6b@linagora.com> Date: Thu, 19 Jan 2017 20:36:37 +0100 MIME-Version: 1.0 In-Reply-To: <001a114380a6a260d105467765ab@google.com> Content-Type: multipart/mixed; boundary="------------17D96D411CBD55D8239A8C1F" This is a multi-part message in MIME format. --------------17D96D411CBD55D8239A8C1F Content-Type: multipart/alternative; boundary="------------64D716A3DDAEC185D3E67448" --------------64D716A3DDAEC185D3E67448 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit -------- Message transéré -------- Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (duprat@linagora.com) Date : Thu, 19 Jan 2017 19:18:23 +0000 De : Antoine Duprat <duprat@gmail.com> Répondre à : antduprat@gmail.com Pour : aduprat@linagora.com --------------64D716A3DDAEC185D3E67448 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <p><br> </p> <div class="moz-forward-container"><br> ===================================================== == File: mailet/standard/src/test/resources/mime/headerFolded.mime ===================================================== Return-Path: <duprat@linagora.com> Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (duprat@linagora.com) To: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <tellier@linagora.com> From: aduprat <duprat@linagora.com> X-Forwarded-Message-Id: <001a114380a6a260d105467765ab@google.com> Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8a6b@linagora.com> Date: Thu, 19 Jan 2017 20:36:37 +0100 MIME-Version: 1.0 In-Reply-To: <001a114380a6a260d105467765ab@google.com> Content-Type: multipart/mixed; boundary="------------17D96D411CBD55D8239A8C1F" This is a multi-part message in MIME format. --------------17D96D411CBD55D8239A8C1F Content-Type: multipart/alternative; boundary="------------64D716A3DDAEC185D3E67448" --------------64D716A3DDAEC185D3E67448 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit -------- Message transéré -------- Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (duprat@linagora.com) Date : Thu, 19 Jan 2017 19:18:23 +0000 De : Antoine Duprat <duprat@gmail.com> Répondre à : antduprat@gmail.com Pour : aduprat@linagora.com --------------64D716A3DDAEC185D3E67448 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <p><br> </p> ===================================================== == File: mailet/standard/src/test/resources/mime/space.eml ===================================================== Content-Type: multipart/mixed; boundary="------------gwA6NAbT8Pk0FYCy0yoPh61m" Message-ID: <1745dbd6-f23b-44d0-be4c-9b9472c50348@linagora.com> Date: Tue, 27 Feb 2024 07:38:14 +0100 MIME-Version: 1.0 To: BT TEST <xxx@linagora.com> From: "xxx@linagora.com" <xxx@linagora.com> Subject: Space This is a multi-part message in MIME format. --------------gwA6NAbT8Pk0FYCy0yoPh61m Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit space in attachment filename --------------gwA6NAbT8Pk0FYCy0yoPh61m Content-Type: application/pdf Content-Disposition: attachment; filename=Vietnam Airline.pdf Content-Transfer-Encoding: base64 JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp4nN1aS6/buhHe61foD1ghh28g0OIC3XTVAgfooujC9jm+ --------------gwA6NAbT8Pk0FYCy0yoPh61m-- ===================================================== == File: mailet/standard/src/test/resources/mime/incorrect-headers.mime ===================================================== Return-Path: <james@linagora.com> Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (james@linagora.com) To: =?UTF-8?Q?Beno=c3=aet_SOMEONE?= <someone@linagora.com> From: james <james@linagora.com> X-Forwarded-Message-Id: <001a114380a6a260d105467765ab@google.com> Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8a6b@linagora.com> Date: Thu, 19 Jan 2017 20:36:37 +0100 MIME-Version: 1.0 In-Reply-To: <001a114380a6a260d105467765ab@google.com> Content-Type: multipart/mixed;charset=charset=us-ascii; boundary="------------17D96D411CBD55D8239A8C1F" This is a multi-part message in MIME format. --------------17D96D411CBD55D8239A8C1F Content-Type: multipart/alternative; boundary="------------64D716A3DDAEC185D3E67448" --------------64D716A3DDAEC185D3E67448 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit -------- Message transéré -------- Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 (CET) (jamef@linagora.com) Date : Thu, 19 Jan 2017 19:18:23 +0000 De : James <james@gmail.com> Répondre à : james@gmail.com Pour : james@linagora.com --------------64D716A3DDAEC185D3E67448 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <p><br> </p> <div class="moz-forward-container"><br> ===================================================== == File: mailet/standard/LICENSE.apache ===================================================== Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally ===================================================== == File: mailet/standard/LICENSE.activation ===================================================== COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1. Definitions. 1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. 1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. 1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. 1.4. Executable means the Covered Software in any form other than Source Code. 1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. 1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. 1.7. License means this document. 1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. Modifications means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; B. Any new file that contains any part of the Original Software or previous Modification; or C. Any new file that is contributed or otherwise made available under the terms of this License. 1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. 1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. 1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a)?the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b)?ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). (c) The licenses granted in Sections?2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. (d) Notwithstanding Section?2.1(b) above, no patent license is granted: (1)?for code that You delete from the Original Software, or (2)?for infringements caused by: (i)?the modification of the Original Software, or (ii)?the combination of the Original Software with other software or devices. 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1)?Modifications made by that Contributor (or portions thereof); and (2)?the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) The licenses granted in Sections?2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. ===================================================== == File: mailet/standard/LICENSE.mail ===================================================== COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1. Definitions. 1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. 1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. 1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. 1.4. Executable means the Covered Software in any form other than Source Code. 1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. 1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. 1.7. License means this document. 1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. Modifications means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; B. Any new file that contains any part of the Original Software or previous Modification; or C. Any new file that is contributed or otherwise made available under the terms of this License. 1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. 1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. 1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a)?the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b)?ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. 2.1. The Initial Developer Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). (c) The licenses granted in Sections?2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. (d) Notwithstanding Section?2.1(b) above, no patent license is granted: (1)?for code that You delete from the Original Software, or (2)?for infringements caused by: (i)?the modification of the Original Software, or (ii)?the combination of the Original Software with other software or devices. 2.2. Contributor Grant. Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1)?Modifications made by that Contributor (or portions thereof); and (2)?the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) The licenses granted in Sections?2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. ===================================================== == File: mailet/base/src/test/resources/eml/text-only-7bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id CCCA943 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393 for <bob@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: quoted Message-ID: <f4d046a8-e563-1e92-dbd9-c5038603e3a2@james.org> Date: Wed, 22 Jan 2020 11:11:38 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable A 8bit encoded body with =E2=82=ACuro symbol. ===================================================== == File: mailet/base/src/test/resources/eml/multipart-7bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -973333758 for <bob@james.james.org>; Wed, 22 Jan 2020 03:47:32 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id 8151D43 for <bob@james.james.org>; Wed, 22 Jan 2020 03:47:32 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id D6C653F38C for <bob@james.org>; Wed, 22 Jan 2020 04:47:31 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: multipart Message-ID: <69bd7da2-5b13-de50-bd77-c985f6b0215c@james.org> Date: Wed, 22 Jan 2020 10:47:17 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: multipart/mixed; boundary="------------C3FD44EAF9B6A93E163D9176" Content-Language: en-US This is a multi-part message in MIME format. --------------C3FD44EAF9B6A93E163D9176 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable A 8bit encoded body with =E2=82=ACuro symbol. --------------C3FD44EAF9B6A93E163D9176 Content-Type: image/png; name="james-logo.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="james-logo.png" iVBORw0KGgoAAAANSUhEUgAAANkAAABaCAYAAAA1mvMAAAAAGXRFWHRTb2Z0d2FyZQBBZG9i ZSBJbWFnZVJlYWR5ccllPAAAFB1JREFUeNrsXV2MI9lVvuX+m2EXrTtLQGwydPVsRlmkSOOW +BNItB2tNiAk2n5BeYG2EwkpiSLbPPAjAW7zQiQe3C0SkBBg9ysv7ZZ4AGWFa/KClJeuRQhl s2SnOj1pYIfN1EhICRLj4pzyufbt6rrlW+W/cvc90lGVXVW37r11vnt+7h/zPI/JeJnp8jOm yTRpmhNF4Shzg8ud059eUxrIiNJYhmEssybL4/G1f3SsGaSNAM7STxfeYWtR0ppMRqs3uNwu 8D6wNQVQoelZBc6HaUi4jgeH3nUKoOtqsdN04zUZCf8ZCPzOhNqwQeCKC/Aj4EN4v6vF7HZr spsOsjYcHoGgd2I+lyVw1SQACpqHWYkPiPc24f2HWgw1yG4qyFADnQAXVP0meKZMADOFv9H8 ===================================================== == File: mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt ===================================================== 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 ===================================================== == File: mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt ===================================================== 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 ===================================================== == File: mailet/base/src/test/resources/eml/multipart-8bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID 926590876 for <bob@james.james.org>; Tue, 21 Jan 2020 07:12:56 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.68.1]) by incoming.james.org (Postfix) with ESMTPS id B39A643 for <bob@james.james.org>; Tue, 21 Jan 2020 07:12:56 +0000 (UTC) Received: from duc-HP-ProBook-450-G4 (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id F11B13F386 for <bob@james.org>; Tue, 21 Jan 2020 08:12:55 +0100 (CET) Date: Tue, 21 Jan 2020 14:12:39 +0700 (ICT) X-LINAGORA-Copy-Delivery-Done: 1 From: bob@james.org To: bob@james.org Message-ID: <423733503.3.1579590775567@duc-HP-ProBook-450-G4> Subject: UTF-8 8bit multipart Content-Type: multipart/mixed; boundary="----=_Part_0_238762799.1579590759052" ------=_Part_0_238762799.1579590759052 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A 8bit encoded body with €uro symbol. ------=_Part_0_238762799.1579590759052 Content-Type: application/octet-stream; name=james-logo.png Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=james-logo.png iVBORw0KGgoAAAANSUhEUgAAANkAAABaCAYAAAA1mvMAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAFB1JREFUeNrsXV2MI9lVvuX+m2EXrTtLQGwydPVsRlmkSOOW+BNItB2t NiAk2n5BeYG2EwkpiSLbPPAjAW7zQiQe3C0SkBBg9ysv7ZZ4AGWFa/KClJeuRQhls2SnOj1pYIfN 1EhICRLj4pzyufbt6rrlW+W/cvc90lGVXVW37r11vnt+7h/zPI/JeJnp8jOmyTRpmhNF4Shzg8ud 059eUxrIiNJYhmEssybL4/G1f3SsGaSNAM7STxfeYWtR0ppMRqs3uNwu8D6wNQVQoelZBc6HaUi4 jgeH3nUKoOtqsdN04zUZCf8ZCPzOhNqwQeCKC/Aj4EN4v6vF7HZrspsOsjYcHoGgd2I+lyVw1SQA CpqHWYkPiPc24f2HWgw1yG4qyFADnQAXVP0meKZMADOFv9H8O0VzENJxxrxvD7gYeB7NyJLWahpk Nw5kJPgnJPCVKKBJwNUhTeQkDI6gH1cWtFpBB0k0yG4iyNCU65E51yGNxDUK/veQNE92GuCSBE0a BDYNNA2ymwcyQdgPSLNkJbeg4B+jaTgNcEnA1qIgigaaBtnNA1nAb+L9XA6xPU1/6eL+G3nhp0ns B0wyr/5fnt3t733sG+/vaNHUILuRIJsmAZhM0kwPCbi5CE3J/TIMojzC4733v6UDIbcAZKu6emID C4G0z65HEMcB6xRApTupbyFpkKkBK0uBi6oisJAs9PEAWB1dgxpkmqLNwQa7Hn2MIgRVE8Dl6BrU pEEWrblqLDoaGTQJ/WFU2s/SpEE2HmB5OLRjmIWoueoaXJo0yNS0l2y8osznqmizUJMGmTrA+KgQ FdMQfS496FeTBpkiwHIEMBXfC0dplLT20qRBNhuAdQBcFS0ymmYOMhDMtn9isNN731neztWYAKvo /i5NSSn2sKqLB2+gYOaZMfRPuj7g3l0ewJEP9lgDTNO0aLrDqjLMYSPsZeG8DMfyxU+/4cI5Au3o 3r99K+0jzLUG0zQ3ir8k3Ao7959aIc4Qr3hZlvHKwGcXn/okcjmlWgynm+Q0wDSl11z81CfzpAkC N4clMJikeO9f3rVTArDwvOsgh6YZmotJFje1h9prqMUCv0f/gXaLvdLTLKmtUj4NME0LNRfv/eu7 ===================================================== == File: mailet/base/src/test/resources/eml/text-only-8bit.eml ===================================================== Return-Path: <bob@james.org> MIME-Version: 1.0 Delivered-To: bob@james.org Received: from 10.233.68.83 (EHLO incoming.james.org) ([10.233.68.83]) by james-0 (JAMES SMTP Server ) with ESMTP ID -1705393842 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from smtp.james.org (unknown [10.233.65.0]) by incoming.james.org (Postfix) with ESMTPS id CCCA943 for <bob@james.james.org>; Wed, 22 Jan 2020 04:11:54 +0000 (UTC) Received: from [10.116.29.102] (unknown [1.54.162.156]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.james.org (Postfix) with ESMTPSA id 2B7D13F393 for <bob@james.org>; Wed, 22 Jan 2020 05:11:53 +0100 (CET) To: bob@james.org X-LINAGORA-Copy-Delivery-Done: 1 From: Uncle Bob <bob@james.org> Subject: quoted Message-ID: <f4d046a8-e563-1e92-dbd9-c5038603e3a2@james.org> Date: Wed, 22 Jan 2020 11:11:38 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US A 8bit encoded body with €uro symbol. ===================================================== == File: examples/custom-webadmin-route/README.md ===================================================== # Writing custom webadmin routes Read this page [on the website](http://james.apache.org/howTo/custom-webadmin-routes.html). The current project demonstrates how to write custom webadmin routes for Apache James. This enables writing new administrative features exposed over a REST API. This can allow you to write some additional features, make James interact with third party systems, do advance reporting... Start by importing the dependencies: ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>james-server-webadmin-core</artifactId> </dependency> ``` You can then write your first route using the [Spark Java](https://sparkjava.com/) framework: ``` public class RouteA implements Routes { @Override public String getBasePath() { return "/hello/a"; } @Override public void define(Service service) { service.get(getBasePath(), (req, res) -> "RouteA\n"); } } ``` Knowing that: - entending `Routes` will ensure that authentication is requested if configured. - extending `PublicRoutes` will not request authentication. You can compile this example project: ``` mvn clean install ``` Then embed your route into a James server. First configure your route into `webadmin.properties`: ``` enabled=true port=8000 host=localhost ===================================================== == File: examples/metrics-graphite/docker-compose.yml ===================================================== version: '3' services: james: depends_on: - graphite image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - ./target/metrics-graphite-jar-with-dependencies.jar:/root/extensions-jars/metrics-graphite.jar - ./james/extensions.properties:/root/conf/extensions.properties graphite: image: graphiteapp/graphite-statsd container_name: graphite ===================================================== == File: examples/metrics-graphite/james/extensions.properties ===================================================== # This files enables customization of users extensions injections with guice. # A user can drop some jar-with-dependencies within the ./extensions-jars folder and # reference classes of these jars in some of James extension mechanisms. # This includes mailets, matchers, mailboxListeners, preDeletionHooks, protocolHandlers, webAdmin routes # Upon injections, the user can reference additional guice modules, that are going to be used only upon extensions instantiation. #List of coma separated (',') fully qualified class names of additional guice modules to be used to instantiate extensions guice.extension.startable=org.apache.james.examples.GraphiteExporter ===================================================== == File: examples/metrics-graphite/README.md ===================================================== # Custom metric integration James comes with built in integration with the [Prometheus](https://prometheus.io/) ecosystem, and a plugin to [export metrics directly to ElasticSearch]() exist. However, one might be willing to integrate with arbitrary metric system. This project demonstrate how to leverage [dropwizard metrics](https://metrics.dropwizard.io/4.2.0/) [built in extensions](https://metrics.dropwizard.io/4.2.0/manual/graphite.html) to connect Apache James with [Graphite](https://graphiteapp.org/). # Running the example For this we build a GraphiteExporter implementing the `UserDefinedStartable` interface. Build the project: ``` mvn clean install ``` Drop the jar with dependencies in the James `extensions-jars` folder. Register it in James configuration, in `extensions.properties`: ``` guice.extension.startable=org.apache.james.examples.GraphiteExporter ``` Then start James. Metrics can be retrieved in Graphite: ``` curl -XGET http://192.168.64.2:80/metrics/find?query=* | jq ```  # Running the example with docker compose Compile: ``` mvn clean install ``` Then start James: ``` ===================================================== == File: examples/custom-smtp-hooks/README.md ===================================================== # Writing custom behaviour for Apache James SMTP server Read this page [on the website](http://james.apache.org/howTo/custom-smtp-hooks.html). The current project demonstrates how to write custom behaviours for Apache James SMTP server by the means of SMTP hooks. SMTP hooks allow integrating third party systems with the SMTP stack and writing additional SMTP extensions, for instance. Start by importing the dependencies: ``` <dependency> <groupId>org.apache.james.protocols</groupId> <artifactId>protocols-smtp/artifactId> </dependency> ``` Allows writing the following hooks: - `AuthHook`: hook in the AUTH Command - `HeloHook`: hook in the HELO Command - `MailHook`: hook in the MAIL Command - `MailParametersHook`: hook for MAIL Command parameters - `RcptHook`: hook in the RCPT Command - `MessageHook`: hook in the DATA Command - `QuitHook`: hook in the QUIT Command - `UnknownHook`: hook for unknown commands ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>james-server-protocols-smtp</artifactId> </dependency> ``` Allows writing the following hooks: - `JamesMessageHook`: DATA command. Allows access to the message content. James comes bundled with [provided SMTP hooks for common features](http://james.apache.org/server/dev-provided-smtp-hooks.html). We encourage you to review them before starting writing your own hooks. ## Writing your own hooks In this example we implement a single RCPT hook: ``` public class LoggingRcptHook implements RcptHook { ===================================================== == File: examples/proxy-smtp/docker-compose.yml ===================================================== version: '3.0' services: haproxy: image: haproxytech/haproxy-alpine:2.4 volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro ports: - "25:25" - 143:143 - 993:993 - 465:465 depends_on: - james james: image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - ./smtpserver.xml:/root/conf/smtpserver.xml:ro - ./imapserver.xml:/root/conf/imapserver.xml:ro helo: image: alpine:latest command: "ash -c 'apk add --update --no-cache netcat-openbsd && echo \"HELO example.local\" | nc haproxy 25'" depends_on: - haproxy ===================================================== == File: examples/proxy-smtp/haproxy.cfg ===================================================== global log stdout format raw local0 info defaults mode tcp timeout client 1800s timeout connect 5s timeout server 1800s log global option tcplog frontend smtp-frontend bind :25 default_backend james-servers frontend smtps-frontend bind :465 default_backend smtps-servers backend james-servers server james1 james:2525 send-proxy backend smtps-servers server james1 james:465 send-proxy frontend imap-frontend bind :143 default_backend james-servers-imap frontend imaps-frontend bind :993 default_backend james-servers-imaps backend james-servers-imap server james1 james:143 send-proxy backend james-servers-imaps server james1 james:993 send-proxy ===================================================== == File: examples/proxy-smtp/README.md ===================================================== # Use one or more James instances behind a proxy It is common to run a proxy in front of a mail server such as James. The proxy receives incoming connections and forwards the request (e.g. SMTP) to James. The proxy passes the remote address to James, so James knows the origin ip address of the remote peer. So far SMTP has been tested successfully, but is not limited to. Since the proxy protocol implementation is implemented on Netty level, it can also be used for IMAP. ## Proxy This example uses [HAProxy](https://www.haproxy.org/). Other proxy software that implement [HAProxy's proxy protocol](https://www.haproxy.org/download/2.7/doc/proxy-protocol.txt) can also be used (e.g. [traefik](https://traefik.io)). It is possible to run more than one James instance and let the proxy decide which connection it forwards to which instance (i.e. load balancing). ## SMTP This docker example uses HAProxy exposes port 25 (SMTP) James might take a while to start. Thus start James first, then haproxy and finally helo. ```shell docker-compose up -d james # wait until james is ready docker-compose up -d haproxy # sends a "HELO" SMTP command to haproxy that will be forwarded to james. James will answer # including the remote ip address of the helo container. docker-compose up helo ``` If you expose HAProxy's port 25 you can also send a HELO using telnet. Similarly, one can test a setup mixing SSL and SMTP (with James responsible for SSL termination): ``` openssl s_client -host 127.0.0.1 -port 465 ``` ## IMAP This docker example uses HAProxy exposes port 143 (SMTP) Then interacting with HAProxy port 143: ``` telnet 127.0.0.1 143 ``` ===================================================== == File: examples/custom-smtp-command/README.md ===================================================== # Creating your own SMTP commands Read this page [on the website](http://james.apache.org/howTo/custom-smtp-commands.html). The current project demonstrates how to write custom commands for Apache James SMTP server. Start by importing the dependencies: ``` <dependency> <groupId>org.apache.james.protocols</groupId> <artifactId>protocols-smtp/artifactId> </dependency> ``` You can write your commands by extending the `CommandHandler<SMTPSession>` class. For instance: ``` /** * Copy of NoopCmdHandler */ public class MyNoopCmdHandler implements CommandHandler<SMTPSession> { private static final Collection<String> COMMANDS = ImmutableSet.of("MYNOOP"); private static final Response NOOP = new SMTPResponse(SMTPRetCode.MAIL_OK, DSNStatus.getStatus(DSNStatus.SUCCESS, DSNStatus.UNDEFINED_STATUS) + " OK") .immutable(); @Override public Response onCommand(SMTPSession session, Request request) { return NOOP; } @Override public Collection<String> getImplCommands() { return COMMANDS; } } ``` You then need to list the exposed SMTP commands with a `HandlersPackage`. For instance: ``` /** * This class copies CoreCmdHandlerLoader adding support for MYNOOP command */ public class MyCmdHandlerLoader implements HandlersPackage { private final List<String> commands = new LinkedList<>(); ===================================================== == File: examples/custom-listeners/README.md ===================================================== # Writing custom Mailbox listeners Mailbox listeners allow extending the behaviour of mail delivery agents. Read this page [on the website](http://james.apache.org/howTo/custom-listeners.html) to see how to run this example. ===================================================== == File: examples/custom-imap/docker-compose.yml ===================================================== version: '3' services: james: image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - ./target/custom-imap-jar-with-dependencies.jar:/root/extensions-jars/custom-imap.jar - ./sample-configuration/imapserver.xml:/root/conf/imapserver.xml ports: - "143:143" - "8000:8000" ===================================================== == File: examples/custom-imap/README.md ===================================================== # Creating your own IMAP commands James allows defining your own handler packages (logical union). To do that you need to define `imapPackages` in `imapserver.xml` configuration file. Eg: ```xml <imapPackages>org.apache.james.modules.protocols.DefaultImapPackage</imapPackages> <imapPackages>org.apache.james.examples.imap.PingImapPackages</imapPackages> ``` Sample configure file: [imapserver.xml](./sample-configuration/imapserver.xml) Note that when `imapPackages` is not provided, James will implicit use `org.apache.James.modules.protocols.DefaultImapPackage` ## Running the example Build the project: ``` mvn clean install ``` Drop the jar with dependencies in the James `extensions-jars` folder. Then start James. ## Running the example with docker compose Compile: ``` mvn clean install ``` Then start James: ``` docker-compose up ``` Test with imap package: `org.apache.james.examples.imap.PingImapPackages` Command example: ```bash telnet localhost 143 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. ===================================================== == File: examples/custom-mailets/README.md ===================================================== # How to customize mail processing Mailet and matcher allow in depth customisation of mail processing within Apache James, even allowing writing custom components. Read this page [on the website](http://james.apache.org/howTo/mail-processing.html) to see how to run this example. ===================================================== == File: examples/custom-healthcheck/README.md ===================================================== # Writing custom healthchecks Read this page [on the website](http://james.apache.org/howTo/custom-healthchecks.html). The current project demonstrates how to write custom healthchecks for Apache James. This enables writing new custom healthcheck that fits your monitoring need. Start by importing the dependencies: ``` <dependency> <groupId>org.apache.james</groupId> <artifactId>james-core</artifactId> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> </dependency> ``` You can then start writing your first HealthCheck by implementing HealthCheck interface. You can compile this example project: ``` mvn clean install ``` Then embed your healthcheck into a James server. First configure your custom healthcheck into `healthcheck.properties`: ``` # List of fully qualified HealthCheck class names in addition to James' default healthchecks. # Healthchecks need to be located within the classpath or in the ./extensions-jars folder. additional.healthchecks=org.apache.james.examples.HealthCheckA ``` Then start a James server with your JAR and the configuration: ``` $ docker run -d \ -v $PWD/healthcheck.properties:/root/conf/healthcheck.properties \ -v $PWD/healthcheck-extension.jar:/root/extensions-jars \ -p 25:25 \ apache/james:memory-latest --generate-keystore ``` You can use `curl` command to get your healthcheck status: ``` $ curl -XGET http://172.17.0.2:8000/healthcheck ===================================================== == File: examples/README.md ===================================================== # Examples This submodule shows how one can work with James. Each subprojects illustrate a specific concept. ## How to customize mail processing At the heart of James lies the Mailet container, which allows mail processing. This is splitted into smaller units, with specific responsibilities: - `Mailets`: Are operations performed with the mail: modifying it, performing a side-effect, etc... - `Matchers`: Are per-recipient conditions for mailet executions - `Processors`: Are matcher/mailet pair execution threads Once we define the mailet container content through the mailetcontailer.xml file. Hence, we can arrange James standard components to achieve basic logic. But what if our goals are more complex? What if we need our own processing components? [This example](custom-mailets) shows how to write such components! ## Configure Custom Mailbox Listeners Mailbox Listener is a component in James Mailbox System. Each time an action is applied on a mailbox(adding, deleting), or on an email(adding, deleting, updating flags...), then an event representing that action is generated and delivered to all the Listeners that had been registered before. After receiving events, listeners retrieve information from the events then execute their business (Indexing emails in OpenSearch, updating quota of users, detecting spam emails...) **Mailbox Listeners** allow customizing the behaviour of James used as a Mail Delivery Agent (MDA). [This example](custom-listeners) shows how to write such components! ## Configure Custom SMTP hooks SMTP hooks allow integrating third party systems with the SMTP stack, allows writing additional SMTP extensions, for instance. [This example](custom-smtp-hooks) shows how to write such components! ## Configure Custom SMTP commands This subproject demonstrates how to write custom commands for Apache James SMTP server. [This example](custom-smtp-command) shows how to write additional SMTP commands! ## Configure Custom WebAdmin routes The current project demonstrates how to write custom webadmin routes for Apache James. This enables writing new administrative features exposed over a REST API. This can allow you to write some additional features, make James interact with third party systems, do advance reporting... [This example](custom-webadmin-route) shows how to write additional Webadmin routes! ===================================================== == File: examples/imap-autoconf/content/mail/config-v1.1.xml ===================================================== <clientConfig version="1.1"> <emailProvider id="MessagingEngine"> <domain>domain.tld</domain> <displayName>My company</displayName> <displayShortName>My company</displayShortName> <incomingServer type="imap"> <hostname>imap.domain.tld</hostname> <port>993</port> <socketType>SSL</socketType> <authentication>password-cleartext</authentication> <username>%EMAILADDRESS%</username> </incomingServer> <outgoingServer type="smtp"> <hostname>smtp.domain.tld</hostname> <port>465</port> <socketType>SSL</socketType> <authentication>password-cleartext</authentication> <username>%EMAILADDRESS%</username> </outgoingServer> </emailProvider> </clientConfig> ===================================================== == File: examples/imap-autoconf/content/Autodiscover/Autodiscover.xml ===================================================== <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006"> <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a"> <Account> <AccountType>email</AccountType> <Action>settings</Action> <Protocol> <Type>IMAP</Type> <Server>imaps.avocat.fr</Server> <Port>993</Port> <DomainRequired>off</DomainRequired> <LoginName/> <SPA>off</SPA> <SSL>on</SSL> <AuthRequired>on</AuthRequired> </Protocol> <Protocol> <Type>SMTP</Type> <Server>smtps.avocat.fr</Server> <Port>465</Port> <DomainRequired>off</DomainRequired> <LoginName/> <SPA>off</SPA> <Encryption>SSL</Encryption> <AuthRequired>on</AuthRequired> <UsePOPAuth>off</UsePOPAuth> <SMTPLast>off</SMTPLast> </Protocol> </Account> </Response> </Autodiscover> ===================================================== == File: examples/imap-autoconf/content/.well-known/autoconfig/mail/config-v1.1.xml ===================================================== <clientConfig version="1.1"> <emailProvider id="MessagingEngine"> <domain>domain.tld</domain> <displayName>My company</displayName> <displayShortName>My company</displayShortName> <incomingServer type="imap"> <hostname>imap.domain.tld</hostname> <port>993</port> <socketType>SSL</socketType> <authentication>password-cleartext</authentication> <username>%EMAILADDRESS%</username> </incomingServer> <outgoingServer type="smtp"> <hostname>smtp.domain.tld</hostname> <port>465</port> <socketType>SSL</socketType> <authentication>password-cleartext</authentication> <username>%EMAILADDRESS%</username> </outgoingServer> </emailProvider> </clientConfig> ===================================================== == File: examples/imap-autoconf/content/autodiscover/autodiscover.xml ===================================================== <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006"> <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a"> <Account> <AccountType>email</AccountType> <Action>settings</Action> <Protocol> <Type>IMAP</Type> <Server>imap.domain.tld</Server> <Port>993</Port> <DomainRequired>off</DomainRequired> <LoginName/> <SPA>off</SPA> <SSL>on</SSL> <AuthRequired>on</AuthRequired> </Protocol> <Protocol> <Type>SMTP</Type> <Server>smtp.domain.tld</Server> <Port>465</Port> <DomainRequired>off</DomainRequired> <LoginName/> <SPA>off</SPA> <Encryption>SSL</Encryption> <AuthRequired>on</AuthRequired> <UsePOPAuth>off</UsePOPAuth> <SMTPLast>off</SMTPLast> </Protocol> </Account> </Response> </Autodiscover> ===================================================== == File: examples/imap-autoconf/docker-compose.yml ===================================================== version: '3' services: james: image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore ports: - "465:465" - "993:993" - "8000:8000" autoconf: image: nginx container_name: autoconf volumes: - ./content:/usr/share/nginx/html ports: - "80:80" ===================================================== == File: examples/imap-autoconf/README.adoc ===================================================== = Auto-configuration of Mail User Agents == RFC-6186 use of SRV records link:https://tools.ietf.org/html/rfc6186[RFC-6186] defines the usage of SRV records in order to help users configuring their Mail User Agents in order to access your service, as it allows to locate your services (hostnames and ports). You would then need to publish SRV records on your DNS. ---- _imaps._tcp.domain.tld. 3600 IN SRV 0 1 993 imap.domain.tld. _submission._tcp.domain.tld. 3600 IN SRV 0 1 587 smtp.domain.tld. _jmap._tcp.domain.tld. 3600 IN SRV 0 1 443 jmap.domain.tld. ---- == Thunderbird Thunderbird relies on a custom XML payload being served on a subdomain. For `user@domain.tld` an HTTP GET request would be done at `http://autoconfig.domain.tld/mail/config-v1.1.xml` You could for instance serve the following XML payload: [xml] ---- <clientConfig version="1.1"> <emailProvider id="MessagingEngine"> <domain>domain.tld</domain> <displayName>My company</displayName> <displayShortName>My company</displayShortName> <incomingServer type="imap"> <hostname>imap.domain.tld</hostname> <port>993</port> <socketType>SSL</socketType> <authentication>password-cleartext</authentication> <username>%EMAILADDRESS%</username> </incomingServer> <outgoingServer type="smtp"> <hostname>smtp.domain.tld</hostname> <port>465</port> <socketType>SSL</socketType> <authentication>password-cleartext</authentication> <username>%EMAILADDRESS%</username> </outgoingServer> </emailProvider> </clientConfig> ---- == JMAP ===================================================== == File: examples/imap-autoconf/default.conf ===================================================== server { listen 80; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 405 =200 $uri; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ===================================================== == File: examples/custom-james-assembly/custom-james-assembly.iml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <module version="4"> <component name="CheckStyle-IDEA-Module" serialisationVersion="2"> <option name="activeLocationsIds" /> </component> </module> ===================================================== == File: examples/custom-james-assembly/README.md ===================================================== # Assemble a James server tailored to your needs Read this page [on the website](http://james.apache.org/howTo/custom-james-assembly.html). The current project demonstrates how to write a custom assembly in order to write your own tailor-made server. This enables: - Arbitrary composition of technologies (example JPA mailbox with Cassandra user management) - Write any additional components - Drop any unneeded component - You have control on the dependencies and can reduce the classpath size ## Example: Write an IMAP+SMTP only memory server In order to do this select the modules you wished to assemble [in the Guice building blocks](https://github.com/apache/james-project/tree/master/server/container/guice). We encourage you to have a fine grain control of your dependencies but for the sake of simplicity this example will reuse the dependencies of an existing James application: ``` <dependency> <groupId>${james.groupId}</groupId> <artifactId>james-server-memory-app</artifactId> <version>${project.version}</version> </dependency> ``` Once done assemble the guice modules together in a class implementing `JamesServerMain`: ``` public class CustomJamesServerMain implements JamesServerMain { public static final Module PROTOCOLS = Modules.combine( new IMAPServerModule(), new ProtocolHandlerModule(), new MailRepositoryTaskSerializationModule(), new SMTPServerModule()); public static final Module CUSTOM_SERVER_MODULE = Modules.combine( new MailetProcessingModule(), new MailboxModule(), new MemoryDataModule(), new MemoryEventStoreModule(), new MemoryMailboxModule(), new MemoryMailQueueModule(), new TaskManagerModule(), new RawPostDequeueDecoratorModule(), binder -> binder.bind(MailetContainerModule.DefaultProcessorsConfigurationSupplier.class) .toInstance(BaseHierarchicalConfiguration::new)); ===================================================== == File: examples/opensearch-dahsboard/docker-compose.yml ===================================================== version: '3' services: opensearch-dashboards: image: opensearchproject/opensearch-dashboards:2.11.1 container_name: opensearch-dashboards ports: - 5601:5601 expose: - "5601" environment: OPENSEARCH_HOSTS: '["https://xxxx:9200"]' OPENSEARCH_USERNAME: username OPENSEARCH_PASSWORD: xxxxx OPENSEARCH_DASHBOARDS_OPENSEARCH_SSL_VERIFICATIONMODE: none OPENSEARCH_DASHBOARD_PASSWORD: xxxxx ===================================================== == File: examples/opensearch-dahsboard/README.md ===================================================== # OpenSearch dashboard for Apache James [OpenSearch dashboard](https://opensearch.org/docs/latest/dashboards/) is a solution allowing data visualization on top of an existing OpenSearch cluster. It can be used to create interesting visualizations when used on top of Apache James OpenSearch indexes. ## Set up 1. Adapt the `docker-compose.yml` file to your needs (IP address & credentials) 2. Start it with `docker compose up` 3. Login in your browser: `http://127.0.0.1:5601` with the credential documented in the `docker-compose.yml` file 4. In `Dashboard Management > Index pattern` import the `mailbox_v2` (using date as a date field) and `quota_ratio_v1` 5. In `Dashboard Management > Saved objects` import `james-dashboard.ndjson` ## Supported visualizations - Quota usage  - New mails timeline  - Top senders  - Top recipients  - Email size distribution  - Attachment usage report  - Total email created during the period  - Unique email (by message-id)  - Read / unread ratio ===================================================== == File: examples/opensearch-dahsboard/james-dashboard.ndjson ===================================================== {"attributes":{"fieldFormatMap":"{\"deliveryTime2\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://127.0.0.1:5601\",\"pathname\":\"/app/opensearch_index_management_dashboards\",\"basePath\":\"\"}}},\"recipientCount\":{\"id\":\"number\",\"params\":{\"parsedUrl\":{\"origin\":\"http://127.0.0.1:5601\",\"pathname\":\"/app/management\",\"basePath\":\"\"}}}}","fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"attachments.contentDisposition\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attachments.fileExtension\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attachments.fileName\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"attachments.mediaType\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attachments.subtype\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attachments.textContent\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"bcc.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"bcc.address.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"bcc.address\"}}},{\"count\":0,\"name\":\"bcc.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"bcc.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"cc.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"cc.address.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"cc.address\"}}},{\"count\":0,\"name\":\"cc.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"cc.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"cc.name.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"cc.name\"}}},{\"count\":0,\"name\":\"date\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"from.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"from.address.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"from.address\"}}},{\"count\":0,\"name\":\"from.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"from.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"from.name.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"from.name\"}}},{\"count\":0,\"name\":\"hasAttachment\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"headers.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"nested\":{\"path\":\"headers\"}}},{\"count\":0,\"name\":\"headers.value\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false,\"subType\":{\"nested\":{\"path\":\"headers\"}}},{\"count\":0,\"name\":\"htmlBody\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"isAnswered\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"isDeleted\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"isDraft\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":1,\"name\":\"isFlagged\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"isRecent\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"isUnread\",\"type\":\"boolean\",\"esTypes\":[\"boolean\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"mailboxId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"mediaType\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"messageId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"mimeMessageID\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"modSeq\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"saveDate\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"sentDate\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"size\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"subject\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"subject.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"subject\"}}},{\"count\":0,\"name\":\"subtype\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"textBody\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"threadId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"to.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"to.address.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"to.address\"}}},{\"count\":0,\"name\":\"to.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"to.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"to.name.raw\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"to.name\"}}},{\"count\":0,\"name\":\"uid\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"userFlags\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"script\":\"if (doc.containsKey('saveDate') && doc.containsKey('sentDate')) {\\n return (doc['saveDate'].value.getMillis() - doc['sentDate'].value.getMillis()) / 1000; \\n} else {\\n return 0;\\n}\",\"lang\":\"painless\",\"name\":\"deliveryTime2\",\"type\":\"number\",\"scripted\":true,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"script\":\"int count = 0;\\n\\n for (nested in params._source.to) {\\n count += 1;\\n } \\n\\nreturn count;\",\"lang\":\"painless\",\"name\":\"recipientCount\",\"type\":\"number\",\"scripted\":true,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]","timeFieldName":"date","title":"mailbox_v2"},"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-24T08:29:21.408Z","version":"WzEwMSwxXQ=="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Unique mails","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Unique mails\",\"type\":\"metric\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"cardinality\",\"params\":{\"field\":\"mimeMessageID\"},\"schema\":\"metric\"}],\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}}}"},"id":"13751b90-48bf-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-23T06:44:57.417Z","version":"WzQ2LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"type\":\"phrases\",\"key\":\"to.address\",\"value\":\"linagora.com\",\"params\":[\"linagora.com\"],\"alias\":null,\"negate\":false,\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"bool\":{\"should\":[{\"match_phrase\":{\"to.address\":\"linagora.com\"}}],\"minimum_should_match\":1}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Top recipients","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Top recipients\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"to.address.raw\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"16a7eb90-4828-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T12:44:08.776Z","version":"WzM3LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"New mails in mailbox","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"New mails in mailbox\",\"type\":\"area\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now-7d\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"}],\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"},\"labels\":{}}}"},"id":"1857e250-4824-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T12:15:33.621Z","version":"WzI2LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Attachment ratio","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Attachment ratio\",\"type\":\"pie\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"hasAttachment\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":5,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":true,\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100}}}"},"id":"1e1196b0-48be-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-23T06:38:05.722Z","version":"WzQ0LDFd"} {"attributes":{"buildNum":6867,"defaultIndex":"a22e0e70-4822-11ef-be61-a96ec0360231"},"id":"2.11.1","migrationVersion":{"config":"7.9.0"},"references":[],"type":"config","updated_at":"2024-07-24T08:29:32.345Z","version":"WzEwMywxXQ=="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Attachment by file extension","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Attachment by file extension\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"attachments.fileExtension\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"23e3a2a0-4827-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T12:37:21.482Z","version":"WzMyLDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Total mails","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Total mails\",\"type\":\"metric\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"}],\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}}}"},"id":"23e701f0-48bf-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-23T06:45:25.007Z","version":"WzQ3LDFd"} {"attributes":{"description":"Difference between the saveDate and the sentDate.\n\nIncludes third party delays. Take it as indicative, as sentDate can be crafter by the user.","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"from.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"from.domain\":\"linagora\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"to.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"to.domain\":\"linagora\"}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Estimated internal delivery times (second)","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Estimated internal delivery times (second)\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"range\",\"params\":{\"field\":\"deliveryTime2\",\"ranges\":[{\"from\":0,\"to\":1},{\"from\":1,\"to\":10},{\"from\":10,\"to\":30},{\"from\":30,\"to\":60},{\"from\":60,\"to\":120},{\"from\":120,\"to\":300}]},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"normal\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"2dd81ca0-4994-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-24T08:10:24.490Z","version":"WzkwLDFd"} {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"contactId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"domain\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"email\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"firstname\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"surname\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false}]","title":"domain_contact"},"id":"32e9e3a0-48ee-11ef-be61-a96ec0360231","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-23T12:22:16.537Z","version":"WzcxLDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Email by size over the week","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Email by size over the week\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"range\",\"params\":{\"field\":\"size\",\"ranges\":[{\"from\":0,\"to\":1000},{\"from\":1000,\"to\":10000},{\"from\":10000,\"to\":100000},{\"from\":100000,\"to\":500000},{\"from\":500000,\"to\":1000000},{\"from\":1000000,\"to\":2000000},{\"from\":2000000,\"to\":5000000},{\"from\":5000000,\"to\":10000000},{\"from\":10000000}]},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"normal\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":true},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"},\"orderBucketsBySum\":false}}"},"id":"3f74a1a0-4826-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T19:58:40.967Z","version":"WzQwLDFd"} {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"access_entities\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"added\",\"type\":\"number\",\"esTypes\":[\"unsigned_long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"company_id\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"content_keywords\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"content_keywords._index_prefix\",\"type\":\"unknown\",\"esTypes\":[\"prefix\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false,\"subType\":{\"multi\":{\"parent\":\"content_keywords\"}}},{\"count\":0,\"name\":\"creator\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"id\"}}},{\"count\":0,\"name\":\"index._id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"index._id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"index._id\"}}},{\"count\":0,\"name\":\"index._index\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"index._index.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"index._index\"}}},{\"count\":0,\"name\":\"last_modified\",\"type\":\"number\",\"esTypes\":[\"unsigned_long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"mime_type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"name._index_prefix\",\"type\":\"unknown\",\"esTypes\":[\"prefix\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false,\"subType\":{\"multi\":{\"parent\":\"name\"}}},{\"count\":0,\"name\":\"name_keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"tags\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","title":"drive_files"},"id":"41219170-48ee-11ef-be61-a96ec0360231","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-23T12:22:40.390Z","version":"WzcyLDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"New mails","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"New mails\",\"type\":\"line\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"date\",\"timeRange\":{\"from\":\"now-7d\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"}],\"params\":{\"type\":\"line\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"line\",\"mode\":\"normal\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"interpolate\":\"linear\",\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"45a9f970-4822-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T12:05:41.828Z","version":"WzI0LDFd"} {"attributes":{"fields":"[{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"domain\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"quotaRatio\",\"type\":\"number\",\"esTypes\":[\"double\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"user\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]","title":"quota_ratio_v1"},"id":"a22e0e70-4822-11ef-be61-a96ec0360231","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2024-07-22T12:05:05.878Z","version":"WzIzLDFd"} {"attributes":{"description":"Current mail quota usage","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Quota usage","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Quota usage\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"max\",\"params\":{\"field\":\"quotaRatio\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"user\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":20,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"row\":true}}"},"id":"97f58540-4823-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"a22e0e70-4822-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T12:11:58.228Z","version":"WzI1LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Top senders","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Top senders\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"from.address.raw\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"7f321dd0-4827-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T12:40:37.202Z","version":"WzM2LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"to.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"to.domain\":\"linagora\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"isUnread\",\"negate\":false,\"params\":{\"query\":false},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"isUnread\":false}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"People that reads the more mails","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"People that reads the more mails\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"to.address.raw\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"b6d8dbe0-4988-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-24T06:48:20.382Z","version":"Wzc2LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"to.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"to.domain\":\"linagora\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"isAnswered\",\"negate\":false,\"params\":{\"query\":true},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"isAnswered\":true}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"People that answer the more mails","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"People that answer the more mails\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"to.address.raw\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":20,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"6eea1830-4988-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-24T06:46:19.698Z","version":"Wzc1LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"from.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"from.domain\":\"linagora\"}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Recipient counts","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Recipient counts\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"avg\",\"params\":{\"field\":\"recipientCount\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"from.address.raw\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"max\",\"params\":{\"field\":\"recipientCount\"},\"schema\":\"metric\"},{\"id\":\"4\",\"enabled\":true,\"type\":\"sum\",\"params\":{\"field\":\"recipientCount\"},\"schema\":\"metric\"},{\"id\":\"5\",\"enabled\":true,\"type\":\"count\",\"params\":{\"customLabel\":\"Total number of mails sent\"},\"schema\":\"metric\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"ad612950-4997-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-24T12:15:54.537Z","version":"WzEwOCwxXQ=="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"IsUnread ratio","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"IsUnread ratio\",\"type\":\"pie\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"isUnread\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":5,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"isDonut\":true,\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100},\"row\":false}}"},"id":"be8f0ec0-48bd-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-23T06:35:25.482Z","version":"WzQzLDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"User flags","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"User flags\",\"type\":\"tagcloud\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"userFlags\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"segment\"}],\"params\":{\"scale\":\"linear\",\"orientation\":\"single\",\"minFontSize\":18,\"maxFontSize\":72,\"showLabel\":true}}"},"id":"bedb6490-48be-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-23T06:42:35.480Z","version":"WzQ1LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"from.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"from.domain\":\"linagora\"}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"People that sends the more data","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"People that sends the more data\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"params\":{\"field\":\"size\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"from.address.raw\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":50,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"503bd5d0-4998-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-24T08:40:00.173Z","version":"WzEwNSwxXQ=="} {"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"c7b5858e-01b8-42be-83a0-c6e73c4cacf1\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"c7b5858e-01b8-42be-83a0-c6e73c4cacf1\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"abcc16ab-e57a-4b3d-8cab-52ec820a7e7e\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"abcc16ab-e57a-4b3d-8cab-52ec820a7e7e\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"01499225-fd1a-45ef-9580-d9952732ba4d\",\"w\":24,\"x\":0,\"y\":15},\"panelIndex\":\"01499225-fd1a-45ef-9580-d9952732ba4d\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"7f4b9ecb-0af8-45ba-b0a6-81b623ed2313\",\"w\":24,\"x\":24,\"y\":15},\"panelIndex\":\"7f4b9ecb-0af8-45ba-b0a6-81b623ed2313\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"5e583f06-80aa-4a80-9d45-b1e82d005ac7\",\"w\":24,\"x\":0,\"y\":30},\"panelIndex\":\"5e583f06-80aa-4a80-9d45-b1e82d005ac7\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_4\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"21312784-5985-4837-9b76-0dbca6282a4e\",\"w\":24,\"x\":24,\"y\":30},\"panelIndex\":\"21312784-5985-4837-9b76-0dbca6282a4e\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_5\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"5bd68fe2-150c-42d2-b873-368ac1fb8535\",\"w\":24,\"x\":0,\"y\":45},\"panelIndex\":\"5bd68fe2-150c-42d2-b873-368ac1fb8535\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_6\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"2891f468-9c96-44c4-95c3-8d88acfe3529\",\"w\":24,\"x\":24,\"y\":60},\"panelIndex\":\"2891f468-9c96-44c4-95c3-8d88acfe3529\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_7\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"1b163ae4-eb63-417f-bc50-f11e4ee35774\",\"w\":24,\"x\":0,\"y\":60},\"panelIndex\":\"1b163ae4-eb63-417f-bc50-f11e4ee35774\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_8\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"363cc993-5a48-43a9-b441-d190776a30c2\",\"w\":24,\"x\":24,\"y\":75},\"panelIndex\":\"363cc993-5a48-43a9-b441-d190776a30c2\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_9\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"b108ed1b-02a5-4d05-ac0c-8cf557c72375\",\"w\":24,\"x\":0,\"y\":75},\"panelIndex\":\"b108ed1b-02a5-4d05-ac0c-8cf557c72375\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_10\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"3170beae-6005-44db-b789-533cdca0df8c\",\"w\":24,\"x\":24,\"y\":90},\"panelIndex\":\"3170beae-6005-44db-b789-533cdca0df8c\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_11\"},{\"embeddableConfig\":{\"vis\":{\"legendOpen\":true}},\"gridData\":{\"h\":15,\"i\":\"28c66231-dc25-41bc-b2cf-bb26e0782098\",\"w\":24,\"x\":0,\"y\":90},\"panelIndex\":\"28c66231-dc25-41bc-b2cf-bb26e0782098\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_12\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"5253f3a8-885e-4ed9-8824-449a7b2bbe2e\",\"w\":24,\"x\":24,\"y\":45},\"panelIndex\":\"5253f3a8-885e-4ed9-8824-449a7b2bbe2e\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_13\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"8d5f7ec9-1af8-47a2-8c2d-9a5c76fa6322\",\"w\":24,\"x\":0,\"y\":105},\"panelIndex\":\"8d5f7ec9-1af8-47a2-8c2d-9a5c76fa6322\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_14\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"0d769bbc-b593-491c-95b8-495f66ae38e0\",\"w\":24,\"x\":24,\"y\":105},\"panelIndex\":\"0d769bbc-b593-491c-95b8-495f66ae38e0\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_15\"}]","timeRestore":false,"title":"TMail dashboard","version":1},"id":"48b21e70-4824-11ef-be61-a96ec0360231","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"97f58540-4823-11ef-be61-a96ec0360231","name":"panel_0","type":"visualization"},{"id":"1857e250-4824-11ef-be61-a96ec0360231","name":"panel_1","type":"visualization"},{"id":"7f321dd0-4827-11ef-be61-a96ec0360231","name":"panel_2","type":"visualization"},{"id":"16a7eb90-4828-11ef-be61-a96ec0360231","name":"panel_3","type":"visualization"},{"id":"b6d8dbe0-4988-11ef-be61-a96ec0360231","name":"panel_4","type":"visualization"},{"id":"6eea1830-4988-11ef-be61-a96ec0360231","name":"panel_5","type":"visualization"},{"id":"ad612950-4997-11ef-be61-a96ec0360231","name":"panel_6","type":"visualization"},{"id":"23e3a2a0-4827-11ef-be61-a96ec0360231","name":"panel_7","type":"visualization"},{"id":"3f74a1a0-4826-11ef-be61-a96ec0360231","name":"panel_8","type":"visualization"},{"id":"13751b90-48bf-11ef-be61-a96ec0360231","name":"panel_9","type":"visualization"},{"id":"23e701f0-48bf-11ef-be61-a96ec0360231","name":"panel_10","type":"visualization"},{"id":"1e1196b0-48be-11ef-be61-a96ec0360231","name":"panel_11","type":"visualization"},{"id":"be8f0ec0-48bd-11ef-be61-a96ec0360231","name":"panel_12","type":"visualization"},{"id":"2dd81ca0-4994-11ef-be61-a96ec0360231","name":"panel_13","type":"visualization"},{"id":"bedb6490-48be-11ef-be61-a96ec0360231","name":"panel_14","type":"visualization"},{"id":"503bd5d0-4998-11ef-be61-a96ec0360231","name":"panel_15","type":"visualization"}],"type":"dashboard","updated_at":"2024-07-24T12:35:37.147Z","version":"WzEwOSwxXQ=="} {"attributes":{"description":"Difference between the saveDate and the sentDate.\n\nIncludes third party delays. Take it as indicative, as sentDate can be crafter by the user.","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"from.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"match_phrase\":{\"from.domain\":\"linagora\"}}},{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"to.domain\",\"negate\":false,\"params\":{\"query\":\"linagora\"},\"type\":\"phrase\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index\"},\"query\":{\"match_phrase\":{\"to.domain\":\"linagora\"}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Internal delivery times (second)","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Internal delivery times (second)\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"range\",\"params\":{\"field\":\"deliveryTime2\",\"ranges\":[{\"from\":0,\"to\":1},{\"from\":1,\"to\":10},{\"from\":10,\"to\":30},{\"from\":30,\"to\":60},{\"from\":60,\"to\":120},{\"from\":120,\"to\":300}]},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"normal\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"5941af90-4990-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index","type":"index-pattern"},{"id":"9bce8ba0-4821-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.filter[1].meta.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-24T08:03:50.766Z","version":"Wzg5LDFd"} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Active users","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Active users\",\"type\":\"metric\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"}],\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"metric\",\"metric\":{\"percentageMode\":false,\"useRanges\":false,\"colorSchema\":\"Green to Red\",\"metricColorMode\":\"None\",\"colorsRange\":[{\"from\":0,\"to\":10000}],\"labels\":{\"show\":true},\"invertColors\":false,\"style\":{\"bgFill\":\"#000\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"fontSize\":60}}}}"},"id":"595edc30-482a-11ef-be61-a96ec0360231","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"a22e0e70-4822-11ef-be61-a96ec0360231","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2024-07-22T13:00:19.699Z","version":"WzM5LDFd"} {"exportedCount":25,"missingRefCount":0,"missingReferences":[]} ===================================================== == File: examples/oidc/test.sh ===================================================== #!/bin/sh set -eux docker-compose up -d GET_TOKEN_RESPONSE=`curl --location 'http://sso.example.com:8080/auth/realms/oidc/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'scope=openid profile email' \ --data-urlencode 'client_id=james-thunderbird' \ --data-urlencode 'client_secret=Xw9ht1veTu0Tk5sMMy03PdzY3AiFvssw' \ --data-urlencode 'username=james-user@localhost' \ --data-urlencode 'password=secret' 2>/dev/null` ACCESS_TOKEN=`echo $GET_TOKEN_RESPONSE 2>/dev/null |perl -pe 's/^.*"access_token"\s*:\s*"(.*?)".*$/$1/'` REFRESH_TOKEN=`echo $GET_TOKEN_RESPONSE 2>/dev/null |perl -pe 's/^.*"refresh_token"\s*:\s*"(.*?)".*$/$1/'` echo "Got an access_token" if curl -H "Authorization: Bearer $ACCESS_TOKEN" http://sso.example.com:8080/auth/realms/oidc/protocol/openid-connect/userinfo 2>/dev/null| grep james-user >/dev/null; then echo "Access_token is valid" else echo "ACCESS_TOKEN VERIFICATION FAILED" fi echo -n "Trying James: " APISIX_JMAP_ENDPOINT=apisix.example.com:9080/oidc/jmap/session if curl -v -H 'Accept: application/json; jmapVersion=rfc-8621' -H "Authorization: Bearer $ACCESS_TOKEN" $APISIX_JMAP_ENDPOINT 2>/dev/null | grep uploadUrl >/dev/null; then echo "OK" else echo "Not OK" fi # Logout curl --location 'http://sso.example.com:8080/auth/realms/oidc/protocol/openid-connect/logout' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=james-thunderbird' \ --data-urlencode 'client_secret=Xw9ht1veTu0Tk5sMMy03PdzY3AiFvssw' \ --data-urlencode 'refresh_token='$REFRESH_TOKEN >/dev/null 2>&1 sleep 1 if curl -v -H 'Accept: application/json; jmapVersion=rfc-8621' -H "Authorization: Bearer $ACCESS_TOKEN" $APISIX_JMAP_ENDPOINT 2>/dev/null | grep uploadUrl >/dev/null; then echo "LOGOUT FAILED" else echo "Logout OK" fi ===================================================== == File: examples/oidc/docker-compose.yml ===================================================== version: "3" services: apisix: container_name: apisix.example.com image: linagora/apisix:3.2.0-debian-javaplugin volumes: - ./apisix/conf/apisix.yaml:/usr/local/apisix/conf/apisix.yaml - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml environment: - X_USER_SECRET=xusersecret123 networks: - james ports: - "9080:9080/tcp" james: depends_on: - ldap networks: - james image: apache/james:memory-latest container_name: james hostname: james.local command: - --generate-keystore volumes: - ./james/usersrepository.xml:/root/conf/usersrepository.xml - ./james/jmap.properties:/root/conf/jmap.properties ports: - "8000:8000" healthcheck: test: ["CMD", "curl", "-f", "http://james:8000/domains"] sso.example.com: depends_on: - ldap image: quay.io/keycloak/keycloak:16.1.0 container_name: sso.example.com volumes: - ./keycloak/realm-oidc.json:/tmp/realm-oidc.json ports: - "8080:8080" environment: - KEYCLOAK_USER=admin - KEYCLOAK_PASSWORD=admin - KEYCLOAK_IMPORT=/tmp/realm-oidc.json networks: james: aliases: ===================================================== == File: examples/oidc/james/imapserver.xml ===================================================== <?xml version="1.0"?> <imapservers> <imapserver enabled="true"> <jmxName>imapserver</jmxName> <bind>0.0.0.0:143</bind> <connectionBacklog>200</connectionBacklog> <tls socketTLS="false" startTLS="false"> <keystore>file://conf/keystore</keystore> <keystoreType>PKCS12</keystoreType> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <idleTimeInterval>120</idleTimeInterval> <idleTimeIntervalUnit>SECONDS</idleTimeIntervalUnit> <enableIdle>true</enableIdle> <auth> <plainAuthEnabled>true</plainAuthEnabled> <oidc> <oidcConfigurationURL>http://keycloak:8080/auth/realms/oidc/.well-known/openid-configuration</oidcConfigurationURL> <jwksURL>http://keycloak:8080/auth/realms/oidc/protocol/openid-connect/certs</jwksURL> <claim>email</claim> <scope>openid profile email</scope> <introspection> <url>http://keycloak:8080/auth/realms/oidc/protocol/openid-connect/token/introspect</url> <auth>Basic amFtZXMtdGh1bmRlcmJpcmQ6WHc5aHQxdmVUdTBUazVzTU15MDNQZHpZM0FpRnZzc3c=</auth> </introspection> </oidc> </auth> </imapserver> </imapservers> ===================================================== == File: examples/oidc/james/jmap.properties ===================================================== # Configuration file for JMAP # Read https://james.apache.org/server/config-jmap.html for further details enabled=true tls.keystoreURL=file://conf/keystore tls.secret=james72laBalle # Alternatively TLS keys can be supplied via PEM files # tls.privateKey=file://conf/private.nopass.key # tls.certificates=file://conf/certs.self-signed.csr # An optional secret might be specified for the private key # tls.secret=james72laBalle # # If you wish to use OAuth authentication, you should provide a valid JWT public key. # The following entry specify the link to the URL of the public key file, # which should be a PEM format file. # #jwt.publickeypem.url=file://conf/jwt_publickey # Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against OpenSearch? # This enables a higher resilience, but the projection needs to be correctly populated. False by default. # view.email.query.enabled=true # If you want to specify authentication strategies for Jmap rfc-8621 version # For custom Authentication Strategy not inside package "org.apache.james.jmap.http", you have to specify its FQDN authentication.strategy.rfc8621=BasicAuthenticationStrategy,XUserAuthenticationStrategy authentication.strategy.rfc8621.xUser.secret=xusersecret123 ===================================================== == File: examples/oidc/james/smtpserver.xml ===================================================== <?xml version="1.0"?> <smtpservers> <smtpserver enabled="true"> <jmxName>smtpserver</jmxName> <bind>0.0.0.0:587</bind> <connectionBacklog>200</connectionBacklog> <tls socketTLS="false" startTLS="false"> <keystore>file://conf/keystore</keystore> <keystoreType>PKCS12</keystoreType> <secret>james72laBalle</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> <algorithm>SunX509</algorithm> </tls> <connectiontimeout>360</connectiontimeout> <connectionLimit>0</connectionLimit> <connectionLimitPerIP>0</connectionLimitPerIP> <auth> <announce>forUnauthorizedAddresses</announce> <plainAuthEnabled>true</plainAuthEnabled> <oidc> <oidcConfigurationURL>http://keycloak:8080/auth/realms/oidc/.well-known/openid-configuration</oidcConfigurationURL> <jwksURL>http://keycloak:8080/auth/realms/oidc/protocol/openid-connect/certs</jwksURL> <claim>email</claim> <scope>openid profile email</scope> <introspection> <url>http://keycloak:8080/auth/realms/oidc/protocol/openid-connect/token/introspect</url> <auth>Basic amFtZXMtdGh1bmRlcmJpcmQ6WHc5aHQxdmVUdTBUazVzTU15MDNQZHpZM0FpRnZzc3c=</auth> </introspection> </oidc> </auth> <authorizedAddresses>127.0.0.0/8</authorizedAddresses> <verifyIdentity>false</verifyIdentity> <maxmessagesize>0</maxmessagesize> <addressBracketsEnforcement>true</addressBracketsEnforcement> <smtpGreeting>Apache JAMES awesome SMTP Server</smtpGreeting> <handlerchain> <handler class="org.apache.james.smtpserver.fastfail.ValidRcptHandler"/> <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/> </handlerchain> </smtpserver> </smtpservers> ===================================================== == File: examples/oidc/_media/oidc-sso.drawio ===================================================== <mxfile host="drawio-plugin" modified="2023-05-19T09:35:49.753Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36" etag="8cXSAneUY9EacNUk1MxU" version="20.5.3" type="embed"><diagram id="9t5u96WNi0rS4HrvDtxI" name="Page-1"><mxGraphModel dx="1045" dy="583" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="TRxEg24sL5Zt3rOSAXKO-1" value="Apisix<br><br>API gateway" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="300" y="320" width="140" height="140" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-2" value="" style="shape=actor;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"><mxGeometry x="50" y="300" width="40" height="60" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-4" value="Keycloack<br><br>OIDC provider" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="300" y="80" width="140" height="140" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-5" value="James<br><br>JMAP server" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="600" y="320" width="140" height="140" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-7" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" parent="1" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="110" y="360" as="sourcePoint"/><mxPoint x="290" y="390" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-8" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" parent="1" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="100" y="400" as="sourcePoint"/><mxPoint x="280" y="430" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-9" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" parent="1" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="450" y="400" as="sourcePoint"/><mxPoint x="590" y="400" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-10" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" parent="1" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="110" y="330" as="sourcePoint"/><mxPoint x="290" y="200" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-11" value="1. Un-authenticated request will be rejected" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="130" y="300" width="210" height="70" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-12" value="2. Login against keycloack" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="40" y="180" width="210" height="70" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-13" value="3. Use of the access token to authenticate against Apisix" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="60" y="420" width="210" height="70" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-14" value="4. use of the X-User header to proxy authentication to Apache James" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="410" y="430" width="210" height="70" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-15" value="LDAP" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="600" y="80" width="140" height="140" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-16" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="TRxEg24sL5Zt3rOSAXKO-5" target="TRxEg24sL5Zt3rOSAXKO-15" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="400" y="310" as="sourcePoint"/><mxPoint x="450" y="260" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-17" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="TRxEg24sL5Zt3rOSAXKO-4" target="TRxEg24sL5Zt3rOSAXKO-15" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="400" y="310" as="sourcePoint"/><mxPoint x="450" y="260" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-18" value="Verify credentials" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="490" y="110" width="60" height="30" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-19" value="List users,<br>Verify that user exists" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="590" y="260" width="60" height="30" as="geometry"/></mxCell></root></mxGraphModel></diagram></mxfile> ===================================================== == File: examples/oidc/_media/oidc-slo.drawio ===================================================== <mxfile host="drawio-plugin" modified="2023-05-19T09:39:47.749Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36" etag="MQ-wdtVOlcMwVUt4tywV" version="20.5.3" type="embed"><diagram id="9t5u96WNi0rS4HrvDtxI" name="Page-1"><mxGraphModel dx="1045" dy="583" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="TRxEg24sL5Zt3rOSAXKO-1" value="Apisix<br><br>API gateway" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="450" y="320" width="140" height="140" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-2" value="" style="shape=actor;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"><mxGeometry x="50" y="300" width="40" height="60" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-4" value="Keycloack<br><br>OIDC provider" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="260" y="90" width="140" height="140" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-20" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;" parent="1" target="TRxEg24sL5Zt3rOSAXKO-4" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="110" y="330" as="sourcePoint"/><mxPoint x="450" y="260" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-21" value="1. logout with keycloack logout endpoint" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="50" y="180" width="190" height="80" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-22" value="Apisix plugin runner" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"><mxGeometry x="475" y="220" width="80" height="80" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-23" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="TRxEg24sL5Zt3rOSAXKO-4" target="TRxEg24sL5Zt3rOSAXKO-22" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="400" y="310" as="sourcePoint"/><mxPoint x="450" y="260" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-24" value="2. Use of logout backchannel (HTTP call)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="450" y="150" width="130" height="50" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-27" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;startArrow=none;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" parent="1" source="TRxEg24sL5Zt3rOSAXKO-29" target="2" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="120" y="340" as="sourcePoint"/><mxPoint x="290" y="390" as="targetPoint"/></mxGeometry></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-28" value="3.Access tokens used after logout are rejected" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"><mxGeometry x="130" y="430" width="120" height="30" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-29" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.no_symbol;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1"><mxGeometry x="160" y="310" width="100" height="100" as="geometry"/></mxCell><mxCell id="TRxEg24sL5Zt3rOSAXKO-30" value="" style="shape=flexArrow;endArrow=none;html=1;rounded=0;" parent="1" target="TRxEg24sL5Zt3rOSAXKO-29" edge="1"><mxGeometry width="50" height="50" relative="1" as="geometry"><mxPoint x="120" y="340" as="sourcePoint"/><mxPoint x="290" y="390" as="targetPoint"/></mxGeometry></mxCell><mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;gradientColor=none;opacity=30;strokeWidth=5;strokeColor=#000000;perimeterSpacing=0;fillColor=#808080;" parent="1" vertex="1"><mxGeometry x="430" y="200" width="180" height="290" as="geometry"/></mxCell><mxCell id="3" value="Apisix" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontStyle=1" vertex="1" parent="1"><mxGeometry x="536" y="469" width="90" height="20" as="geometry"/></mxCell></root></mxGraphModel></diagram></mxfile> ===================================================== == File: examples/oidc/_media/IMAP_SMTP oidc.drawio ===================================================== <mxfile host="app.diagrams.net" modified="2022-01-20T04:07:37.309Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" etag="OGjRz3jpXBH_9HMDoK-6" version="16.4.2" type="google"><diagram id="thl9NaU5WR5Ri5IL_89n" name="Page-1">5VnbcuI4EP0aqnYfoCwZG3gkcfYym9RSlcrs5U3YwmhiLCKJAPn6adky2LK9MBkIm0weiNRqt6Q+3UdtueNeLza/CrKc3/GIJh3sRJuOG3QwHg0R/GrBNhd4yAhiwaJcVBLcsxdqhI6RrlhEZUVRcZ4otqwKQ56mNFQVGRGCr6tqM55UZ12SmNYE9yFJ6tK/WKTmuXSIB3v5b5TF82Jm5I/ykQUplM1O5JxEfF0SuTcd91pwrvLWYnNNE+27wi/5c7+0jO4WJmiqjnkgoqOXeE05uxulo6fPwcu/D1+6xsozSVZmwx3sJ2DvasbBLKxabY0r/KcVLwa6MgNqDAqov9zsB6EV6/8PkorCEiwpN5YPGW/s7GJwzFI3V4tkHCouQOeZCsUAhFsypcmES6YYT0FlypXii5LCOGGxHlB8CdK5WiTQQbtZtBrdtDoM7WCA8KV8QZXYgop5wDPAmchFvumv93FQiOalEBgZGTGRF+8M78GBhsHnG7Dyvx8r3ITVH3QbJpw8Ftamohj58/cAlupMBH+GLBR1hWMhht1BwkLnaj1nit4vSahH1kAZVdiIXOZZPGMbGpkdGFZA/dPgigdVYN06rqO3xHVwJlxvg/Hkg0DW961c9C6M2fBMmH0a393cfxDQ7DzDwwuDNmoAreUsmiV0M9blA7iCppFpBmFCpGRh1ZeCr9JIOzFwLEfi/OmicEBODw+9AeoXv34+btSHPYSd0t/+GKNRrUixQICqiIiYqkMhWwerBIbXAEYhEzQhij1Xl9GEkJlhwlmWB0XwuFYs9C2QJV+JkJqnylWMZch1LEPIMpT7oWYoC5jdtl8fQwi3Zr5ckrQx86ckfIyzKOmGPNEFjiYAEU9/wp7X0WWbPmWt9s91ckC9h7Q7Xqk5YA/Fj4KY08A8rahUMoMyW/+UZuIvkOBaY8cc+fpamAPSXFXDWirBH+l1vuAg5ammlRlMYYmIKcFCWBUtF29FbbZgUZS0cVJ78pyoikPW0dF03KNBQ+S756Ih5L4/HgJni+3fxnTW+Ud3er4/KATBpjwcbMu9CRUMnKfDIxOekNb8/xOtoeEraQ1bUWqfgedmtf7lWK1e7eDeLY+ZnpXEhKVS+2n/kgLv//pegGrpOAyplJnskaY/PNd5zUF0iOnss/h0TOe9Y6brOj3HGVp0h9GF6e6yVRy2ztLBiejOtQ/bc/Nd+13K2fnO7cHQg9RFGrHoK6c2UqrwKhz4iSyo/OFJzg4ddPF6rukywH4xb2I0CVGuXkl0GQ9tmMpqst6o3zf9nKfwYGj6e5rSnW2pY5NUc4l3iO+Op7acGw5R2xEUOLgkBXr9A8x1LAX27dsR/MYUWL8N+QwRMdOuVHOiV7rKLvEdCJbs/dIOacA8u5+3bpaOZg9BJXsh08yeDqWl3mq2ee+q4wXfwh7m648x1tn5shyG/5G7rVwDNQByB8MKUOj74qhQ4bOZpGdBttj82/PRjkF6joerlRMkynkrp4P04r8HerFL+JPdk6E3fqMstt5EL6GgkS5wSPJBWaX0fbeFVVxcfAc3+HTx5WgFuvvP0Ln6/lu+e/MV</diagram></mxfile> ===================================================== == File: examples/oidc/apisix/conf/apisix.yaml ===================================================== routes: # OIDC authentication endpoints - id: jmap uri: /oidc/jmap service_id: jmap_service_oidc methods: - POST - OPTIONS plugin_config_id: jmap-plugin plugins: proxy-rewrite: uri: /jmap headers: set: X-User-Secret: ${{X_USER_SECRET}} - id: jmap_websocket uri: /oidc/jmap/ws service_id: jmap_service_oidc enable_websocket: true methods: - GET - OPTIONS plugin_config_id: jmap-plugin plugins: proxy-rewrite: uri: /jmap/ws headers: set: X-User-Secret: ${{X_USER_SECRET}} - id: jmap_session_oidc uri: /oidc/jmap/session service_id: jmap_service_oidc methods: - GET - OPTIONS plugin_config_id: jmap-plugin plugins: proxy-rewrite: uri: /jmap/session headers: set: X-User-Secret: ${{X_USER_SECRET}} - id: download uri: /oidc/download/* service_id: jmap_service_oidc methods: ===================================================== == File: examples/oidc/apisix/conf/config.yaml ===================================================== deployment: role: data_plane role_data_plane: config_provider: yaml ext-plugin: path_for_test: /tmp/runner.sock cmd: ['java', '-jar', '-DREDIS_PASSWORD=secret1', '-DREDIS_URL=redis.example.com:6379','-DAPP_REWRITE_XUSER_USERINFO_FIELD=email', '-Xmx1g', '-Xms1g', '/usr/local/apisix/token_revoker_plugin.jar'] ===================================================== == File: examples/oidc/README.md ===================================================== # OIDC JMAP, IMAP and SMTP example with James, Apisix API Gateway, Keycloak, LDAP ==== This is example of an OIDC setup with James. The API Gateway for example is [Apisix](https://apisix.apache.org/), we can use Apisix for websocket gateway, horizontal scaling, etc... This [docker-compose](docker-compose.yml) will start the following services: - apisix: The image `linagora/apisix:3.2.0-debian-javaplugin` was created by Linagora. It based on `apisix:3.2.0-debian`, it already contain apisix plugin for SLO (Single Logout) and rewrite the `X-User` header. - Dockerfile: [here](https://github.com/linagora/tmail-backend/blob/master/demo/apisix/Dockerfile) - Project `tmail-apisix-plugin-runner`: [here](https://github.com/linagora/tmail-backend/tree/master/demo/apisix/tmail-apisix-plugin-runner) - Apisix being the OIDC gateway against James by exposing two endpoints: - `POST /jmap` for JMAP requests against James with normal authentication - `POST /oidc/jmap` for JMAP request against James with a JWT token issued by the LemonLDAP - james: Memory version using the LDAP and `XUserAuthenticationStrategy` for JMAP - sso.example.com: keycloak image with a pre-configured `oidc` realm, `oidc` client (Authorization Code Flow, should dedicate for JMAP), `james-thunderbird` client (Client Credentials Flow, dedicated for IMAP/SMTP) and connected to the LDAP for its user base - ldap: with a pre-provisioned user `james-user@tmail.com` and his password `secret` - redis: for storage of the revoked token. This is optional, we can un-use it if we want to store it in-memory with Apisix standalone. ## Overall architecture ### JMAP Here is an architecture diagram showing how Single Sign On works for this example:  SSO auto-discovery might require the set up of a `.well-known/webfinger` endpoint described in [this spec](https://openid.net/specs/openid-connect-discovery-1_0.html) via external means (not provided here). Here is an architecture diagram showing how Single Log Out works for this example, using the backchannel OIDC flow:  ### IMAP/SMTP Here is an architecture diagram showing how to authenticate JAMES IMAP/SMTP using OIDC Provider:  ## How to run it ```bash docker-compose up -d ``` ===================================================== == File: examples/oidc/ldap/populate.ldif ===================================================== dn: ou=people, dc=localhost ou: people objectClass: organizationalUnit dn: ou=empty, dc=localhost ou: empty objectClass: organizationalUnit dn: uid=james-user@localhost, ou=people, dc=localhost objectClass: inetOrgPerson uid: james-user@localhost cn: james-user sn: james-user mail: james-user@localhost userPassword: secret description: James user ===================================================== == File: mailbox/spring/src/test/README.md ===================================================== Running these tests requires applying the openjpa javaagent. This is configured for you when running the tests through maven. In your IDE you will have to add the following JVM argument (the version may vary check the apache.openjpa.version property value in the top level pom.xml): ``` -javaagent:${HOME}/.m2/repository/org/apache/openjpa/openjpa/4.0.0/openjpa-4.0.0.jar ``` ===================================================== == File: mailbox/plugin/quota-mailing/src/main/resources/templates/QuotaThresholdMailBody.mustache ===================================================== You receive this email because you recently exceeded a threshold related to the quotas of your email account. {{#hasExceededSizeThreshold}} You currently occupy more than {{sizeThreshold}} % of the total size allocated to you. You currently occupy {{usedSize}}{{#hasSizeLimit}} on a total of {{limitSize}} allocated to you{{/hasSizeLimit}}. {{/hasExceededSizeThreshold}} {{#hasExceededCountThreshold}} You currently occupy more than {{countThreshold}} % of the total message count allocated to you. You currently have {{usedCount}} messages{{#hasCountLimit}} on a total of {{limitCount}} allowed for you{{/hasCountLimit}}. {{/hasExceededCountThreshold}} You need to be aware that actions leading to exceeded quotas will be denied. This will result in a degraded service. To mitigate this issue you might reach your administrator in order to increase your configured quota. You might also delete some non important emails. ===================================================== == File: mailbox/plugin/quota-mailing/src/main/resources/templates/QuotaThresholdMailSubject.mustache ===================================================== Warning: Your email usage just exceeded a configured threshold ===================================================== == File: mailbox/plugin/quota-mailing/src/test/resources/templates/body1.mustache ===================================================== [BODY_1] ===================================================== == File: mailbox/plugin/quota-mailing/src/test/resources/templates/body2.mustache ===================================================== [BODY_2] ===================================================== == File: mailbox/plugin/quota-mailing/src/test/resources/templates/subject2.mustache ===================================================== [SUBJECT_2] ===================================================== == File: mailbox/plugin/quota-mailing/src/test/resources/templates/subject1.mustache ===================================================== [SUBJECT_1] ===================================================== == File: mailbox/opensearch/src/test/resources/eml/emailWith3Attachments.eml ===================================================== To: Laura ROYET <laura.ro@linagora.com> From: Laura Royet <laura.ro@linagora.com> Subject: test Message-ID: <cb415bdb-b27d-fc25-b91f-aae6b4774b71@linagora.com> Date: Wed, 11 Jan 2017 11:52:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------36566F1E9D791340FFB75FF8" This is a multi-part message in MIME format. --------------36566F1E9D791340FFB75FF8 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit -- Laura Royet --------------36566F1E9D791340FFB75FF8 Content-Type: application/vnd.oasis.opendocument.text; name="attachment1.odt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment1.odt" UEsDBBQAAAgAAGJVK0pexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQu dC54bWxQSwUGAAAAABEAEQBwBAAAjyUAAAAA --------------36566F1E9D791340FFB75FF8 Content-Type: application/vnd.oasis.opendocument.text; name="attachment2-nonIndexableAttachment.html" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment2-nonIndexableAttachment.odt" PCFET0NUWVBFIGh0bWw+CjxodG1sIGNsYXNzPSJtb3ppbGxhIiBsYW5nPSJlbiI+PGhlYWQ+ CI+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4= --------------36566F1E9D791340FFB75FF8 Content-Type: application/vnd.oasis.opendocument.text; name="attachment3.odt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment3.odt" UEsDBBQAAAgAAG9VK0pexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQu AAAAEgkAABNRVRBLUlORi9tYW5pZmVzdC54bWxQSwUGAAAAABEAEQBwBAAApyUAAAAA --------------36566F1E9D791340FFB75FF8-- ===================================================== == File: mailbox/opensearch/src/test/resources/eml/mailCustomStringHeader.eml ===================================================== Content-Type: text/plain; Charset=UTF-8 Subject: subject MIME-Version: 1.0 Message-Id: <20100916151246.2A9384BA1@lenny> From: a@test To: b@test Custom-header: custom header Mail content ===================================================== == File: mailbox/opensearch/src/test/resources/eml/bodyMakeTikaToFail.eml ===================================================== Date: Mon, 30 Jan 2017 11:51:35 +0100 From: Raphael OUAZANA <raph.ouazana@linagora.com> To: OUAZANA Raphael <raph.ouazana@linagora.com> Subject: subject should be parsed Message-ID: <255cb2b85feee171cd9a88bda109c9f0@linagora.com> X-Sender: raph.ouazana@linagora.com User-Agent: Roundcube Webmail/1.1.4 Return-Path: <iphone@obm.lng.org> Received: from lenny.obm.lng.org (localhost [127.0.0.1]) by lenny.obm.lng.org (Cyrus v2.3.14-Debian-2.3.14-2) with LMTPA; Wed, 21 Mar 2012 14:51:59 +0100 X-Sieve: CMU Sieve 2.3 Received: from [192.168.2.48] (unknown [192.168.2.48]) by lenny.obm.lng.org (Postfix) with ESMTP id E495D32929 for <usera@obm.lng.org>; Wed, 21 Mar 2012 14:51:58 +0100 (CET) Message-ID: <4F69DD0E.3010502@obm.lng.org> Date: Wed, 21 Mar 2012 14:52:14 +0100 From: iphone <iphone@obm.lng.org> User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.28) Gecko/20120306 Lightning/1.0b2 Thunderbird/3.1.20 MIME-Version: 1.0 To: usera <usera@obm.lng.org> Subject: Fwd: Re: email with sign Content-Type: multipart/mixed; boundary="------------080809000000030101030405" This is a multi-part message in MIME format. --------------080809000000030101030405 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit new email text part --------------080809000000030101030405 Content-Type: message/rfc822; name="Re: email with sign.eml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="Re: email with sign.eml" Return-Path: <usera@obm.lng.org> Received: from lenny.obm.lng.org (localhost [127.0.0.1]) by lenny.obm.lng.org (Cyrus v2.3.14-Debian-2.3.14-2) with LMTPA; Wed, 21 Mar 2012 14:19:29 +0100 X-Sieve: CMU Sieve 2.3 Received: from [192.168.2.48] (unknown [192.168.2.48]) by lenny.obm.lng.org (Postfix) with ESMTP id 47EC832D51 for <iphone@obm.lng.org>; Wed, 21 Mar 2012 14:19:29 +0100 (CET) Message-ID: <4F69D570.9090502@obm.lng.org> ===================================================== == File: mailbox/opensearch/src/test/resources/eml/alternative_simple.eml ===================================================== MIME-Version: 1.0 Subject: Test From: Benoit TELLIER <btellier@linagora.com> To: Benoit TELLIER <btellier@linagora.com> Date: Tue, 13 Feb 2024 23:01:18 +0000 Message-ID: <Mime4j.17d.c7b7d059b303c215.18da4b4076b@linagora.com> Content-Type: multipart/alternative; boundary="-=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=-" ---=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Test ---=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=- Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div>Test<br><br></div> ---=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=--- ===================================================== == File: mailbox/opensearch/src/test/resources/eml/mailCustomDateHeader.eml ===================================================== Content-Type: text/plain; Charset=UTF-8 Subject: my subject test MIME-Version: 1.0 Message-Id: <20100916151246.2A9384BA1@lenny> From: B <b@test> To: c@test Custom-header: 2015/09/02 Mail content ===================================================== == File: mailbox/opensearch/src/test/resources/eml/inlined-mixed.eml ===================================================== Date: Wed, 26 Jan 2022 12:21:37 +0100 From: Bob <bob@domain.tld> To: Alice <alice@domain.tld> Subject: My subject Message-ID: <20220126112137.wookj26xellphlam@W0248292> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="7f4cfz6rtfqdbqxn" Content-Disposition: inline Content-Transfer-Encoding: 8bit --7f4cfz6rtfqdbqxn Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Main test message... --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="yyy.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="xxx.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn-- ===================================================== == File: mailbox/opensearch/src/test/resources/eml/mailWithHeaders.eml ===================================================== Content-Type: text/plain; Charset=UTF-8 Date: Fri, 17 Sep 2010 17:12:26 +0200 Subject: my subject To: a@test, B <b@test> Cc: c@test Bcc: dD <d@test> MIME-Version: 1.0 Message-Id: <20100917151246.2A9384BA1@lenny> From: Ad Min <admin@opush.test> Mail content -- Ad Min ===================================================== == File: mailbox/opensearch/src/test/resources/eml/htmlContent.txt ===================================================== Linked Applications OpenPaas-Linagora Stash - OpenPaas Jenkins - OpenPaas Configure… Dashboards Projects Issues Agile More Create Help Online Help JIRA Agile Help Keyboard Shortcuts About JIRA JIRA Credits Administration JIRA administration Projects Issues User management System Add-ons Profile Atlassian Marketplace My JIRA Home Dashboard Agile Issue Navigator Disable new project navigation Log Out OpenPaaS RSE OR-2349 Docker-compose doesn't activate attachments and dwld/upld url are wrongly populated Edit Comment Assign More Agile Board Rank to Top Rank to Bottom Log Work Attach Files Attach Screenshot Add Drawio Diagram Voters Stop Watching Watchers Create Sub-Task Convert to Sub-Task Create branch Move Link Clone Labels Delete Stop Progress Resolve Issue Close Issue Admin Add field Where is my field? Permission Helper Notification Helper Export XML Word Printable Details Type: Bug Status: Progressing (View Workflow) Priority: Major Resolution: Unresolved Affects Version/s: None Fix Version/s: None Component/s: None Labels: None Labels Rank (Obsolete): 9223372036854775807 Acceptance Criteria: 0/1 Hide checkedShow checked Tested show more show less Description { "name" : "uploadUrl", "value" : "http://10.69.0.163:1080/jmap/upload", "_id" : ObjectId("5785f85cd7f4033c00fc606d") }, { "name" : "downloadUrl", "value" : "http://10.69.0.163:1080/jmap/download", "_id" : ObjectId("5785f85cd7f4033c00fc606c") }, should be replaced with { "name" : "uploadUrl", "value" : "http://10.69.0.163:1080/upload", "_id" : ObjectId("5785f85cd7f4033c00fc606d") }, { "name" : "downloadUrl", "value" : "http://10.69.0.163:1080/download", "_id" : ObjectId("5785f85cd7f4033c00fc606c") }, { "name" : "composer.attachments", "value" : true } Activity All Comments Work Log History Activity There are no comments yet on this issue. Comment Paragraph Heading 1 Heading 2 Heading 3 Heading 4 Heading 5 Heading 6 Preformatted Paragraph quote Block quote Strikethrough Superscript Subscript Citation External link Mail link Anchor link Attachment link Attachment link External image Attached image Attached image User mention Table Code Preformatted Panel Horizontal ruler Style BoldItalicUnderlineText colorMore colorsMore LinkImage Bullet listNumbered list IconsOther Lock / Unlock Preview comment This comment will be Viewable by All Users All Users Administrators Developers Users Viewable by All Users Cancel Comment People Assignee: Stephane COLSON Reporter: Stephane COLSON Votes: 0 Watchers: 1 Stop watching this issue Dates Created: 4 hours ago Updated: 4 hours ago Development 1 branch Updated 33 minutes ago 1 pull request OPEN Updated 33 minutes ago Create branch Agile View on Board Issue deployment Atlassian JIRA Project Management Software (v6.4.5#64020-sha1:78acd6c) About JIRA Report a problem Powered by a free Atlassian JIRA open source license for OpenPaas. Try JIRA - bug tracking software for your team. Atlassian ===================================================== == File: mailbox/opensearch/src/test/resources/eml/alternative.eml ===================================================== MIME-Version: 1.0 Subject: Test From: Benoit TELLIER <btellier@linagora.com> To: Benoit TELLIER <btellier@linagora.com> Date: Tue, 13 Feb 2024 23:01:18 +0000 Message-ID: <Mime4j.17d.c7b7d059b303c215.18da4b4076b@linagora.com> Content-Type: multipart/mixed; boundary="-=Part.17f.732e3d28e1c76db4.18da4b40791.62ef5e3fa995057d=-" ---=Part.17f.732e3d28e1c76db4.18da4b40791.62ef5e3fa995057d=- Content-Type: multipart/alternative; boundary="-=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=-" ---=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=- Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Test ---=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=- Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div>Test<br><br></div> ---=Part.17e.48ac92d73c356567.18da4b40791.360a293e2f389efe=--- ---=Part.17f.732e3d28e1c76db4.18da4b40791.62ef5e3fa995057d=- Content-Type: application/json; name="=?US-ASCII?Q?id=5Frsa.txt?=" Content-Disposition: attachment Content-Transfer-Encoding: base64 c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFDQVFDa0dXMkp5c2lKR2hQZXdBOXRr bVFFQm5EVjRaQ0llLy92ZFoyV0RybnZiNlZLQzdpWldjODFpU1ZkTFcxUkRBTll4c3ExN0dQanpV OFlWdk9sRkFJSk1WTm9ESWhuQWtYOU9VUUJpd1hpOHlHZ3FLNGR0RmIxczJBRzNrQmxNUFFJOE5K MkpLT2Z5MW51VnJubEtoVDlCVnpYMm5iSjNOak9PZlkxQlJEaDZZcVl1a2RuejBUT2k1Rkp1YUJT NDZQemx3eWdIa0dzeXBLVHM2Y2FUNjBRdjl3eWFadm4yenN1RmNML3o2Mmd3aGZyZGFsakF1UGRX cERlNG1IRVFmMXA2SXNRMDdPb0lwTmRHQ0tLZHRZQlVTcktzTXRpMllLUGZpSzB2WGU1L3owRWJE VlRja1BrY3NwQ2cwYVZuZTB2eFVsRGt2U2pwV2tiQkZ0YTk5ekJjOVlJL0ROK28vRmtONlFTdXV5 U29tNDZkamZpUjdqSzNMRmJKUkhaem9BblNvaTZvRlR0MW1LWjNzam44bnZWUG1PV3pJWHY0Tm1O R1ExZHFrV1hXcUtyQjlIZUZiQnRPWVAzaEkxQ0kvaVhNbVR1SkdvcHVTUmlTNW1QZXlSQWV6VGtk UG8vZ2NSVWNzbklhVW1EallUWHBFNzU3Yk5LWVNHbFJsS3FrbEhKc2JveEdTK0NaVzBJS2dZeTdG cmZRZ1FGMTdvaUpWM1JJQ1VHcU9rM1I2VnZOYlhlL2VmZS9IT24xd0lZUS9qVGRzY0hCamRIM2FF MmY4Y3dVS1IzNUtWNlJ1SE4vYVpiekxiVkJxUEMvUTcwd3NMQlloV29Da1dRMElUUmxGV2N3bnN3 VTE5NnlGWkVHSmthOUNEaHZQdUVBV0NLWnFRT3gyMnRoYWVSQlE9PSBiZW53YUBob3Jpem9uCg== ===================================================== == File: mailbox/memory/src/test/resources/test.eml ===================================================== ===================================================== == File: mailbox/tika/src/test/resources/documents/Text.txt ===================================================== This is some awesome text text. ===================================================== == File: mailbox/api/src/test/resources/eml/twoAttachmentsApi.eml ===================================================== Return-Path: <from@linagora.com> X-Priority: 3 (Normal) From: "From" <from@linagora.com> To: "To" <to@linagora.com> Subject: [8/10]Attached Image light with text Date: Fri, 27 Mar 2015 21:48:38 +0100 Message-Id: <20150227203838.0011.CanonTxNo.4037@canondir.par.lng> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="AHNPACBLDCDIDAGGGDDFAABECGCA" --AHNPACBLDCDIDAGGGDDFAABECGCA Content-Type: text/html; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit <b>html</b> --AHNPACBLDCDIDAGGGDDFAABECGCA Content-Type: image/jpeg; name="4037_014.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="4037_014.jpg" /9j/4X2cRXhpZgAASUkqAAgAAAANAA8BAgAKAAAAqgAAABABAgAJAAAAtAAAABIBAwABAAAA AQAAABoBBQABAAAAvgAAABsBBQABAAAAxgAAACgBAwABAAAAAgAAADEBAgAKAAAAzgAAADIB AgAUAAAA2AAAABMCAwABAAAAAgAAAGmHBAABAAAAfAIAAKXEBwDQAAAA7AAAANLGBwBAAAAA vAEAANPGBwCAAAAA/AEAAEwqAABQYW5hc29uaWMARE1DLUZaNDUAALQAAAABAAAAtAAAAAEA AABWZXIuMS4wICAAMjAxNDowMjoyNSAxMDozMjowOQBQcmludElNADAyNTAAAA4AAQAWABYA AgAAAAAAAwBkAAAABwAAAAAACAAAAAAACQAAAAAACgAAAAAACwCsAAAADAAAAAAADQAAAAAA DgDEAAAAAAEFAAAAAQEBAAAAEAGAAAAACREAABAnAAALDwAAECcAAJcFAAAQJwAAsAgAABAn AAABHAAAECcAAF4CAAAQJwAAiwAAABAnAADLAwAAECcAAOUbAAAQJwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA --AHNPACBLDCDIDAGGGDDFAABECGCA Content-Type: image/jpeg; name="4037_015.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="4037_015.jpg" ===================================================== == File: mailbox/README.md ===================================================== Apache James Mailbox project ============================ The James Mailbox project aims to provide an email (message) store. The main user of the Mailbox project is James Server project. The implementations can be used standalone and do not depend on James Server. The project defines the Mailbox API and has several implementations that you can use. More details bellow. Overview ======== Apache James Mailbox has the following project (Maven) structure: ~~~ |-- api -- Mailbox API |-- jpa -- Database Mailbox implementation using Java Persistence API |-- lucene -- Email indexing module with Apache Lucene |-- memory -- In memory Mailbox implementation - good for testing |-- spring -- Spring module - starts a specific mailbox implementation |-- store -- Common base/utility classes used in all mailbox implementations |-- tool -- Database migration/mailbox export tool ~~~ Mailbox JPA =========== Persist email messages inside any database that is supported by your Java Persistence Api provider. Currently James uses OpenJPA (http://openjpa.apache.org/), but it's easy to implement your own. Mailbox 'In memory' message store ================================= In module **memory**, does not persist emails. It just keeps them in memory. Fast, and good for testing. **Note:** Not to be used in production. Building ======== The primary build tool for Apache James Mailbox is maven 3. On a new checkout start by running ~~~ $ mvn clean package ~~~ This will compiled all modules For just building without running junit tests: ~~~ ===================================================== == File: mailbox/var/store/derby/db.lck ===================================================== ?$a816c00e-0188-957f-71f4-00001716d8f0 ===================================================== == File: mailbox/var/store/derby/service.properties ===================================================== #/home/interview1/Documents/james-project/mailbox/var/store/derby # ******************************************************************** # *** Please do NOT edit this file. *** # *** CHANGING THE CONTENT OF THIS FILE MAY CAUSE DATA CORRUPTION. *** # ******************************************************************** #Wed Jun 07 17:55:39 ICT 2023 SysconglomeratesIdentifier=32 SyscolumnsIdentifier=144 derby.serviceLocale=en_US SystablesIdentifier=96 SysconglomeratesIndex3Identifier=81 derby.storage.propertiesId=16 derby.serviceProtocol=org.apache.derby.database.Database SyscolumnsIndex1Identifier=161 SysschemasIndex2Identifier=225 SystablesIndex2Identifier=129 SyscolumnsIndex2Identifier=177 SysconglomeratesIndex2Identifier=65 SysschemasIndex1Identifier=209 SysschemasIdentifier=192 SystablesIndex1Identifier=113 SysconglomeratesIndex1Identifier=49 #--- last line, don't put anything after this line --- ===================================================== == File: mailbox/var/store/derby/log/README_DO_NOT_TOUCH_FILES.txt ===================================================== # ************************************************************************* # *** DO NOT TOUCH FILES IN THIS DIRECTORY! *** # *** FILES IN THIS DIRECTORY ARE USED BY THE DERBY DATABASE RECOVERY *** # *** SYSTEM. EDITING, ADDING, OR DELETING FILES IN THIS DIRECTORY *** # *** WILL CAUSE THE DERBY RECOVERY SYSTEM TO FAIL, LEADING TO *** # *** NON-RECOVERABLE CORRUPT DATABASES. *** # ************************************************************************* ===================================================== == File: mailbox/var/store/derby/README_DO_NOT_TOUCH_FILES.txt ===================================================== # ************************************************************************* # *** DO NOT TOUCH FILES IN THIS DIRECTORY! *** # *** FILES IN THIS DIRECTORY AND SUBDIRECTORIES CONSTITUTE A DERBY *** # *** DATABASE, WHICH INCLUDES THE DATA (USER AND SYSTEM) AND THE *** # *** FILES NECESSARY FOR DATABASE RECOVERY. *** # *** EDITING, ADDING, OR DELETING ANY OF THESE FILES MAY CAUSE DATA *** # *** CORRUPTION AND LEAVE THE DATABASE IN A NON-RECOVERABLE STATE. *** # ************************************************************************* ===================================================== == File: mailbox/var/store/derby/seg0/README_DO_NOT_TOUCH_FILES.txt ===================================================== # ************************************************************************* # *** DO NOT TOUCH FILES IN THIS DIRECTORY! *** # *** FILES IN THIS DIRECTORY ARE USED BY THE DERBY DATABASE TO STORE *** # *** USER AND SYSTEM DATA. EDITING, ADDING, OR DELETING FILES IN THIS *** # *** DIRECTORY WILL CORRUPT THE ASSOCIATED DERBY DATABASE AND MAKE *** # *** IT NON-RECOVERABLE. *** # ************************************************************************* ===================================================== == File: mailbox/var/store/lucene/write.lock ===================================================== ===================================================== == File: mailbox/store/src/test/resources/eml/pgpSignedMail.eml ===================================================== Return-Path: <bounce-debian-security-announce=benwa=minet.net@lists.debian.org> Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Wed, 03 Jun 2015 21:19:59 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx2.minet.net (Postfix) with ESMTP id 8A9DAA27DA1 for <benwa@minet.net>; Wed, 3 Jun 2015 21:20:03 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.51 X-Spam-Level: X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, T_RP_MATCHES_RCVD=-0.01] autolearn=unavailable Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id cF6J0AAnzsTX for <benwa@minet.net>; Wed, 3 Jun 2015 19:20:02 +0000 (UTC) Received-SPF: None (no SPF record) identity=mailfrom; client-ip=82.195.75.100; helo=bendel.debian.org; envelope-from=bounce-debian-security-announce=benwa=minet.net@lists.debian.org; receiver=benwa@minet.net Received: from bendel.debian.org (bendel.debian.org [82.195.75.100]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.minet.net (Postfix) with ESMTPS id 7F69FA27D98 for <benwa@minet.net>; Wed, 3 Jun 2015 21:20:01 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by bendel.debian.org (Postfix) with QMQP id 1C2F6275; Wed, 3 Jun 2015 19:14:50 +0000 (UTC) Old-Return-Path: <carnil@master.debian.org> X-Original-To: lists-debian-security-announce@bendel.debian.org Delivered-To: lists-debian-security-announce@bendel.debian.org Received: from localhost (localhost [127.0.0.1]) by bendel.debian.org (Postfix) with ESMTP id 7EFBF228 for <lists-debian-security-announce@bendel.debian.org>; Wed, 3 Jun 2015 19:14:39 +0000 (UTC) X-Amavis-Spam-Status: No, score=-8.99 tagged_above=-10000 required=5.3 tests=[BAYES_00=-2, DIGITS_LETTERS=1, FVGT_m_MULTI_ODD=0.02, LDO_WHITELIST=-5, OUR_MTA_MSGID=2, PGPSIGNATURE=-5, T_RP_MATCHES_RCVD=-0.01] autolearn=ham Received: from bendel.debian.org ([127.0.0.1]) by localhost (lists.debian.org [127.0.0.1]) (amavisd-new, port 2525) with ESMTP id RiKdt2PVwXOm for <lists-debian-security-announce@bendel.debian.org>; Wed, 3 Jun 2015 19:14:34 +0000 (UTC) Received: from master.debian.org (master.debian.org [IPv6:2001:41b8:202:deb:216:36ff:fe40:4001]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "master.debian.org", Issuer "Debian SMTP CA" (not verified)) by bendel.debian.org (Postfix) with ESMTPS id ABE761B7 for <debian-security-announce@lists.debian.org>; Wed, 3 Jun 2015 19:14:34 +0000 (UTC) Received: from carnil by master.debian.org with local (Exim 4.84) (envelope-from <carnil@master.debian.org>) id 1Z0E7U-0004Bc-Jv ===================================================== == File: mailbox/store/src/test/resources/eml/htmlMail.eml ===================================================== Delivered-To: mister@james.org Received: by 10.28.170.202 with SMTP id t193csp327634wme; Thu, 4 Jun 2015 00:36:15 -0700 (PDT) X-Received: by 10.180.77.195 with SMTP id u3mr5042880wiw.30.1433403375307; Thu, 04 Jun 2015 00:36:15 -0700 (PDT) Return-Path: <bounces+1453977-062b-mister=james.org@email.airbnb.com> Received: from o7.email.airbnb.com (o7.email.airbnb.com. [167.89.32.249]) by mx.google.com with ESMTPS id i2si5691730wjz.123.2015.06.04.00.36.13 for <mister@james.org> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Jun 2015 00:36:15 -0700 (PDT) Received-SPF: pass (google.com: domain of bounces+1453977-062b-mister=james.org@email.airbnb.com designates 167.89.32.249 as permitted sender) client-ip=167.89.32.249; Authentication-Results: mx.google.com; spf=pass (google.com: domain of bounces+1453977-062b-mister=james.org@email.airbnb.com designates 167.89.32.249 as permitted sender) smtp.mail=bounces+1453977-062b-mister=james.org@email.airbnb.com; dkim=pass header.i=@email.airbnb.com; dmarc=pass (p=REJECT dis=NONE) header.from=airbnb.com DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=email.airbnb.com; h=from:to:subject:mime-version:content-type:content-transfer-encoding; s=s20150428; bh=2mhWUwzjtQTC0KljgpaEsuvrqok=; b=EhC2QHKb5+63egDD qDCAepUELCeUZXCkw8+31kGT+O1va3iAKvQSAvzXJ3qJlIL9FgdeFk8sR78Vszn/ A73vp6NGjAW60M4gUZjxEOIPzGKIS95KfmHxg10fXUOFW0uePojNEg4ZPCcuitrZ HuWvzHK5I2siGnqupiivwxDgs5c= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.info; h=from:to:subject:mime-version:content-type:content-transfer-encoding:x-feedback-id; s=smtpapi; bh=2mhWUwzjtQTC0KljgpaEsuvrqok=; b=FPiYMmNJLCrL2e8v/0 DQC4voofe8nuuE7rhXZ25oqNAhAQja4oKIysJ1qAME2aEaqh+N5aJlCEuHrSG/7+ NAQ0OY8KaJ2zlnxAbmgJETOjnf4oGdAa+nU/nVVEPfN2NRcBCNLGQZ80U4T5k8Xi PakIuZvKDTRq7PiosSCSHT/FQ= Received: by filter0490p1mdw1.sendgrid.net with SMTP id filter0490p1mdw1.13271.556FFFE7B 2015-06-04 07:36:09.249601779 +0000 UTC Received: from i-dee0850e.inst.aws.airbnb.com (ec2-54-90-154-187.compute-1.amazonaws.com [54.90.154.187]) by ismtpd-017 (SG) with ESMTP id 14dbd7fa6b4.779a.254b43 for <mister@james.org>; Thu, 04 Jun 2015 07:36:09 +0000 (UTC) Received: by i-dee0850e.inst.aws.airbnb.com (Postfix, from userid 1041) id 19CBA24C60; Thu, 4 Jun 2015 07:36:09 +0000 (UTC) Date: Thu, 04 Jun 2015 07:36:08 +0000 From: Airbnb <discover@airbnb.com> To: mister@james.org Message-ID: <556fffe8cac78_7ed0e0fe204457be@i-dee0850e.mail> Subject: Text and Html not similar Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_556fffe8c7e84_7ed0e0fe20445637"; charset=UTF-8 Content-Transfer-Encoding: 7bit X-User-ID: 32692788 X-Locale: fr X-Category: engagement X-Template: low_intent_top_destinations recipients: ===================================================== == File: mailbox/store/src/test/resources/eml/mail4.eml ===================================================== Return-Path: <mailet-api-return-812-benwa=minet.net@james.apache.org> Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Fri, 15 May 2015 08:36:03 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx2.minet.net (Postfix) with ESMTP id 5AC87A19A4F for <benwa@minet.net>; Fri, 15 May 2015 08:36:03 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.51 X-Spam-Level: X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, T_RP_MATCHES_RCVD=-0.01] autolearn=ham Received: from mx1.minet.net ([IPv6:::ffff:192.168.102.25]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id 2xNJ-Rh-AWoj for <benwa@minet.net>; Fri, 15 May 2015 06:36:02 +0000 (UTC) Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=mailet-api-return-812-benwa=minet.net@james.apache.org; receiver=benwa@minet.net Authentication-Results: mx1.minet.net; dkim=none reason="no signature"; dkim-adsp=none (insecure policy); dkim-atps=neutral Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1.minet.net (Postfix) with SMTP id 24F75686039 for <benwa@minet.net>; Fri, 15 May 2015 08:36:01 +0200 (CEST) Received: (qmail 81830 invoked by uid 500); 15 May 2015 06:36:00 -0000 Mailing-List: contact mailet-api-help@james.apache.org; run by ezmlm Precedence: bulk List-Help: <mailto:mailet-api-help@james.apache.org> List-Unsubscribe: <mailto:mailet-api-unsubscribe@james.apache.org> List-Post: <mailto:mailet-api@james.apache.org> List-Id: <mailet-api.james.apache.org> Reply-To: mailet-api@james.apache.org Delivered-To: mailing list mailet-api@james.apache.org Received: (qmail 81730 invoked by uid 99); 15 May 2015 06:36:00 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 15 May 2015 06:36:00 +0000 Date: Fri, 15 May 2015 06:35:59 +0000 (UTC) From: "Eric Charles (JIRA)" <mailet-api@james.apache.org> To: "zzz" <a-mailet-api@james.apache.org> Cc: monkey@any.com Bcc: monkey@any.com Message-ID: <JIRA.12825882.1430301328000.124152.1431671759942@Atlassian.JIRA> In-Reply-To: <JIRA.12825882.1430301328000@Atlassian.JIRA> References: <JIRA.12825882.1430301328000@Atlassian.JIRA> <JIRA.12825882.1430301328925@arcas> Subject: [jira] [Resolved] (MAILET-94) James Mailet should use latest version of other James subprojects MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 ===================================================== == File: mailbox/store/src/test/resources/eml/recursiveMail.eml ===================================================== Return-Path: <mbaechler@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Wed, 10 Jun 2015 10:45:29 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.69.2.28] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id 7F33E728 for <btellier@linagora.com>; Wed, 10 Jun 2015 10:45:28 +0200 (CEST) Message-ID: <5577F927.2040409@linagora.com> Date: Wed, 10 Jun 2015 10:45:27 +0200 From: Matthieu Baechler <mbaechler@linagora.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0 MIME-Version: 1.0 To: btellier@linagora.com Subject: Fwd: Courbe Sprint References: <556EA5E0.8010008@linagora.com> In-Reply-To: <556EA5E0.8010008@linagora.com> X-Forwarded-Message-Id: <556EA5E0.8010008@linagora.com> Content-Type: multipart/mixed; boundary="------------080603090509090707040003" This is a multi-part message in MIME format. --------------080603090509090707040003 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Forward as attachment ! --------------080603090509090707040003 Content-Type: message/rfc822; name="Courbe Sprint.eml" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="Courbe Sprint.eml" Return-Path: <aduprat@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Wed, 03 Jun 2015 08:59:45 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.69.43.36] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id 4FBAF720 for <mbaechler@linagora.com>; Wed, 3 Jun 2015 08:59:45 +0200 (CEST) Message-ID: <556EA5E0.8010008@linagora.com> ===================================================== == File: mailbox/store/src/test/resources/eml/emailWithNonIndexableAttachment.eml ===================================================== Return-Path: <laura.ro@linagora.com> MIME-Version: 1.0 Delivered-To: laura.ro@linagora.com Content-Type: multipart/mixed; boundary="-=Part.0.16b49c355c1c1b54.158b4d6fd1b.bd3741f90275bb0a=-" From: Laura ROYET <laura.ro@linagora.com> Sender: Laura ROYET <laura.ro@linagora.com> To: Laura ROYET <laura.ro@linagora.com> Subject: test Message-ID: 1480502737913 Date: Wed, 30 Nov 2016 10:45:38 +0000 ---=Part.0.16b49c355c1c1b54.158b4d6fd1b.bd3741f90275bb0a=- Content-Type: text/html; charset=utf-8; name="=?US-ASCII?Q?test.html?=" Content-Disposition: attachment Content-Transfer-Encoding: base64 PCFET0NUWVBFIGh0bWw+CjxodG1sIGNsYXNzPSJtb3ppbGxhIiBsYW5nPSJlbiI+PGhlYWQ+Cjxt ZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0 PVVURi04Ij4KICAgIAoKCgoKCjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVp dj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1FZGdlIj4KPG1ldGEgbmFtZT0iYXBwbGlj YXRpb24tbmFtZSIgY29udGVudD0iSklSQSIgZGF0YS1uYW1lPSJqaXJhIiBkYXRhLXZlcnNpb249 IjYuNC41Ij48bWV0YSBuYW1lPSJhanMtc2VydmVyUmVuZGVyZWRWaWV3SXNzdWUiIGNvbnRlbnQ9 InRydWUiPgo8bWV0YSBuYW1lPSJhanMtaGFzQ3JpdGVyaWFBdXRvVXBkYXRlIiBjb250ZW50PSJ0 cnVlIj4KPG1ldGEgbmFtZT0iYWpzLXZpZXdpc3N1ZS11c2UtaGlzdG9yeS1hcGkiIGNvbnRlbnQ9 ImZhbHNlIj4KPG1ldGEgbmFtZT0iYWpzLXZpZXdpc3N1ZS1tYXgtY2FjaGUtc2l6ZSIgY29udGVu dD0iIj4KPG1ldGEgbmFtZT0iYWpzLWF1dG9jb21wbGV0ZS1lbmFibGVkIiBjb250ZW50PSJ0cnVl Ij4KPG1ldGEgbmFtZT0iYWpzLXZpZXctaXNzdWUtdHJhY2Uta2V5IiBjb250ZW50PSJqaXJhLmlz c3VlLnJlZnJlc2hlZCI+CjxtZXRhIG5hbWU9ImFqcy12aWV3LWlzc3VlLXBzeWNoby1rZXkiIGNv bnRlbnQ9ImppcmEucHN5Y2hvLmlzc3VlLnJlZnJlc2hlZCI+CjxtZXRhIG5hbWU9ImFqcy12aWV3 LWlzc3VlLXJlZnJlc2hlZC1jYWNoZWQta2V5IiBjb250ZW50PSJqaXJhLnBzeWNoby5pc3N1ZS5y ZWZyZXNoZWQuY2FjaGVkIj4KPG1ldGEgbmFtZT0iYWpzLXJldHVybi10by1zZWFyY2gtdHJhY2Ut a2V5IiBjb250ZW50PSJqaXJhLnJldHVybmVkLnRvLnNlYXJjaCI+CjxtZXRhIG5hbWU9ImFqcy1y ZXR1cm4tdG8tc2VhcmNoLXBzeWNoby1rZXkiIGNvbnRlbnQ9ImppcmEucHN5Y2hvLnJldHVybmVk LnRvLnNlYXJjaCI+CjxtZXRhIG5hbWU9ImFqcy1kZWZhdWx0LWF2YXRhci11cmwiIGNvbnRlbnQ9 Imh0dHBzOi8vY2kub3Blbi1wYWFzLm9yZy9qaXJhL3NlY3VyZS91c2VyYXZhdGFyP3NpemU9eHNt YWxsJmFtcDthdmF0YXJJZD0xMDEyMyI+CjxtZXRhIG5hbWU9ImFqcy1qaXJhLmlzc3Vlcy5wcmVm ZXJyZWQubGF5b3V0LmtleSIgY29udGVudD0ic3BsaXQtdmlldyI+CjxtZXRhIG5hbWU9ImFqcy1t YXgtcmVjZW50LXNlYXJjaGVycyIgY29udGVudD0iMTAiPgo8bWV0YSBuYW1lPSJhanMtamlyYS1i YXNlLXVybCIgY29udGVudD0iaHR0cHM6Ly9jaS5vcGVuLXBhYXMub3JnL2ppcmEiPgo8bWV0YSBu YW1lPSJhanMtZGV2LW1vZGUiIGNvbnRlbnQ9ImZhbHNlIj4KPG1ldGEgbmFtZT0iYWpzLWNvbnRl eHQtcGF0aCIgY29udGVudD0iL2ppcmEiPgo8bWV0YSBuYW1lPSJhanMtdmVyc2lvbi1udW1iZXIi IGNvbnRlbnQ9IjYuNC41Ij4KPG1ldGEgbmFtZT0iYWpzLWJ1aWxkLW51bWJlciIgY29udGVudD0i NjQwMjAiPgo8bWV0YSBuYW1lPSJhanMtaXMtYmV0YSIgY29udGVudD0iZmFsc2UiPgo8bWV0YSBu YW1lPSJhanMtaXMtcmMiIGNvbnRlbnQ9ImZhbHNlIj4KPG1ldGEgbmFtZT0iYWpzLWlzLXNuYXBz aG90IiBjb250ZW50PSJmYWxzZSI+CjxtZXRhIG5hbWU9ImFqcy1pcy1taWxlc3RvbmUiIGNvbnRl bnQ9ImZhbHNlIj4KPG1ldGEgbmFtZT0iYWpzLXJlbW90ZS11c2VyIiBjb250ZW50PSJzY29sc29u Ij4KPG1ldGEgbmFtZT0iYWpzLXJlbW90ZS11c2VyLWZ1bGxuYW1lIiBjb250ZW50PSJTdGVwaGFu ZSBDT0xTT04iPgo8bWV0YSBuYW1lPSJhanMtdXNlci1sb2NhbGUiIGNvbnRlbnQ9ImVuX1VTIj4K PG1ldGEgbmFtZT0iYWpzLXVzZXItbG9jYWxlLWdyb3VwLXNlcGFyYXRvciIgY29udGVudD0iLCI+ ===================================================== == File: mailbox/store/src/test/resources/eml/mailWithLongHeaders.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: attachment header: 012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798012345679801234567980123456798 # Hello ``` Code snipset ``` ------=_Part_0_1330682067197-- ===================================================== == File: mailbox/store/src/test/resources/eml/calendar2.eml ===================================================== From: Test 1 <test1@linagora.com> To: Test 2 <test2@linagora.com> Subject: New Time Proposed: New event from Test: lole Date: Tue, 13 Mar 2018 14:36:08 +0000 Message-ID: <AM5P190MB03542A58E344C68475A951AFD20@AM5P190MB0354.EURP190.PROD.OUTLOOK.COM> Accept-Language: en-US Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_" MIME-Version: 1.0 --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Will be better for me, thx --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <html> <p>Will be better for me, thx</p> </html> --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/calendar; charset="utf-8"; method=COUNTER Content-Disposition: attachment; filename="attachment.txt" Content-Transfer-Encoding: base64 QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6Q09VTlRFUg0KUFJPRElEOk1pY3Jvc29mdCBFeGNoYW5n ZSBTZXJ2ZXIgMjAxMA0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpFdXJvcGUv QmVybGluDQpCRUdJTjpTVEFOREFSRA0KRFRTVEFSVDoxNjAxMDEwMVQwMzAwMDANClRaT0ZGU0VU RlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7SU5URVJWQUw9 MTtCWURBWT0tMVNVO0JZTU9OVEg9MTANCkVORDpTVEFOREFSRA0KQkVHSU46REFZTElHSFQNCkRU U0VRVUVOQ0U6MA0KRFRTVEFNUDoyMDE4MDMxM1QxNDM2MDdaDQpDT01NRU5UO0xBTkdVQUdFPWVu LVVTOldpbGwgYmUgYmV0dGVyIGZvciBtZVwsIHRoeFxuDQpFTkQ6VkVWRU5UDQpFTkQ6VkNBTEVO REFSDQo= --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_-- ===================================================== == File: mailbox/store/src/test/resources/eml/signedMessage.eml ===================================================== Return-Path: <client@linagora.com> From: Important Client <client@linagora.com> To: Big Boss <big.boss@linagora.com>, Big big boss <big.big.boss@linagora.com> Subject: Fwd: Re: Deploying production instances of James Date: Fri, 17 Nov 2017 11:50:12 +0100 Message-ID: <3927114.HFsDrDgxHn@domain.com> Organization: Linagora MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart2399737.qbvXs1L0ps"; micalg="pgp-sha1"; protocol="application/pgp-signature" --nextPart2399737.qbvXs1L0ps Content-Type: multipart/mixed; boundary="nextPart3147505.khcI58SeaZ" Content-Transfer-Encoding: 7Bit This is a multi-part message in MIME format. --nextPart3147505.khcI58SeaZ Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-1" For your information, --nextPart3147505.khcI58SeaZ Content-Type: message/rfc822 Content-Disposition: inline; filename="message suivi" Content-Description: Harold Goguelin <hgoguelin@linagora.com>: Re: La Cerise - certificat =?UTF-8?B?RXhwaXLDqQ==?= Return-Path: <project.manager@linagora.com> Subject: Re: Deploying production instances of James To: Important Client <client@linagora.com> From: Project manager <project.manager@linagora.com> Organization: Linagora Message-ID: <c66d7ca6-24R2-d6ec-abac-c1f72ca428dd@linagora.com> Date: Fri, 17 Nov 2017 11:39:27 +0100 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------51EED611A8498A33106C3AAD" Content-Language: fr This is a multi-part message in MIME format. --------------51EED611A8498A33106C3AAD Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: 8bit Message envoyé grâce à OBM <http://obm.org>, la Communication Libre par Linagora <http://www.linagora.com/> --------------51EED611A8498A33106C3AAD Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 8bit ===================================================== == File: mailbox/store/src/test/resources/eml/oneAttachmentWithSimpleContentType.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gimp.png" 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 ------=_Part_0_1330682067197-- ===================================================== == File: mailbox/store/src/test/resources/eml/mail5.eml ===================================================== Date: Fri, 15 May 2015 06:35:59 +0000 (UTC) From: "Luc DUZAN (JIRA)" <luc.duzan@james.apache.org> To: "zzz" <mailet-api@james.apache.org> Cc: any@any.com Bcc: any@any.com Message-ID: <JIRA.1234567890@Atlassian.JIRA> Subject: This is a mail about mail! MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit This is the body of the mail ===================================================== == File: mailbox/store/src/test/resources/eml/multiAttachmentsWithOneWrongContentDisposition.eml ===================================================== Return-Path: <from@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Mon, 27 Feb 2017 05:24:55 +0100 X-Sieve: CMU Sieve 2.2 Received: from [192.168.12.138] (unknown [1.55.245.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id 688BF7A9 for <from@linagora.com>; Mon, 27 Feb 2017 05:24:54 +0100 (CET) To: to@linagora.com From: Lina <from@linagora.com> Subject: MultiAttachment Message-ID: <13d4375e-a4a9-f613-06a1-7e8cb1e0ea93@linagora.com> Date: Mon, 27 Feb 2017 11:24:48 +0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------64D8D789FC30153D6ED18258" This is a multi-part message in MIME format. --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Send --------------64D8D789FC30153D6ED18258 Content-Type: text/plain; charset=UTF-8; name="text1" Content-Transfer-Encoding: base64 Content-Disposition: wrongDisposition; filename="text1" LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBeDdQRzAr RS8vRU1wbTdJZ0k1UTlUTURTRnlhLzFoRSt2dlRKcmswaUdGbGxQZUhMCkE1L1ZsVE0wWVdn RzZYNTBxaU1mRTNWTGF6ZjJjMTlpWHJUMG1xLzIxUFoxd0Zub2d2NHp4VU5haWgrQm5nNjIK RjBTeXJ1RS9PL05qcXhoL0NjcTZLL2UwNVRWNFQ2NDNVU3hBZUcwS3BwbVlXOXg4SEEvR3ZW ODMyYXBadXhrVgppNk5Wa0RCcmZ6YVVDd3U0ekgrSHdPdi9wSTg3RTdLY2NIWUMrK0JpYWoz Cg== --------------64D8D789FC30153D6ED18258 Content-Type: application/vnd.ms-publisher; name="text2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="text2" c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFESHM4YlQ0VC84UXltYnNp ===================================================== == File: mailbox/store/src/test/resources/eml/spamMail.eml ===================================================== Return-Path: <root-bounces@listes.minet.net> Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Wed, 03 Jun 2015 11:05:45 +0200 X-Sieve: CMU Sieve 2.4 Received: from smtp.minet.net (smtp.minet.net [192.168.102.18]) by mx1.minet.net (Postfix) with ESMTP id F06FE610F72; Wed, 3 Jun 2015 11:05:48 +0200 (CEST) Received: from listes.minet.net (listes.minet.net [192.168.102.29]) by smtp.minet.net (Postfix) with ESMTP id AAB15610F70; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=minet.net; s=mail; t=1433322348; bh=8OtmVRMX7IWWyQo8WQIi5rKeDEQFghSX2r1WN9/pqUk=; h=From:Date:To:Subject:List-Id:List-Unsubscribe:List-Post:List-Help: List-Subscribe:From; b=UkthSFXn5mtPnn7sYvDJIxgCk1O36L0p+hTOnI/xTF2WRMGJyXtLyCdFdE5jQ5gE4 EGNdhwmfjaKsoE7IDtc/4GrPvbnM8i9ojpSOBW1hXJPOeYnRgah/4gsXsMJWvmmq/A 4oTnw8ZswFXiShDmBMyaSEZuVrWTdaPBgUhVhGw8= Received: from listes.minet.net (listes.minet.net [127.0.0.1]) by listes.minet.net (Postfix) with ESMTP id 9CD5BA27FF9; Wed, 3 Jun 2015 09:05:48 +0000 (UTC) X-Original-To: root@listes.minet.net Delivered-To: root@listes.minet.net Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by listes.minet.net (Postfix) with ESMTP id B8C1FA27FEF for <root@listes.minet.net>; Wed, 3 Jun 2015 09:05:46 +0000 (UTC) Received: from localhost (spam.minet.net [192.168.102.97]) by mx1.minet.net (Postfix) with ESMTP id AD28B610F6D for <root@listes.minet.net>; Wed, 3 Jun 2015 11:05:46 +0200 (CEST) Content-Type: multipart/mixed; boundary="----------=_1433322346-12583-0" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 From: "Content-filter at spam.minet.net" <postmaster@minet.net> Date: Wed, 3 Jun 2015 09:05:46 +0000 (UTC) To: <root@listes.minet.net> Message-ID: <VASs-IZaXqmZao@spam.minet.net> Subject: [root] UNCHECKED contents in mail FROM <quentin.h@riseup.net> X-BeenThere: root@listes.minet.net X-Mailman-Version: 2.1.15 Precedence: list List-Id: <root.listes.minet.net> List-Unsubscribe: <https://listes.minet.net/cgi-bin/mailman/options/root>, <mailto:root-request@listes.minet.net?subject=unsubscribe> List-Post: <mailto:root@listes.minet.net> List-Help: <mailto:root-request@listes.minet.net?subject=help> List-Subscribe: <https://listes.minet.net/cgi-bin/mailman/listinfo/root>, <mailto:root-request@listes.minet.net?subject=subscribe> Errors-To: root-bounces@listes.minet.net Sender: "root" <root-bounces@listes.minet.net> ===================================================== == File: mailbox/store/src/test/resources/eml/mail.eml ===================================================== Return-Path: <arch-general-bounces@archlinux.org> Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Thu, 04 Jun 2015 06:09:06 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx2.minet.net (Postfix) with ESMTP id 4492D821966 for <benwa@minet.net>; Thu, 4 Jun 2015 06:09:11 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.499 X-Spam-Level: X-Spam-Status: No, score=-1.499 required=1 tests=[BAYES_00=-1.5, FREEMAIL_FROM=0.001, T_DKIM_INVALID=0.01, T_RP_MATCHES_RCVD=-0.01] autolearn=ham Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id Meygb-OHe7nm for <benwa@minet.net>; Thu, 4 Jun 2015 04:09:10 +0000 (UTC) Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=5.9.250.164; helo=luna.archlinux.org; envelope-from=arch-general-bounces@archlinux.org; receiver=benwa@minet.net Authentication-Results: mx2.minet.net; dkim=fail reason="verification failed; insecure key" header.d=gmail.com header.i=@gmail.com header.b=rtUETpuc; dkim-adsp=none (insecure policy); dkim-atps=neutral Received: from luna.archlinux.org (luna.archlinux.org [5.9.250.164]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.minet.net (Postfix) with ESMTPS id DD66B821952 for <benwa@minet.net>; Thu, 4 Jun 2015 06:09:09 +0200 (CEST) Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id A0E06260C6; Thu, 4 Jun 2015 04:09:05 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id 0CD88260C5 for <arch-general@lists.archlinux.org>; Thu, 4 Jun 2015 04:09:04 +0000 (UTC) Received: from nymeria.archlinux.org (nymeria.archlinux.org [89.238.67.251]) by luna.archlinux.org (Postfix) with ESMTPS for <arch-general@lists.archlinux.org>; Thu, 4 Jun 2015 04:09:04 +0000 (UTC) Received: from nymeria.archlinux.org (localhost.localdomain [127.0.0.1]) by nymeria.archlinux.org (Postfix) with ESMTP id DDBB240260 for <arch-general@archlinux.org>; Thu, 4 Jun 2015 06:09:02 +0200 (CEST) Received: from mail-wg0-x22c.google.com (mail-wg0-x22c.google.com [IPv6:2a00:1450:400c:c00::22c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by nymeria.archlinux.org (Postfix) with ESMTPS for <arch-general@archlinux.org>; Thu, 4 Jun 2015 06:09:02 +0200 (CEST) Received: by wgme6 with SMTP id e6so23798103wgm.2 for <arch-general@archlinux.org>; Wed, 03 Jun 2015 21:09:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; ===================================================== == File: mailbox/store/src/test/resources/eml/mailWithManyHeaders.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: attachment header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto header: toto ===================================================== == File: mailbox/store/src/test/resources/eml/oneAttachmentWithEmptyContentType.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gimp.png" 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 ------=_Part_0_1330682067197-- ===================================================== == File: mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithNoCid.eml ===================================================== Return-Path: <test@local.com> Received: from localhost; Tue, 05 Jul 2016 11:47:47 +0200 X-Sieve: CMU Sieve 2.2 To: Test <test@local.com> From: Test <test@local.com> Subject: Inline attachment Message-ID: <26d91590-b995-8d45-f66a-0433c65745bb@linagora.com> Date: Tue, 5 Jul 2016 11:47:46 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------FC06E08B3CDF05E9A3E28077" This is a multi-part message in MIME format. --------------FC06E08B3CDF05E9A3E28077 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit This is an inline attachment: Cheers! --------------FC06E08B3CDF05E9A3E28077 Content-Type: multipart/related; boundary="------------47107B0D40019CDFED2C4263" --------------47107B0D40019CDFED2C4263 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> This is an inline attachment:<br> <br> <img alt="" src="cid:part1.37A15C92.A7C3488D@linagora.com" height="73" width="73"><br> <br> <br> Cheers!<br> </body> </html> --------------47107B0D40019CDFED2C4263 Content-Type: image/png; name="james-logo-square.png" ===================================================== == File: mailbox/store/src/test/resources/eml/invalidCharset.eml ===================================================== To: Antoine DUPRAT <xyz@linagora.com> From: Antoine DUPRAT <xyz@linagora.com> Subject: Inline attachment Message-ID: <26d91590-b995-8d45-f66a-0433c65745bb@linagora.com> Date: Tue, 5 Jul 2016 11:47:46 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset=%invalid; format=flowed Content-Transfer-Encoding: 7bit This is an inline attachment: Cheers! ===================================================== == File: mailbox/store/src/test/resources/eml/headerWithDot.eml ===================================================== From: me@example.com To: you@example.com X-normal-header: normal header X-header.with.dots: header with dots Subject: Test me Please! ===================================================== == File: mailbox/store/src/test/resources/eml/emailWithOnlyAttachment.eml ===================================================== Return-Path: <chibenwa@apache.org> Subject: 29989 btellier From: <any@mail.com> Content-Disposition: attachment MIME-Version: 1.0 Date: Sun, 02 Apr 2017 22:09:04 -0000 Content-Type: application/zip; name="9559333830.zip" To: <chibenwa@apache.org> Message-ID: <149117094410.10639.6001033367375624@any.com> Content-Transfer-Encoding: base64 UEsDBBQAAgAIAEQeg0oN2YT/EAsAAMsWAAAIABwAMjIwODUuanNVVAkAAxBy4VgQcuFYdXgLAAEE AAAAAAQAAAAApZhbi1zHFYWfY/B/MP3i7kwj1/2CokAwBPIQ+sGPkgJ1tURkdeiMbYzQf8+3q8+M ZmQllgn2aHrqnNq1L2uvtavnj2/b7evz26/Op5M6q/P+8OUX77784g8/lQtLisXTU/68vfzCv/Lg D9vqs/3b8fNXf92273ey4XTCykk9w9LpfD7tX+zGzU83b8pPg39uBr/Kmxe7w9PLuP3xwpFKTJ32 AAEEAAAAAAQAAAAAUEsFBgAAAAABAAEATgAAAFILAAAAAA== ===================================================== == File: mailbox/store/src/test/resources/eml/inlined-mixed.eml ===================================================== Date: Wed, 26 Jan 2022 12:21:37 +0100 From: Bob <bob@domain.tld> To: Alice <alice@domain.tld> Subject: My subject Message-ID: <20220126112137.wookj26xellphlam@W0248292> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="7f4cfz6rtfqdbqxn" Content-Disposition: inline Content-Transfer-Encoding: 8bit --7f4cfz6rtfqdbqxn Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Main test message... --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="yyy.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn Content-Type: application/json; charset=us-ascii Content-Disposition: attachment; filename="xxx.txt" Content-Transfer-Encoding: quoted-printable [ { "Id": "3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } ] --7f4cfz6rtfqdbqxn-- ===================================================== == File: mailbox/store/src/test/resources/eml/filenameOnly.eml ===================================================== Return-Path: <any@linagora.com> MIME-Version: 1.0 Delivered-To: ddo@linagora.com Date: Mon, 21 Aug 2017 00:17:47 +0200 From: any@linagora.com To: any@linagora.com Subject: Inventaire des VMs Message-ID: <599a0a8b.MepmS5MLy1x/pobR%any@linagora.com> Content-Type: multipart/mixed; boundary="=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA" This is a multi-part message in MIME format. --=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Bonjour En pièce jointe l'inventaire à jour des VMs et les erreurs Cordialement. --=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA Content-Type: text/csv; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="inventory.csv" DATA --=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA ===================================================== == File: mailbox/store/src/test/resources/eml/noContentDispositionWithCID.eml ===================================================== To: me@linagora.com From: Benoit Tellier <me@linagora.com> Subject: Mail with text attachment Message-ID: <befd8cab-9c9c-5537-4e77-937f32326087@any.com> Date: Thu, 13 Oct 2016 10:26:20 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------4FD2D252DB453546C22C25B2" This is a multi-part message in MIME format. --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I'm the body! --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-ID: <id> I'm a Schroedinger cat --------------4FD2D252DB453546C22C25B2-- ===================================================== == File: mailbox/store/src/test/resources/eml/embeddedAttachmentWithAttachment.eml ===================================================== Return-Path: <aduprat@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 12 May 2016 16:09:40 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.69.0.107] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id 233CA267F for <aduprat@linagora.com>; Thu, 12 May 2016 16:09:40 +0200 (CEST) References: <57348E62.7000505@linagora.com> Subject: Fwd: EmbeddedAttachment To: Antoine DUPRAT <aduprat@linagora.com> From: Antoine DUPRAT <aduprat@linagora.com> X-Forwarded-Message-Id: <57348E62.7000505@linagora.com> Message-ID: <57348EA3.8010501@linagora.com> Date: Thu, 12 May 2016 16:09:39 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <57348E62.7000505@linagora.com> Content-Type: multipart/mixed; boundary="------------040807010700040800000502" This is a multi-part message in MIME format. --------------040807010700040800000502 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit forwarded --------------040807010700040800000502 Content-Type: message/rfc822; name="EmbeddedAttachment.eml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="EmbeddedAttachment.eml" Return-Path: <aduprat@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 12 May 2016 16:08:35 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.69.0.107] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id 0FC992683 for <aduprat@linagora.com>; Thu, 12 May 2016 16:08:35 +0200 (CEST) To: Antoine DUPRAT <aduprat@linagora.com> From: Antoine DUPRAT <aduprat@linagora.com> ===================================================== == File: mailbox/store/src/test/resources/eml/oneInlinedAttachment.eml ===================================================== Return-Path: <aduprat@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Tue, 05 Jul 2016 11:47:47 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.69.0.107] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id F1F3E74E for <aduprat@linagora.com>; Tue, 5 Jul 2016 11:47:46 +0200 (CEST) To: Antoine DUPRAT <aduprat@linagora.com> From: Antoine DUPRAT <aduprat@linagora.com> Subject: Inline attachment Message-ID: <26d91590-b995-8d45-f66a-0433c65745bb@linagora.com> Date: Tue, 5 Jul 2016 11:47:46 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------FC06E08B3CDF05E9A3E28077" This is a multi-part message in MIME format. --------------FC06E08B3CDF05E9A3E28077 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit This is an inline attachment: Cheers! --------------FC06E08B3CDF05E9A3E28077 Content-Type: multipart/related; boundary="------------47107B0D40019CDFED2C4263" --------------47107B0D40019CDFED2C4263 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> This is an inline attachment:<br> <br> ===================================================== == File: mailbox/store/src/test/resources/eml/james-3901.eml ===================================================== Return-Path: <firstname1.surname1@upn.integration-open-paas.org> Received: from 10.2.0.0 (EHLO 617) ([10.2.0.0]) by smtp.upn.integration-open-paas.org (JAMES SMTP Server ) with ESMTP ID -489272706 for <firstname1.surname1@upn.integration-open-paas.org>; Sat, 28 Nov 2020 10:49:24 +0000 (GMT) Date: Wed, 4 Apr 2001 13:19:00 -0700 (PDT),Wed, 4 Apr 2001 13:19:00 -0700 (PDT) Message-ID: <IYIOY5YCQEC2XEIOMNMMMASDTLDQ3JZLB@zlsvr22> from: "Drew Fossum" to: "Mary Kay Miller" subject: Revised Draft filename: dfossum.nsf folder: \Drew_Fossum_Dec2000_June2001_2\Notes Folders\Sent date: Wed, 4 Apr 2001 13:19:00 -0700 (PDT),Wed, 4 Apr 2001 13:19:00 -0700 (PDT) Status: RO Cc: X-libpst-forensic-sender: Drew Fossum X-libpst-forensic-bcc: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--boundary-LibPST-iamunique-1722682679_-_-" ----boundary-LibPST-iamunique-1722682679_-_- Content-Type: text/plain; charset="us-ascii" ---------------------- Forwarded by Drew Fossum/ET&S/Enron on 04/04/2001 01:19 PM --------------------------- "Hirasuna, Robert" <rhirasuna@AkinGump.com> on 04/04/2001 10:18:00 AM To: "Drew Fossum (E-mail)" <dfossum@enron.com> cc: Subject: Revised Draft <<4%P001!.DOC>> Use this draft instead. I missed a couple of delted dashes on the first page. The information contained in this e-mail message is intended only for the personal and confidential use of the recipient(s) named above. This message may be an attorney-client communication and/or work product and as such is privileged and confidential. If the reader of this message is not the intended recipient or an agent responsible for delivering it to the intended recipient, you are hereby notified that you have received this document in error and that any review, dissemination, distribution, or copying of this message is strictly prohibited. If you have received this communication in error, please notify us immediately by e-mail, and delete the original message. ===================================================== == File: mailbox/store/src/test/resources/eml/messageWithNonASCIIFilenameAttachment.eml ===================================================== Return-Path: <lroyet@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Fri, 26 Aug 2016 10:00:36 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.69.0.146] (mne69-10-88-173-78-196.fbx.proxad.net [88.173.78.196]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id A863676F for <lroyet@linagora.com>; Fri, 26 Aug 2016 10:00:36 +0200 (CEST) To: Laura ROYET <lroyet@linagora.com> From: Laura Royet <lroyet@linagora.com> Subject: message with non ASCII filename attachment Message-ID: <d929964c-032e-ada5-c97d-a048e9a32bab@linagora.com> Date: Fri, 26 Aug 2016 10:00:35 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------9F1006EBC7F5F7758497FD08" This is a multi-part message in MIME format. --------------9F1006EBC7F5F7758497FD08 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit --------------9F1006EBC7F5F7758497FD08 Content-Type: application/vnd.oasis.opendocument.text; name="=?UTF-8?B?2K/ZitmG2KfYtdmI2LEub2R0?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=utf-8''%D8%AF%D9%8A%D9%86%D8%A7%D8%B5%D9%88%D8%B1%2E%6F%64%74 UEsDBBQAAAgAAOB8GElexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQu b2FzaXMub3BlbmRvY3VtZW50LnRleHRQSwMEFAAACAAA4HwYSQ5gBad3CQAAdwkAABgAAABU aHVtYm5haWxzL3RodW1ibmFpbC5wbmeJUE5HDQoaCgAAAA1JSERSAAAAtQAAAQAIAgAAAHpB oIwAAAk+SURBVHic7dvJT1TpAobxYihmmSQCojIICYao6Q6ioGHlgo2b3nWivei9/1ivOr2Q hYZIolFDwAQktCIgQeIEMg8y3pf65KSA229fSuWyeH7pVE6dOnWw+3vqO+cr6czt7e0Y8A8y /99/ABxr9AGHPuDQBxz6gEMfcOgDDn3AoQ849AGHPuDQBxz6gEMfcOgDzuH62N7eTktL0+PW 1paeajs9PT38BknYH21HT8MBevqvpw3nDE/1Lj0N7wpPwwn9efDdHa6PMDwhiyiUsJH86lZC OCaMejhs36j/048ISWVkZMR244iKTH5XyOV/6Q8pS2X+WFxcfPbs2fr6emVl5eXLl2dmZoqL i7V/aWlpbGwsLy9PT0tLS3XA+Ph4fX19eNe+CSB5RMP+d+/eZWVlLS8vT09PV1dX9/f3l5WV 6dWNjY2mpqZ4PL4vqYPnxHeXyv1HQYI+369evdLgffnyRSPa0dHx+vXrBw8etLW1jYyMbG5u ak9vb69eVSjDw8O1tbXNzc3d3d1VVVXa+eHDhxMnTugk8/Pzubm5V69effLkifbk5OQohcHB wUuXLn3+/Pn9+/eaIVZWVu7du3fx4sWJiYn8/HxVWFRUpB+hR/24MFd99/80iKVwfQmDkZm5 80ZNEm/evNEY63Fubk6jW15ePjU1pWlDB+iTrblEZWhi0B6Nuvp4+vSphvn06dMaeA32yZMn dU7NGaOjo6urq3qLJiftqaio0AGrCXqqnrTx4sWLoaGh8+fP6+Saqx49enTz5s0f858FX6Vy fdHGuXPntK1HzR8qpqWlRa3oo3/9+nUN3rVr11SDjlQQ4ZOt0S0sLNTGnTt3NFuEAhSWDtPs ===================================================== == File: mailbox/store/src/test/resources/eml/filenameAndName.eml ===================================================== Return-Path: <any@linagora.com> MIME-Version: 1.0 Delivered-To: ddo@linagora.com Date: Mon, 21 Aug 2017 00:17:47 +0200 From: any@linagora.com To: any@linagora.com Subject: Inventaire des VMs Message-ID: <599a0a8b.MepmS5MLy1x/pobR%any@linagora.com> Content-Type: multipart/mixed; boundary="=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA" This is a multi-part message in MIME format. --=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Bonjour En pièce jointe l'inventaire à jour des VMs et les erreurs Cordialement. --=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA Content-Type: text/csv; charset=utf-8; name="good.csv"; Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="bad.csv" DATA --=_599a0a8b.iCfd4209N6lpM3fjUmImU2D6HH6PWpQZh/HT8dK7qTYz0tRA ===================================================== == File: mailbox/store/src/test/resources/eml/invitationEmailFromOP.eml ===================================================== Return-Path: <rbevillard@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Tue, 05 Jul 2016 17:33:42 +0200 X-Sieve: CMU Sieve 2.2 Received: from [127.0.0.1] (openpaas-rse.linagora.dc1 [172.16.18.188]) by alderaan.linagora.com (Postfix) with ESMTP id 1F72974B for <ddolcimascolo@linagora.com>; Tue, 5 Jul 2016 17:33:42 +0200 (CEST) Content-Type: multipart/mixed; boundary="----sinikael-?=_1-14677328221140.595814419677481" From: rbevillard@linagora.com To: ddolcimascolo@linagora.com Subject: New event from Romain BEVILLARD: test event X-Mailer: nodemailer (1.3.4; +http://www.nodemailer.com; SMTP/1.1.0[client:1.3.8]) Date: Tue, 05 Jul 2016 15:33:42 +0000 Message-Id: <1467732822125-f0c14587-1cd7b923-0d50a279@linagora.com> MIME-Version: 1.0 ------sinikael-?=_1-14677328221140.595814419677481 Content-Type: multipart/alternative; boundary="----sinikael-?=_2-14677328221140.595814419677481" ------sinikael-?=_2-14677328221140.595814419677481 Content-Type: multipart/related; type="text/html"; boundary="----sinikael-?=_3-14677328221140.595814419677481" ------sinikael-?=_3-14677328221140.595814419677481 Content-Type: text/html Content-Transfer-Encoding: base64 PCFET0NUWVBFIGh0bWw+CjxodG1sIGNsYXNzPSJtYWlsIj4KICA8aGVhZD4KICAgIDxtZXRhIGNo YXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1k ZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CiAgICA8c3R5bGU+QG1lZGlhIChtYXgtd2lk dGg6IDc2OHB4KSB7CiAgLmNvbnRlbnQgewogICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAg IGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDsKICB9Cn0KCiAgICA8L3N0eWxlPgogIDwvaGVh ZD4KICA8Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsiPgogICAgPGRpdiBj bGFzcz0id3JhcHBlciIgc3R5bGU9IndpZHRoOiA3MDBweDsgbWFyZ2luLWxlZnQ6IGF1dG87IG1h cmdpbi1yaWdodDogYXV0bzsiPjxicj4KICAgICAgPGRpdiBjbGFzcz0ibWFpbC1jb250ZW50IiBz dHlsZT0icGFkZGluZzogMTBweCAxM3B4OyBib3JkZXItcmFkaXVzOiA1cHg7IHRleHQtYWxpZ246 IGp1c3RpZnk7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyI+CiAgICAgICAgPHRhYmxlIHN0eWxl PSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogMTAwJTsgY29sb3I6ICMzMzMzMzM7 Ij4KICAgICAgICAgIDx0ciBjbGFzcz0idGFibGUtaGVhZGVyIiBzdHlsZT0idGV4dC1hbGlnbjog cmlnaHQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDZkN2Q5OyI+CiAgICAgICAgICAgIDx0 ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibG9nbyIgc3R5bGU9InBhZGRpbmctYm90dG9tOiAxMHB4OyBw YWRkaW5nLXRvcDogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICA8ZGl2 PjxhIGhyZWY9Imh0dHBzOi8vZGV2Lm9wZW4tcGFhcy5vcmciPjxpbWcgc3JjPSJjaWQ6bG9nbyIg YWx0PSJvcGVuLXBhYXMgbG9nbyI+PC9hPjwvZGl2PgogICAgICAgICAgICA8L3RkPgogICAgICAg ICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9Im9yZ2FuaXplciIgc3R5bGU9InBhZGRpbmctYm90 dG9tOiAxMHB4OyBwYWRkaW5nLXRvcDogNXB4OyB0ZXh0LWFsaWduOiByaWdodDsgdHJhbnNmb3Jt ===================================================== == File: mailbox/store/src/test/resources/eml/mail3.eml ===================================================== Return-Path: <server-dev-return-56848-benwa=minet.net@james.apache.org> Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Tue, 02 Jun 2015 10:16:17 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx1.minet.net (Postfix) with ESMTP id 52917327827 for <benwa@minet.net>; Tue, 2 Jun 2015 10:16:22 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.51 X-Spam-Level: X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, T_RP_MATCHES_RCVD=-0.01] autolearn=ham Received: from mx1.minet.net ([IPv6:::ffff:192.168.102.25]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id rcP3IZbh_eqS for <benwa@minet.net>; Tue, 2 Jun 2015 08:16:21 +0000 (UTC) Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=server-dev-return-56848-benwa=minet.net@james.apache.org; receiver=benwa@minet.net Authentication-Results: mx1.minet.net; dkim=none reason="no signature"; dkim-adsp=none (insecure policy); dkim-atps=neutral Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1.minet.net (Postfix) with SMTP id 37EAD327826 for <benwa@minet.net>; Tue, 2 Jun 2015 10:16:20 +0200 (CEST) Received: (qmail 1143 invoked by uid 500); 2 Jun 2015 08:16:20 -0000 Mailing-List: contact server-dev-help@james.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: <mailto:server-dev-unsubscribe@james.apache.org> List-Help: <mailto:server-dev-help@james.apache.org> List-Post: <mailto:server-dev@james.apache.org> List-Id: "James Developers List" <server-dev.james.apache.org> Reply-To: "James Developers List" <server-dev@james.apache.org> Delivered-To: mailing list server-dev@james.apache.org Received: (qmail 1132 invoked by uid 99); 2 Jun 2015 08:16:20 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jun 2015 08:16:20 +0000 Date: Tue, 2 Jun 2015 08:16:19 +0000 (UTC) From: "abcd" <jira@apache.org> Cc: zzz@bcd.org To: "server" <c-server-dev@james.apache.org> Message-ID: <JIRA.12473940.1284322083000.91735.1433232979714@Atlassian.JIRA> In-Reply-To: <JIRA.12473940.1284322083000@Atlassian.JIRA> References: <JIRA.12473940.1284322083000@Atlassian.JIRA> <JIRA.12473940.1284322083687@arcas> Subject: [jira] [Closed] (MAILBOX-11) MailboxQuery ignore namespace MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 ===================================================== == File: mailbox/store/src/test/resources/eml/frnog.eml ===================================================== Return-Path: <frnog-owner@frnog.org> Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Tue, 02 Jun 2015 12:01:42 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx2.minet.net (Postfix) with ESMTP id E92F2A25320 for <benwa@minet.net>; Tue, 2 Jun 2015 12:01:46 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.499 X-Spam-Level: X-Spam-Status: No, score=-1.499 required=1 tests=[BAYES_00=-1.5, UNPARSEABLE_RELAY=0.001] autolearn=ham Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id bRNLR9Tbk4Jg for <benwa@minet.net>; Tue, 2 Jun 2015 10:01:46 +0000 (UTC) Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=217.24.82.4; helo=cabale.usenet-fr.net; envelope-from=frnog-owner@frnog.org; receiver=benwa@minet.net Received: from cabale.usenet-fr.net (cabale.usenet-fr.net [217.24.82.4]) by mx2.minet.net (Postfix) with ESMTP id 089E7A2531A for <benwa@minet.net>; Tue, 2 Jun 2015 12:01:45 +0200 (CEST) Received: by cabale.usenet-fr.net (Postfix, from userid 90) id A267298A5DC6; Tue, 2 Jun 2015 12:01:44 +0200 (CEST) X-Original-To: frnog@frnog.org Delivered-To: frnog@frnog.org Received: from mta.mail.waycom.net (mta.mail.waycom.net [194.177.32.18]) by cabale.usenet-fr.net (Postfix) with ESMTP id AE2E798A58FC for <frnog@frnog.org>; Tue, 2 Jun 2015 12:01:01 +0200 (CEST) Received: from [127.0.0.1] (localhost [127.0.0.1]) by mta.mail.waycom.net (Postfix) with ESMTP id D30D6567E1 for <frnog@frnog.org>; Tue, 2 Jun 2015 12:00:56 +0200 (CEST) Received: from [127.0.0.1] (localhost [127.0.0.1]) wcm-hv1-exch1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) with Microsoft SMTP Server (TLS) id 15.0.847.32; Tue, 2 Jun 2015 12:00:56 +0200 Message-ID: <556D7ED7.2090108@waycom.net> Date: Tue, 2 Jun 2015 12:00:55 +0200 From: Guillaume Genty <ggenty@waycom.net> Organization: Waycom MIME-Version: 1.0 To: <frnog@frnog.org> Cc: no@no.com Bcc: no@no.com Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: WCM-HV1-EXCH1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) To wcm-hv1-exch1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) X-C2ProcessedOrg: 9180093e-3f32-48c9-b36b-0805cbe4c266 Subject: [FRnOG] [BIZ] Collecte de liens C2E/CELAN en DOM X-Loop: frnog@frnog.org ===================================================== == File: mailbox/store/src/test/resources/eml/twoAttachments.eml ===================================================== Return-Path: <from@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Fri, 27 Feb 2015 20:32:14 +0100 X-Sieve: CMU Sieve 2.2 Received: from canondir.par.lng (unknown [92.103.166.6]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id BAB0D728 for <to@linagora.com>; Fri, 27 Feb 2015 20:31:38 +0100 (CET) X-Priority: 3 (Normal) From: "From" <from@linagora.com> To: "To" <to@linagora.com> Subject: [8/10]Attached Image light with text Date: Fri, 27 Mar 2015 21:48:38 +0100 Message-Id: <20150227203838.0011.CanonTxNo.4037@canondir.par.lng> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="AHNPACBLDCDIDAGGGDDFAABECGCA" --AHNPACBLDCDIDAGGGDDFAABECGCA Content-Type: text/html; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit <b>html</b> --AHNPACBLDCDIDAGGGDDFAABECGCA Content-Type: image/jpeg; name="4037_014.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="4037_014.jpg" /9j/4X2cRXhpZgAASUkqAAgAAAANAA8BAgAKAAAAqgAAABABAgAJAAAAtAAAABIBAwABAAAA AQAAABoBBQABAAAAvgAAABsBBQABAAAAxgAAACgBAwABAAAAAgAAADEBAgAKAAAAzgAAADIB AgAUAAAA2AAAABMCAwABAAAAAgAAAGmHBAABAAAAfAIAAKXEBwDQAAAA7AAAANLGBwBAAAAA vAEAANPGBwCAAAAA/AEAAEwqAABQYW5hc29uaWMARE1DLUZaNDUAALQAAAABAAAAtAAAAAEA AABWZXIuMS4wICAAMjAxNDowMjoyNSAxMDozMjowOQBQcmludElNADAyNTAAAA4AAQAWABYA AgAAAAAAAwBkAAAABwAAAAAACAAAAAAACQAAAAAACgAAAAAACwCsAAAADAAAAAAADQAAAAAA DgDEAAAAAAEFAAAAAQEBAAAAEAGAAAAACREAABAnAAALDwAAECcAAJcFAAAQJwAAsAgAABAn AAABHAAAECcAAF4CAAAQJwAAiwAAABAnAADLAwAAECcAAOUbAAAQJwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ===================================================== == File: mailbox/store/src/test/resources/eml/oneAttachmentAndSomeTextInlined.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: application/octet-stream; name="exploits_of_a_mom.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gimp.png" iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAALxklEQVR4Ae2Xe0xUZ97H5X4RiyAXEARURBSYCzNnLjMwwAx3huGOIBcUFJERAUVRq+KlwHABFdu+b9+0766x1W21ttnUtE3rul6aGNtm3XbdWncjaa3VXrZRK6IgfPd3Tp6wOGmyo0v/cOMknxwy5xzO7/P8LueZaWlpaU80TwWeCvy3CcRwXJlUqp39RApIOE4i5hQPxBz30hMpIJIrjktkseMimfzPUyoglilTf/XVl8u1Ik4xrOJEEMu4wSkVEMmVZ6VSTeivFXy0TDZfIlfc0qil0KpIQM59P6UCUk71lVShPD1t2jT7qQ4+Sq32prq/GhfHjSXFSxGvEfMCQ1MsoLzOadT3pArFwBQ3LSdRqK4mJyfcz0xRwaCLRVKcBDEybmxqBRTKH8uXpEOj0/1MD3wuMTHR8T9adY4LoOD3KuPj7xYVGlGYo0e6gUNKoowkpKBmHpXJZO5TKXCrpjwT5pWFSM1IvROrVH0hksujf+laAHYWi8XT+nsKyIlvVKlSeVSu0twtXpI/Yq4rR2lBKoxpamQmK5Gm55CcIAP1wxAvOWUCEk4xVLvchIaVedi8rgq1NSXjqnjdHcrGayK5yhStVPpbLLvE/Xt6Tnf3Wu529XSM9fZ13Wzbse2kJiGhK1ap/ETCqe5lGLNum+trxnZsbca6tcuwJM+AvKw4mNI1yEpVURYUSE2S8wJ3RSKN35QJUJPdM6/IQ8vaCmzdZMbObU2w7G7BhhbzeEFR4e2SsrIRChqnz5zE999/h9HREXz19SDefOt1dPW0Y8e2Frywtx0vDnRg57NrUVdTgJJ8PYpyEpBvjEdOhvahLIg55YOioiKHRxKgjwPBEaHEQzfz/3DH9mb07+nGsbeO4MjRw+jts8DS3or/GdiNnr4ufP6XC/jhh+9w587PuHdvGLdv38SNG9fwwYfvon9vN3Zvb0Td8lxUlqSirCgZpSRQnJuIgmwdcikL2elqZKUwAbni0aaQvb19M3HT2dnlloODw5Cdnd0d+rKVRFz48xkm0+i+gX5cv34NP/30I86fP4ePPjqL3n4LOjq24O2338CVK1/i22+v4ssvL+HTTz+B2WzGqlUrcfr0HzCwvw9Na8pRXZaBqtI0VBSnYGmBgUooEYUmHYQyyhDKCClJCl7gus0C9DE5OjkNpefkoXvPPugzjIiMEcN9+vQ7JHKFzvs1tzTdO3P2lBD8wYMHce3aNVBTYk1DPXp62/HHUx/g0qXPSOIyBgcHwX/u37+PiMhIiCViHP7dAbRuqAc/CJbxAktIoJAXSEKRiZURCRhJwJCoAPXcRZsF7B0dL8cq1RgeHgb/+fziX6E1pPCjDJ5e3iOUmcHWzRvHz398ThAoKSnB5b/9HYbUdMwJmUPl04GTJ9/DhQvn8cYbh/D++++D/1y/cYOvZbi6uWHvvj48u7kRgsDSdEGgjARKSOChPiCBpAQFpBx3ymYBWuXR9Zu2gH0wPj6O7KISyNRxiBJLMeMZz/GcXOP4a4cOCAJ5eXmY5eMDL29v6PUJ6O7aQX1xGOfOncLx429h5syZMDc2I05vQJQ0Fq6uriTZifWNy60yYCXAMqDVcmMiTtlrswAZPMgtLsXY2Jgg8PXVb5CYngWpSoMFi6MRsTAS7rSKnZZdeP3IIarv89ixow21tTXoaN9KE6kefdQLJ04cx5kzH0Cp5OA9axYCgoIx08sLCQlxsHS3o646F9XlGSQwuQeSJveAICBTKm49yuaRb+Drco0W6zdTM75zHJW1dVAlGvjXOULDF2ABCQQFz4FcEomdbc3o7qGpQ+za3oQtzWXY3LwUHc9twfPP9+Gd40ephN5GW9tmJCXpsHnLBrq+HS1N1VhRkYnlZemooilUzk+hgokpNPEuyExWUdlx99lb2GaBV+eGh48kJKciVq0VSofqX1j9wDkhCA4Ng0gihb+vF5pXF2K9uQgta4qxoWEJNq4l6LihoQRtW5vQRSu9d6AH//vSAI1cCzq7dmNdQxVWVmahhq3+RP3n/6t8cjO1yE5TQ59EDaxQsN8Ctk+hUH50JhqSESONFQKfF0GrToH7+AfAf3YQdIlJcHNzwdrafDTWFaCJRJqJdfVFAvzfTfR9c30xrfYytLbUotlchtXVOULwND6FICuXPLz61uWj1iruUePv4gvbZgGWhv2+fn5DesrCXCob34BAPniBoJBQJOj18KMM1NfkYM2KXGFL0VCbxwsJ0N/Cd2Y6x1+zmrYdq5YZJ1Z+OU2ejGTK6rwg4QX20Phkq59mUPLz/264SBRMAva2Sky8hWka/T4gMPBuVnY2OJUaIXPnYU7YXCQlJ0MsFkMaE05BZdPbNJtW1iRQTytMCH9T0MK5VVVC4ELN8ytPZSNsG6IjQ5C4wAkVWl+UZsYiP1sonYl9kIpWPzpW9gLFMp1wJhyYhM1bCUfqh5dp7A3J5PIHqWnpyDQaIZFKMMvbU3iD0hikwLKEAGt5KFhCWGUKlk2ZdGGrUEQlkqaXC+LBgV4ok7tik8Edr1fOwKbkGajXeaBcH4aclFik6hXC9sE7ICCK4vAhZhAutkj8UlMsopL6jZ2d/acOjo7fBAbPuW/Qax7QHkYoBZIQgqUjQ5guQm3nG3VCqeg0IsSKFmDRwlBERYZBHDUPxvhICvoZdGR54IudEfisg8Nva+aiQTcDpVq/B4qY8Ffo2QuIYCsJVk62C9gRTiyVPkFhYSqxnLuk0qqH83P0FGwmVi3PpbLJp2MeZSSbxGjlSa6yRJjxgsxSNmmWUCZo2gjjMj9LgwpDGMzxbji20h9Xu6JxpV+FI+aF4016z/u1atcPq/P1DTqdOoae7U24E46PI+DMVsCfCHN2do6OWBzdS9vqf3Bq1bAxM4FKJZMalqbQmkq00N6+eU0FGlaV0gurgErJiPLiNHpZJfN7fiqnJNawwrYZJoMYtfFeVErT8fG6WbjaGYHBPg6v1EWNdXa2Yeuz6w75+PgEshicHkfAhXiGCCDmEosJGaELCgnpiJJIByUK5YjBED++tDANtctoGq0uw4amGmxaX0vHFSRUhfqVJVhRlYeK0iwSSSaBeCoxJTQablwk40aTYvwvrta6DL9c7DF6eYsPeixtOPjqAbzw4v6hrp7OC+XV5QsfV8CJ2fsRIUQkISXURCpR6enl1b1g0eLP+d8KsQrlqEqjGtHr48ezMmhMFmWiqsyEylIjivNSKPBEJBu0UKoVD0Qy+djC6Oir7h4eA/R/mvw87FdXK13PbsyPHOnt7aAtyQmBQ4dfHe3p7by187ntOXTdPCKDcLZVwIFwI7yIQGLepCxomUQ50Ui0UTD/5+Pr925waOifFi6OuiaKlQ1JOOUYMU6CozGx8uHIqJjr/kFBJ11cXJ6ne7YSZmIpkUJoWxqXv2fp2n133/49d44de1OQOHr0CAIC/Meio6MhkUhA110jNhL21gLWEvaTGtmbmM0kFk3KRCKRRZQR9cQGoo3oIHppJPfTsY/oJtqJbUQLUUeUshVNIJSExMvLK9rT03P+upbGVd09nZfo9/XPJlM2/P390dnZKRAWFsZL8JT+OwG7SRLuxEzCn5VTOBHFRJREPKEn0ggTUcRWtoJRyr4zscwlEXHsXinLbDgbn37sWW7bdm2L9/Pzu+nu7o6NGzeitbWVshEAlokvCPsJARskXFlPeDORYJaRCCYjZuWlYNnREFqGhlCxczJ27WJ279xJgXsRHmyAOLJnnyTAQxkVjvPnz4evry94eWuBX5RgOEwSmU54ErOYzGxiDhHGpMKJCCvC2bkwFvBsFrQ3m3bTWeBO7Fl2jPUErKFy44/p1gK2ijgSzkzGnfBgQcxkAfkwfBk+DG9iJrvWg93ryoJ2nBy41bMPWQvQ7pk/LrMSeCQRe8JhkpATk3JhQblZ4crOOVsFLGwTrAOfDLv3AAErWq0FHldmktQEDlbYM+yseYTnLSOGCDD6H1/ARilrpuD/LyYuMoFDVgJPBqx3/p84YS3wpInonmQBxlOBpwJPBf4JszXhha5WvGwAAAAASUVORK5CYII= ------=_Part_0_1330682067197-- ===================================================== == File: mailbox/store/src/test/resources/eml/oneHtmlAttachmentAndSomeTextInlined.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: text/html; name="attachment.html" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="attachment.html" <html> <body> Hello! </body> </html> ===================================================== == File: mailbox/store/src/test/resources/eml/unknownDisposition.eml ===================================================== To: me@linagora.com From: Benoit Tellier <me@linagora.com> Subject: Mail with text attachment Message-ID: <befd8cab-9c9c-5537-4e77-937f32326087@any.com> Date: Thu, 13 Oct 2016 10:26:20 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------4FD2D252DB453546C22C25B2" This is a multi-part message in MIME format. --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I'm the body! --------------4FD2D252DB453546C22C25B2 Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-Disposition: gabouzomeuh; filename="attachment.txt" I'm a Schroedinger cat --------------4FD2D252DB453546C22C25B2-- ===================================================== == File: mailbox/store/src/test/resources/eml/mail2.eml ===================================================== Return-Path: <server-dev-return-56863-benwa=minet.net@james.apache.org> Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Thu, 04 Jun 2015 11:27:36 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx2.minet.net (Postfix) with ESMTP id D65F3A1CA35 for <benwa@minet.net>; Thu, 4 Jun 2015 11:27:40 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.51 X-Spam-Level: X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, T_RP_MATCHES_RCVD=-0.01] autolearn=ham Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id jH3GE2vu5VKE for <benwa@minet.net>; Thu, 4 Jun 2015 09:27:40 +0000 (UTC) Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=server-dev-return-56863-benwa=minet.net@james.apache.org; receiver=benwa@minet.net Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx2.minet.net (Postfix) with SMTP id 85A3AA1CA2C for <benwa@minet.net>; Thu, 4 Jun 2015 11:27:38 +0200 (CEST) Received: (qmail 43145 invoked by uid 500); 4 Jun 2015 09:27:38 -0000 Mailing-List: contact server-dev-help@james.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: <mailto:server-dev-unsubscribe@james.apache.org> List-Help: <mailto:server-dev-help@james.apache.org> List-Post: <mailto:server-dev@james.apache.org> List-Id: "James Developers List" <server-dev.james.apache.org> Reply-To: "James Developers List" <server-dev@james.apache.org> Delivered-To: mailing list server-dev@james.apache.org Received: (qmail 43130 invoked by uid 99); 4 Jun 2015 09:27:38 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Jun 2015 09:27:38 +0000 Date: Thu, 4 Jun 2015 09:27:37 +0000 (UTC) From: "efij" <jira1@apache.org> To: "aaa" <a-server-dev@james.apache.org> Cc: abc@abc.org Message-ID: <JIRA.12781874.1426269127000.9353.1433410057953@Atlassian.JIRA> In-Reply-To: <JIRA.12781874.1426269127000@Atlassian.JIRA> References: <JIRA.12781874.1426269127000@Atlassian.JIRA> <JIRA.12781874.1426269127444@arcas> Subject: [jira] [Closed] (MAILBOX-217) We should index attachment in elastic search MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/MAILBOX-217?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] ===================================================== == File: mailbox/store/src/test/resources/eml/mail1.eml ===================================================== Return-Path: <server-dev-return-56862-benwa=minet.net@james.apache.org> Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; Thu, 04 Jun 2015 11:23:39 +0200 X-Sieve: CMU Sieve 2.4 Received: from localhost (spam.minet.net [192.168.102.97]) by mx1.minet.net (Postfix) with ESMTP id 0113F385C15 for <benwa@minet.net>; Thu, 4 Jun 2015 11:23:43 +0200 (CEST) X-Virus-Scanned: by amavisd-new using ClamAV at minet.net X-Spam-Flag: NO X-Spam-Score: -1.51 X-Spam-Level: X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, T_RP_MATCHES_RCVD=-0.01] autolearn=ham Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) with ESMTP id IeILbadS9lo5 for <benwa@minet.net>; Thu, 4 Jun 2015 09:23:42 +0000 (UTC) Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=server-dev-return-56862-benwa=minet.net@james.apache.org; receiver=benwa@minet.net Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx2.minet.net (Postfix) with SMTP id CDE83A1C7FC for <benwa@minet.net>; Thu, 4 Jun 2015 11:23:40 +0200 (CEST) Received: (qmail 37249 invoked by uid 500); 4 Jun 2015 09:23:38 -0000 Mailing-List: contact server-dev-help@james.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: <mailto:server-dev-unsubscribe@james.apache.org> List-Help: <mailto:server-dev-help@james.apache.org> List-Post: <mailto:server-dev@james.apache.org> List-Id: "James Developers List" <server-dev.james.apache.org> Reply-To: "James Developers List" <server-dev@james.apache.org> Delivered-To: mailing list server-dev@james.apache.org Received: (qmail 37236 invoked by uid 99); 4 Jun 2015 09:23:38 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Jun 2015 09:23:38 +0000 Date: Thu, 4 Jun 2015 09:23:37 +0000 (UTC) From: "Tellier Benoit (JIRA)" <jira2@apache.org> To: "abc" <b-server-dev@james.apache.org> Message-ID: <JIRA.12835341.1433409792000.9340.1433409817961@Atlassian.JIRA> In-Reply-To: <JIRA.12835341.1433409792000@Atlassian.JIRA> References: <JIRA.12835341.1433409792000@Atlassian.JIRA> <JIRA.12835341.1433409792972@arcas> Subject: [jira] [Created] (MAILBOX-234) Convert Message into JSON MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 Tellier Benoit created MAILBOX-234: -------------------------------------- Summary: Convert Message into JSON ===================================================== == File: mailbox/store/src/test/resources/eml/noAttachment.eml ===================================================== Content-Type: text/plain; Charset=UTF-8 Date: Fri, 17 Sep 2010 17:12:26 +0200 Subject: my subject To: a@test, B <b@test> Cc: c@test Bcc: d@test MIME-Version: 1.0 Message-Id: <20100917151246.2A9384BA1@lenny> From: Ad Min <admin@opush.test> Mail content -- Ad Min ===================================================== == File: mailbox/store/src/test/resources/eml/charset.eml ===================================================== From: Test 1 <test1@linagora.com> To: Test 2 <test2@linagora.com> Subject: New Time Proposed: New event from Test: lole Date: Tue, 13 Mar 2018 14:36:08 +0000 Message-ID: <AM5P190MB03542A58E344C68475A951AFD20@AM5P190MB0354.EURP190.PROD.OUTLOOK.COM> Accept-Language: en-US Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_" MIME-Version: 1.0 --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Will be better for me, thx --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <html> <p>Will be better for me, thx</p> </html> --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/calendar; charset="iso-8859-1"; method=COUNTER Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment1.txt" QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6Q09VTlRFUg0KUFJPRElEOk1pY3Jvc29mdCBFeGNoYW5n ZSBTZXJ2ZXIgMjAxMA0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpFdXJvcGUv QmVybGluDQpCRUdJTjpTVEFOREFSRA0KRFRTVEFSVDoxNjAxMDEwMVQwMzAwMDANClRaT0ZGU0VU RlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7SU5URVJWQUw9 MTtCWURBWT0tMVNVO0JZTU9OVEg9MTANCkVORDpTVEFOREFSRA0KQkVHSU46REFZTElHSFQNCkRU U0VRVUVOQ0U6MA0KRFRTVEFNUDoyMDE4MDMxM1QxNDM2MDdaDQpDT01NRU5UO0xBTkdVQUdFPWVu LVVTOldpbGwgYmUgYmV0dGVyIGZvciBtZVwsIHRoeFxuDQpFTkQ6VkVWRU5UDQpFTkQ6VkNBTEVO REFSDQo= --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_-- ===================================================== == File: mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithBlankCid.eml ===================================================== Return-Path: <test@local.com> Received: from localhost; Tue, 05 Jul 2016 11:47:47 +0200 X-Sieve: CMU Sieve 2.2 To: Test <test@local.com> From: Test <test@local.com> Subject: Inline attachment Message-ID: <26d91590-b995-8d45-f66a-0433c65745bb@linagora.com> Date: Tue, 5 Jul 2016 11:47:46 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------FC06E08B3CDF05E9A3E28077" This is a multi-part message in MIME format. --------------FC06E08B3CDF05E9A3E28077 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit This is an inline attachment: Cheers! --------------FC06E08B3CDF05E9A3E28077 Content-Type: multipart/related; boundary="------------47107B0D40019CDFED2C4263" --------------47107B0D40019CDFED2C4263 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> This is an inline attachment:<br> <br> <img alt="" src="cid:part1.37A15C92.A7C3488D@linagora.com" height="73" width="73"><br> <br> <br> Cheers!<br> </body> </html> --------------47107B0D40019CDFED2C4263 Content-Type: image/png; name="james-logo-square.png" ===================================================== == File: mailbox/store/src/test/resources/eml/embeddedAttachmentWithInline.eml ===================================================== Return-Path: <iphone@obm.lng.org> Received: from lenny.obm.lng.org (localhost [127.0.0.1]) by lenny.obm.lng.org (Cyrus v2.3.14-Debian-2.3.14-2) with LMTPA; Wed, 21 Mar 2012 14:51:59 +0100 X-Sieve: CMU Sieve 2.3 Received: from [192.168.2.48] (unknown [192.168.2.48]) by lenny.obm.lng.org (Postfix) with ESMTP id E495D32929 for <usera@obm.lng.org>; Wed, 21 Mar 2012 14:51:58 +0100 (CET) Message-ID: <4F69DD0E.3010502@obm.lng.org> Date: Wed, 21 Mar 2012 14:52:14 +0100 From: iphone <iphone@obm.lng.org> User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.28) Gecko/20120306 Lightning/1.0b2 Thunderbird/3.1.20 MIME-Version: 1.0 To: usera <usera@obm.lng.org> Subject: Fwd: Re: email with sign Content-Type: multipart/mixed; boundary="------------080809000000030101030405" This is a multi-part message in MIME format. --------------080809000000030101030405 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit new email text part --------------080809000000030101030405 Content-Type: message/rfc822; name="Re: email with sign.eml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="Re: email with sign.eml" Return-Path: <usera@obm.lng.org> Received: from lenny.obm.lng.org (localhost [127.0.0.1]) by lenny.obm.lng.org (Cyrus v2.3.14-Debian-2.3.14-2) with LMTPA; Wed, 21 Mar 2012 14:19:29 +0100 X-Sieve: CMU Sieve 2.3 Received: from [192.168.2.48] (unknown [192.168.2.48]) by lenny.obm.lng.org (Postfix) with ESMTP id 47EC832D51 for <iphone@obm.lng.org>; Wed, 21 Mar 2012 14:19:29 +0100 (CET) Message-ID: <4F69D570.9090502@obm.lng.org> Date: Wed, 21 Mar 2012 14:19:44 +0100 From: usera <usera@obm.lng.org> User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.28) Gecko/20120306 Thunderbird/3.1.20 MIME-Version: 1.0 To: iphone <iphone@obm.lng.org> Subject: Re: email with sign References: <4F69D0C6.501@obm.lng.org> In-Reply-To: <4F69D0C6.501@obm.lng.org> Content-Type: multipart/alternative; ===================================================== == File: mailbox/store/src/test/resources/eml/oneAttachmentWithoutContentType.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gimp.png" 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 ------=_Part_0_1330682067197-- ===================================================== == File: mailbox/store/src/test/resources/eml/emailWithTextAttachment.eml ===================================================== To: James User <user@james.org> From: James Sender <sender@james.org> Subject: Message with text attachment Message-ID: <ffaa7bce-fbe3-83b5-de3f-9a7301233615@linagora.com> Date: Tue, 5 Sep 2017 09:54:16 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------D24E361990BDBA143D4D8794" Content-Language: en-US This is a multi-part message in MIME format. --------------D24E361990BDBA143D4D8794 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit The message has a text attachment. --------------D24E361990BDBA143D4D8794 Content-Type: text/plain; charset=UTF-8; name="attachment.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.txt" VGhpcyBpcyBhIGJlYXV0aWZ1bCBiYW5hbmEuCg== --------------D24E361990BDBA143D4D8794-- ===================================================== == File: mailbox/store/src/test/resources/eml/oneAttachmentWithoutName.eml ===================================================== Mail content: To: "=?utf-8?B?UmFuaSBBc3NhZg==?=" <rani.assaf@jri.obm.lng.org> Subject: =?utf-8?B?VHIuIDogUGhvdG9zICE=?= Importance: Normal MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_0_1330682067197" ------=_Part_0_1330682067197 Content-Type: multipart/alternative; boundary="----=_Part_2_1330682067197" ------=_Part_2_1330682067197 Content-Type: text/plain; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline Content of part 1-1 ------=_Part_2_1330682067197 Content-Type: text/html; charset= utf-8 Content-Transfer-Encoding: 8bit Content-Disposition: inline <b>Content of part 1-2</b> ------=_Part_2_1330682067197-- ------=_Part_0_1330682067197 Content-Type: application/octet-stream; Content-Transfer-Encoding: base64 Content-Disposition: attachment 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 ------=_Part_0_1330682067197-- ===================================================== == File: mailbox/store/src/test/resources/eml/calendar.eml ===================================================== From: Test 1 <test1@linagora.com> To: Test 2 <test2@linagora.com> Subject: New Time Proposed: New event from Test: lole Date: Tue, 13 Mar 2018 14:36:08 +0000 Message-ID: <AM5P190MB03542A58E344C68475A951AFD20@AM5P190MB0354.EURP190.PROD.OUTLOOK.COM> Accept-Language: en-US Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_" MIME-Version: 1.0 --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Will be better for me, thx --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <html> <p>Will be better for me, thx</p> </html> --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/calendar; charset="utf-8"; method=COUNTER Content-Transfer-Encoding: base64 QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6Q09VTlRFUg0KUFJPRElEOk1pY3Jvc29mdCBFeGNoYW5n ZSBTZXJ2ZXIgMjAxMA0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpFdXJvcGUv QmVybGluDQpCRUdJTjpTVEFOREFSRA0KRFRTVEFSVDoxNjAxMDEwMVQwMzAwMDANClRaT0ZGU0VU RlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7SU5URVJWQUw9 MTtCWURBWT0tMVNVO0JZTU9OVEg9MTANCkVORDpTVEFOREFSRA0KQkVHSU46REFZTElHSFQNCkRU U0VRVUVOQ0U6MA0KRFRTVEFNUDoyMDE4MDMxM1QxNDM2MDdaDQpDT01NRU5UO0xBTkdVQUdFPWVu LVVTOldpbGwgYmUgYmV0dGVyIGZvciBtZVwsIHRoeFxuDQpFTkQ6VkVWRU5UDQpFTkQ6VkNBTEVO REFSDQo= --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_-- ===================================================== == File: mailbox/store/src/test/resources/eml/oneInlinedAttachmentWithEmptyCid.eml ===================================================== Return-Path: <test@local.com> Received: from localhost; Tue, 05 Jul 2016 11:47:47 +0200 X-Sieve: CMU Sieve 2.2 To: Test <test@local.com> From: Test <test@local.com> Subject: Inline attachment Message-ID: <26d91590-b995-8d45-f66a-0433c65745bb@linagora.com> Date: Tue, 5 Jul 2016 11:47:46 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------FC06E08B3CDF05E9A3E28077" This is a multi-part message in MIME format. --------------FC06E08B3CDF05E9A3E28077 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit This is an inline attachment: Cheers! --------------FC06E08B3CDF05E9A3E28077 Content-Type: multipart/related; boundary="------------47107B0D40019CDFED2C4263" --------------47107B0D40019CDFED2C4263 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> This is an inline attachment:<br> <br> <img alt="" src="cid:part1.37A15C92.A7C3488D@linagora.com" height="73" width="73"><br> <br> <br> Cheers!<br> </body> </html> --------------47107B0D40019CDFED2C4263 Content-Type: image/png; name="james-logo-square.png" ===================================================== == File: mailbox/store/src/test/resources/eml/charset2.eml ===================================================== From: Test 1 <test1@linagora.com> To: Test 2 <test2@linagora.com> Subject: New Time Proposed: New event from Test: lole Date: Tue, 13 Mar 2018 14:36:08 +0000 Message-ID: <AM5P190MB03542A58E344C68475A951AFD20@AM5P190MB0354.EURP190.PROD.OUTLOOK.COM> Accept-Language: en-US Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_" MIME-Version: 1.0 --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Will be better for me, thx --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <html> <p>Will be better for me, thx</p> </html> --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/calendar; charset="iso-8859-1"; method=COUNTER Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment1.txt" QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6Q09VTlRFUg0KUFJPRElEOk1pY3Jvc29mdCBFeGNoYW5n ZSBTZXJ2ZXIgMjAxMA0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpFdXJvcGUv QmVybGluDQpCRUdJTjpTVEFOREFSRA0KRFRTVEFSVDoxNjAxMDEwMVQwMzAwMDANClRaT0ZGU0VU RlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7SU5URVJWQUw9 MTtCWURBWT0tMVNVO0JZTU9OVEg9MTANCkVORDpTVEFOREFSRA0KQkVHSU46REFZTElHSFQNCkRU U0VRVUVOQ0U6MA0KRFRTVEFNUDoyMDE4MDMxM1QxNDM2MDdaDQpDT01NRU5UO0xBTkdVQUdFPWVu LVVTOldpbGwgYmUgYmV0dGVyIGZvciBtZVwsIHRoeFxuDQpFTkQ6VkVWRU5UDQpFTkQ6VkNBTEVO REFSDQo= --_000_AM5P190MB03542A58E344F2C68475A951AFD20AM5P190MB0354EURP_ Content-Type: text/calendar; charset="iso-4444-5"; method=COUNTER Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment2.txt" QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6Q09VTlRFUg0KUFJPRElEOk1pY3Jvc29mdCBFeGNoYW5n ZSBTZXJ2ZXIgMjAxMA0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpFdXJvcGUv QmVybGluDQpCRUdJTjpTVEFOREFSRA0KRFRTVEFSVDoxNjAxMDEwMVQwMzAwMDANClRaT0ZGU0VU RlJPTTorMDIwMA0KVFpPRkZTRVRUTzorMDEwMA0KUlJVTEU6RlJFUT1ZRUFSTFk7SU5URVJWQUw9 ===================================================== == File: mailbox/store/src/test/resources/eml/nonTextual.eml ===================================================== Return-Path: <btellier@linagora.com> Received: from alderaan.linagora.com (smtp.linagora.dc1 [172.16.18.53]) by imap (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 18 Jun 2015 12:43:28 +0200 X-Sieve: CMU Sieve 2.2 Received: from [10.75.9.154] (unknown [92.103.166.6]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alderaan.linagora.com (Postfix) with ESMTPSA id 0EB1078A for <btellier@linagora.com>; Thu, 18 Jun 2015 12:43:28 +0200 (CEST) To: btellier@linagora.com From: Benoit Tellier <btellier@linagora.com> Subject: Test message Message-ID: <5582A0CE.4020801@linagora.com> Date: Thu, 18 Jun 2015 12:43:26 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.0.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030000010109090603040500" This is a multi-part message in MIME format. --------------030000010109090603040500 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit This mail have a non textual attachment ! --------------030000010109090603040500 Content-Type: application/vnd.oasis.opendocument.text; name="toto.odt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="toto.odt" UEsDBBQAAAgAAGNV0kZexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQu b2FzaXMub3BlbmRvY3VtZW50LnRleHRQSwMEFAAACAAAY1XSRnPWCvM4AwAAOAMAABgAAABU aHVtYm5haWxzL3RodW1ibmFpbC5wbmeJUE5HDQoaCgAAAA1JSERSAAAAxgAAAQAIAwAAAN+D +XIAAAEyUExURXJoXXN0dXZ4e3h3eHl7fnx8gXqCh32IgXuJnoB7fI+Fa4+IbIODe4iEe5+Q eISDhICFiISJhIaMiY2Gg4uJgomMjIGJkIuOkY6Uj4SRm4+WkomZnJGKgJGUjJuTh5uWj5GV kZGVnJaYkpWbmpmVlZmblJ2en4OYqZSYoJSfqpyeoI6gs5SipJygopKhsZapvKeajKGemKqd k6KjnaqilKmrn7SllL2tnaampaarraquo6msrqmusKq2urSwqLu5tLy5uaO2yKu5w77EtrXI 1sC5p8+8rcHGt83BtdfGttnKus3NysLO3svP0tbRzdrQy9rYztrb2tvg5Nru9+bf3Ozg0PLj yfLl0PXo0/vt0uTn7ujn5+jp7Ovw6OL2/en4/fLr5/336vP7/v7+/gAAAP///4uCFGkAAAHB SURBVHja7dPbThMBEAbgYgsaQmkEVhfbxR5YDKUIslBUWuTogZI0HGxq0gBt3/8dIE00ek+C gW8uZv6Zu+9iUsNHUSkMDAwMDAwMDAwMDAyMJ8o4Of137+z/vfV+h7Nh+a6X+8t/rqN2MxjF y9H4fv1wjN1c5eOXdOpdshTNFQuvTrbGk2pzIq6/DJbGnk+udOY/ZYNqsBcnM4WpSqVbquxk e7nCRPZ4pZ8Oxhe+vZh+3RzbqC1uzlxvXz0Y4+fpbC7qlVqZ8moUhfH5j8/PkupBMahHYb4V Ti7/mm+EH1a/HkXFIG7n33RrpUY4DOOzjeR9v9SefXtYy2YOovX84mZ00R78t7/RWfPiGBgY GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY ===================================================== == File: mailbox/store/src/test/resources/documents/writter.docx ===================================================== ===================================================== == File: mailbox/store/src/test/resources/documents/Text.txt ===================================================== This is some awesome text text. ===================================================== == File: mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/FetchGroupConverterTest.java ===================================================== /**************************************************************** * 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: ww.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.mailbox.store.mail; import static org.assertj.core.api.Assertions.assertThat; import java.util.EnumSet; import java.util.stream.Stream; import org.apache.james.mailbox.model.FetchGroup; import org.apache.james.mailbox.model.FetchGroup.Profile; import org.apache.james.mailbox.model.MimePath; import org.apache.james.mailbox.store.mail.MessageMapper.FetchType; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; class FetchGroupConverterTest { private static final int[] PARTS = new int[]{12}; static Stream<Arguments> getFetchTypeShouldReturnCorrectValue() { return Stream.of( Arguments.arguments(FetchGroup.MINIMAL, FetchType.METADATA), Arguments.arguments(FetchGroup.HEADERS, FetchType.HEADERS), Arguments.arguments(FetchGroup.HEADERS_WITH_ATTACHMENTS_METADATA, FetchType.ATTACHMENTS_METADATA), Arguments.arguments(FetchGroup.BODY_CONTENT, FetchType.FULL), Arguments.arguments(FetchGroup.FULL_CONTENT, FetchType.FULL), Arguments.arguments(FetchGroup.BODY_CONTENT.with(Profile.HEADERS), FetchType.FULL), Arguments.arguments(FetchGroup.MINIMAL.with(Profile.MIME_CONTENT), FetchType.FULL), Arguments.arguments(FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR), FetchType.FULL), Arguments.arguments(FetchGroup.MINIMAL.with(Profile.MIME_HEADERS), FetchType.FULL), Arguments.arguments(FetchGroup.MINIMAL.addPartContent(new MimePath(PARTS), EnumSet.noneOf(Profile.class)), FetchType.FULL), Arguments.arguments(FetchGroup.MINIMAL.addPartContent(new MimePath(PARTS), Profile.HEADERS), FetchType.FULL), ===================================================== == File: mailbox/cassandra/doc/README.md ===================================================== # Cassandra implementation for the mailbox This file attempts to provide information useful to mailbox/cassandra developers. ## Table structure  Can be edited using [this source file](table_structure.drawio) on [this website](https://app.diagrams.net/). This file should be edited everytime the table structure is modified. ## Approach regarding denormalization The Cassandra mailbox is heavily relying on denormalization. The same data is stored several times, in distinct tables, to satisfy the various read access patterns. Of course, the various tables can become inconsistent between them. We have been developing several approaches in order to diagnose, mitigate and solve such issues. They are described in the following documents: - [Applicative read repaires](../../../src/adr/0042-applicative-read-repairs.md) - [Inconsistencies among messages](../../../src/adr/0022-cassandra-message-inconsistency.md) - [Inconsistencies among mailboxes](../../../src/adr/0020-cassandra-mailbox-object-consistency.md) - [Recompute user quotas](../../../src/adr/0028-Recompute-mailbox-quotas.md) - [Mailbox counter inconsistencies](../../../src/adr/0023-cassandra-mailbox-counters-inconsistencies.md) ===================================================== == File: mailbox/cassandra/doc/table_structure.drawio ===================================================== <mxfile host="app.diagrams.net" modified="2021-08-24T02:04:00.037Z" agent="5.0 (X11)" etag="lTsFg4HG33iSt8uwSXVP" version="14.9.8" type="device"><diagram id="T0L1nU3M2jZuK1mChcqM" name="Page-1">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</diagram></mxfile> ===================================================== == File: mailbox/cassandra/src/test/resources/cassandra-driver.conf ===================================================== datastax-java-driver { basic.request { timeout = 5 seconds } } ===================================================== == File: docs/Dockerfile ===================================================== ARG ANTORA_VERSION=3.1.7 FROM antora/antora:${ANTORA_VERSION} AS antora_builder ARG JAMES_CHECKOUT=master RUN apk update && apk add git RUN git clone https://github.com/apache/james-project.git /james-project \ && cd /james-project \ && git checkout $JAMES_CHECKOUT WORKDIR /james-project/docs RUN antora antora-playbook-local.yml FROM nginx:alpine COPY --from=antora_builder /james-project/docs/build/site /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ===================================================== == File: docs/ui-overrides/partials/header-content.hbs ===================================================== <header class="header"> <nav class="navbar"> <div class="navbar-brand"> <a class="navbar-item" href="{{{or site.url (or siteRootUrl siteRootPath)}}}"><img src="/_/img/james.svg" alt="james logo"> {{site.title}}</a> <button class="navbar-burger" data-target="topbar-nav"> <span></span> <span></span> <span></span> </button> </div> <div id="topbar-nav" class="navbar-menu"> <div class="navbar-end"> <a class="navbar-item" href="#">Home</a> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link" href="#">Products</a> <div class="navbar-dropdown"> <div class="navbar-item"><strong>James server</strong></div> <a class="navbar-item" href="https://github.com/apache/james-project">Repository</a> <a class="navbar-item" href="https://issues.apache.org/jira/projects/JAMES/issues">Issue Tracker</a> <hr class="navbar-divider"> <a class="navbar-item" href="https://james.apache.org/mime4j/index.html">Mime4J</a> <a class="navbar-item" href="https://james.apache.org/jsieve/index.html">jSieve</a> <a class="navbar-item" href="https://james.apache.org/jspf/index.html">jSPF</a> <a class="navbar-item" href="https://james.apache.org/jdkim/index.html">jDKIM</a> <a class="navbar-item" href="https://james.apache.org/hupa/index.html">HUPA</a> </div> </div> <div class="navbar-item has-dropdown is-hoverable"> <a class="navbar-link" href="#">Community</a> <div class="navbar-dropdown"> <!-- Not ideal but dropping the version in the href requires tweaking james-projet docs module first --> <a class="navbar-item" href="/james-project/3.7.3/community/mailing-lists.html">Mailing lists</a> <a class="navbar-item" href="https://gitter.im/apache/james-project"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" class="logo-gitter-sign" data-v-44ebcb1a=""><rect x="15" y="5" width="2" height="10"></rect> <rect x="10" y="5" width="2" height="20"></rect> <rect x="5" y="5" width="2" height="20"></rect> <rect width="2" height="15"></rect></svg> Gitter</a> <a class="navbar-item" href="https://twitter.com/ApacheJames"> <span class="icon"> <svg aria-hidden="true" data-icon="twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path fill="#57aaee" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path> </svg> </span> Twitter </a> <a class="navbar-item" href="#"> <svg class="octicon octicon-mark-github v-align-middle" viewBox="0 0 16 16" version="1.1" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path></svg> Github</a> </div> </div> <!-- <div class="navbar-item"> <span class="control"> <a class="button is-primary" href="#">Download</a> </span> </div> --> </div> </div> ===================================================== == File: docs/ui-overrides/img/james.svg ===================================================== <?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="37px" height="31px" viewBox="0 0 37 31" enable-background="new 0 0 37 31" xml:space="preserve"> <g> <path fill="#FFFFFF" d="M37.001,4.407c-1.435-0.966-2.92-1.75-4.473-2.153c-1.552-0.412-3.151-0.315-4.63,0.3l-0.277,0.117 l-0.139,0.062l-0.064,0.032l-0.036,0.016l-0.018,0.008l-0.008,0.004c0.008-0.007-0.028,0.016,0.02-0.012L27.37,2.783 c-0.2,0.127-0.391,0.232-0.589,0.337c-0.392,0.207-0.796,0.391-1.216,0.543c-0.836,0.295-1.737,0.503-2.664,0.389 c-0.458-0.061-0.913-0.222-1.3-0.489c-0.382-0.268-0.689-0.629-0.899-1.026C20.28,1.737,20.15,0.857,20.124,0 c0.156,0.842,0.393,1.686,0.857,2.363c0.234,0.336,0.523,0.622,0.864,0.811c0.339,0.19,0.723,0.284,1.111,0.301 c0.782,0.038,1.582-0.201,2.325-0.532c0.376-0.165,0.741-0.353,1.092-0.563c0.176-0.105,0.354-0.219,0.509-0.33l0.307-0.201 c0.1-0.057,0.194-0.122,0.293-0.173c0.801-0.433,1.702-0.731,2.627-0.793c0.925-0.069,1.856,0.063,2.716,0.357 c0.863,0.29,1.655,0.731,2.359,1.267C35.888,3.047,36.52,3.676,37.001,4.407z"/> <path fill="#FFFFFF" d="M13.25,20.418c-5.733-4.373-9.554-8.973-9.418-9.078c0.147-0.145,4.153,4.212,9.83,8.536 c1.665,1.28,3.28,2.412,4.733,3.381c0.02-0.036,0.041-0.069,0.062-0.105c0.237-0.456,0.42-0.948,0.562-1.462 c-1.018-2.053-3.554-4.892-6.501-7.496c-0.656-0.572-1.338-1.078-2.028-1.536c-0.151,1.223-0.452,2.098-0.453,2.096 c0,0-0.335-1.163-0.306-2.579C9.266,11.892,8.8,11.63,8.336,11.389c-0.004,1.395-0.414,2.439-0.417,2.439 c0,0.002-0.833-1.414-0.922-3.071c-0.002-0.01-0.002-0.021-0.002-0.031c-2.767-1.279-5.1-1.896-5.104-1.89 C1.867,8.774,2.064,14.75,6.431,19.305c0.147-0.008,0.296-0.016,0.449-0.016c1.588,0.004,2.944,0.577,2.947,0.577 c0-0.002-0.835,0.501-2.054,0.671c0.444,0.355,0.899,0.682,1.364,0.973c1.148-0.416,2.102-0.557,2.102-0.557 c0-0.002-0.503,0.495-1.334,1.017c3.035,1.685,5.787,2.542,7.53,2.624c0.236-0.26,0.452-0.532,0.645-0.821 C16.586,22.84,14.938,21.717,13.25,20.418z"/> <path fill="#FFFFFF" d="M33.7,4.335c-1.103,0.092-2.21,0.292-3.3,0.605c-2.173,0.623-4.31,1.725-6.062,3.396 c-0.883,0.824-1.64,1.798-2.271,2.846c-0.614,1.059-1.109,2.191-1.43,3.363c-0.327,1.168-0.529,2.363-0.595,3.548 c-0.02,0.291-0.031,0.596-0.039,0.9L19.995,19.4l-0.008,0.35c-0.012,0.462-0.051,0.918-0.122,1.358 c-0.056,0.337-0.131,0.665-0.223,0.984c-0.141,0.514-0.324,1.006-0.562,1.466c-0.02,0.036-0.043,0.066-0.062,0.102 c-0.099,0.178-0.204,0.353-0.317,0.52c-0.191,0.286-0.407,0.559-0.643,0.819c-0.17,0.186-0.348,0.366-0.544,0.541 c-1.304,1.152-3.097,1.944-5.021,2.453c-1.931,0.518-3.995,0.788-6.091,0.934c-2.1,0.145-4.234,0.166-6.404,0.112 c2.023,0.815,4.157,1.338,6.333,1.664c2.179,0.313,4.422,0.415,6.701,0.127c1.137-0.149,2.287-0.394,3.418-0.802 c1.129-0.405,2.252-0.959,3.265-1.745c1.019-0.771,1.92-1.77,2.571-2.913c0.331-0.568,0.601-1.167,0.82-1.775 c0.21-0.611,0.364-1.236,0.47-1.859c0.11-0.619,0.17-1.24,0.193-1.852c0.008-0.154,0.008-0.307,0.008-0.461v-0.398 c0.005-0.234,0.011-0.468,0.022-0.716c0.052-0.967,0.166-1.914,0.376-2.832c0.418-1.832,1.213-3.537,2.405-5.009 c1.192-1.472,2.767-2.711,4.552-3.706c1.79-0.994,3.765-1.774,5.862-2.355C35.917,4.247,34.808,4.238,33.7,4.335z"/> </g> </svg> ===================================================== == File: docs/modules/customization/nav.adoc ===================================================== * xref:index.adoc[] ** xref:mail-processing.adoc[] ** xref:mailbox-listeners.adoc[] ** xref:smtp-hooks.adoc[] ** xref:webadmin-routes.adoc[] ** xref:imap.adoc[] ===================================================== == File: docs/modules/customization/pages/mail-processing.adoc ===================================================== = Custom mail processing components :navtitle: Custom mail processing components When none of the matchers and mailets available in James allows us to implement what we want, extension developers will have to write our own mailet and matcher in a separated maven project depending on James Mailet API. == Writing custom mailets/matchers We will write a *IsDelayedForMoreThan* matcher with a configurable delay. If the Sent Date of incoming emails is older than specified delay, then the emails should be matched (return all mail recipients). Otherwise, we just return an empty list of recipients. To ease our Job, we can rely on the *org.apache.james.apache-mailet-base* maven project, which provides us a *GenericMatcher* that we can extend. Here is the dependency: .... <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-mailet-base</artifactId> </dependency> .... The main method of a matcher is the *match* method: .... Collection<MailAddress> match(Mail mail) throws MessagingException; .... For us, it becomes, with *maxDelay* being previously configured: .... private final Clock clock; private Duration maxDelay; @Override public Collection<MailAddress> match(Mail mail) throws MessagingException { Date sentDate = mail.getMessage().getSentDate(); if (clock.instant().isAfter(sentDate.toInstant().plusMillis(maxDelay.toMillis()))) { return ImmutableList.copyOf(mail.getRecipients()); } return ImmutableList.of(); } .... *GenericMatcher* exposes us the condition that had been configured. We will use it to compute *maxDelay*. We can do it in the *init()* method exposed by the generic matcher: ===================================================== == File: docs/modules/customization/pages/smtp-hooks.adoc ===================================================== = Custom SMTP hooks :navtitle: Custom SMTP hooks SMTP hooks enable extending capabilities of the SMTP server and are run synchronously upon email reception, before the email is enqueued in the MailQueue, and before any mail processing takes place. == Available generic hooks The following interfaces allows interacting with the following commands: * *AuthHook*: Implement this interfaces to hook in the AUTH Command. .... HookResult doAuth(SMTPSession session, Username username, String password); .... * *HeloHook*: Implement this interfaces to hook in the HELO Command .... HookResult doHelo(SMTPSession session, String helo); .... * *MailHook*: Implement this interfaces to hook in the MAIL Command .... HookResult doMail(SMTPSession session, MaybeSender sender); .... * *MailParametersHook*: Implement this interfaces to hook in the MAIL Command, this is called for specific mail arguments .... HookResult doMailParameter(SMTPSession session, String paramName, String paramValue); .... * *QuitHook*: Implement this interfaces to hook in the QUIT Command .... HookResult doQuit(SMTPSession session); .... * *RcptHook*: Implement this interfaces to hook in the RCPT Command .... HookResult doRcpt(SMTPSession session, MaybeSender sender, MailAddress rcpt); .... * *UnknownHook*: Hook for unknown commands .... ===================================================== == File: docs/modules/customization/pages/imap.adoc ===================================================== = Custom IMAP processing :navtitle: Custom IMAP processing James allows defining your own handler packages. An Imap package is a simple class that bundles IMAP processing components: .... public interface ImapPackage { Collection<ClassName> processors(); Collection<ClassName> decoders(); Collection<ClassName> encoders(); } .... Processors needs to be of class `AbstractProcessor`, decoders of class `AbstractImapCommandParser` and encoders of class `ImapResponseEncoder`. Extensions-jar mechanism can be used to load custom classes. Custom configuration can be obtained through `ImapConfiguration` class via the `getCustomProperties` method. A full working example is available link:https://github.com/apache/james-project/tree/master/examples/custom-imap[here]. See this page for xref:imap.adoc#_extending_imap[more details on configuring IMAP extensions]. == IMAP additional Connection Checks James allows defining your own additional connection checks to guarantee that the connecting IP is secured. A custom connection check should implement the following functional interface: ``` @FunctionalInterface public interface ConnectionCheck { Publisher<Void> validate(InetSocketAddress remoteAddress); } ``` - `validate` method is used to check the connecting IP is secured. Then the custom defined ConnectionCheck can be added in `imapserver.xml` file: ``` <additionalConnectionChecks>org.apache.james.CrowdsecImapConnectionCheck</additionalConnectionChecks> ``` An example for configuration is available link:https://github.com/apache/james-project/blob/master/third-party/crowdsec/sample-configuration/imapserver.xml[here]. ===================================================== == File: docs/modules/customization/pages/webadmin-routes.adoc ===================================================== = Custom WebAdmin routes :navtitle: Custom WebAdmin routes == Writing custom WebAdmin routes An extension writer can write additional WebAdmin routes, effectively exposed over the WebAdmin API. To do so, extend the *Routes* defined in the *james-server-webadmin-core*. Here is the dependency: .... <dependency> <groupId>org.apache.james</groupId> <artifactId>james-server-webadmin-core</artifactId> </dependency> .... Here is the interface: .... public interface Routes { String getBasePath(); void define(Service service); } .... * *getBasePath* enables to know the prefix of your route * *define* enables you to register endpoint is the http://sparkjava.com/[sparkjava] Service instance. HTTP *GET*, *POST*, *PUT*, *PATCH*, etc.. verbs are supported. == Registration Your custom WebAdmin routes needs to be in the *extensions-jars* folder. You need to register its fully qualified class name in xref:webadmin.adoc[webadmin.properties] using the *extensions.routes* property. ===================================================== == File: docs/modules/customization/pages/mailbox-listeners.adoc ===================================================== = Custom Mailbox Listeners :navtitle: Custom Mailbox Listeners == Writing additional listener An extension writer can write new additional mailbox listeners. To do so, extend the *GroupMailboxListener* defined in the *mailbox-api*. Here is the dependency: .... <dependency> <groupId>org.apache.james</groupId> <artifactId>apache-james-mailbox-api</artifactId> </dependency> .... Here are the methods you can implement: .... void event(Event event) throws Exception; .... allows you to specify the business logic you want to execute upon new events generation. .... boolean isHandling(Event event); .... Allows to know if this event is worth execution, and should be sent on the EventBus. This avoids execution of non handled events and can save some IOs. == Registration of custom additional listeners Your custom additional listener needs to be in the *extensions-jars* folder. You need to register its fully qualified class name in xref:listeners.adoc[listeners.xml] == Events Your listener will be called for the following events: - *MailboxAdded*: A new mailbox had been created - *MailboxDeletion*: A new mailbox had been deleted - *MailboxRenamed*: A mailbox was renamed - *MailboxACLUpdated*: The rights of a mailbox had been changed - *Expunged*: Some messages had been deleted - *FlagsUpdated*: Some message flags had been updated - *Added*: New messages had been added to a mailbox ===================================================== == File: docs/modules/customization/pages/index.adoc ===================================================== = Extending server behavior :navtitle: Extending server behavior == Available extension mechanisms image::james-hexagons-extensions.png[Extension mechanisms for the James Server] The James Server exposes several interfaces allowing the user to write custom extensions in order to extend the James Server behavior. Writing *Mailets* and *Matchers* allows one to supply custom components for the xref:mail-processing.adoc[Mail Processing] and enables to take decisions, and implement your business logic at the transport level. Writing xref:mailbox-listeners.adoc[Mailbox listeners] enables to react to your user interaction with their mailbox. This powerful tool allows build advanced features for mail delivery servers. Writing xref:smtp-hooks.adoc[SMTP hookd] enables to add features to your SMTP server. Writing xref:webadmin-routes.adoc[WebAdmin routes] enables to add features to the WebAdmin REST API. Writing xref:imap.adoc[IMAP extensions]. The link:https://github.com/apache/james-project/tree/master/examples[examples] are also a good reference. == Handling injections for your extensions === Injecting core components You can very easily inject core components into your custom extensions. All you need is to pass them via a constructor annotated via *@Inject*. For instance: .... public class MyMailet extends GenericMailet { private final UsersRepository usersRepository; @Inject public MyMailet(UsersRepository usersRepository) { this.usersRepository = usersRepository; } @Override public void service(Mail mail) throws MessagingException { // Do something ===================================================== == File: docs/modules/servers/nav.adoc ===================================================== * xref:index.adoc[] ** xref:demo.adoc[] *** xref:servers:5-minute-demo.adoc[] *** xref:servers:15-minute-demo.adoc[] ** xref:basic/index.adoc[] *** xref:basic/context.adoc[] *** xref:basic/objectives.adoc[] *** xref:basic/concepts.adoc[] *** xref:basic/architecture.adoc[] *** xref:basic/conf/index.adoc[] *** xref:basic/help.adoc[] ** xref:distributed/index.adoc[] *** xref:distributed/objectives.adoc[] *** xref:distributed/architecture/index.adoc[] **** xref:distributed/architecture/implemented-standards.adoc[] **** xref:distributed/architecture/consistency-model.adoc[] **** xref:distributed/architecture/specialized-instances.adoc[] *** xref:distributed/run/index.adoc[Run] **** xref:distributed/run/run-java.adoc[Run with Java] **** xref:distributed/run/run-docker.adoc[Run with Docker] **** xref:distributed/run/run-kubernetes.adoc[Run with Kubernetes] ***** xref:distributed/run/k8s-checklist.adoc[Deployment Checklist] ***** xref:distributed/run/k8s-logsMetrics.adoc[Logs & Metrics] ***** xref:distributed/run/k8s-values.adoc[values.yaml] ***** xref:distributed/run/k8s-secrets.adoc[secrets.yaml] *** xref:distributed/configure/index.adoc[] **** Protocols ***** xref:distributed/configure/imap.adoc[imapserver.xml] ***** xref:distributed/configure/jmap.adoc[jmap.properties] ***** xref:distributed/configure/jmx.adoc[jmx.properties] ***** xref:distributed/configure/smtp.adoc[smtpserver.xml & lmtpserver.xml] ***** xref:distributed/configure/smtp-hooks.adoc[Packaged SMTP hooks] ***** xref:distributed/configure/pop3.adoc[pop3server.xml] ***** xref:distributed/configure/webadmin.adoc[webadmin.properties] ***** xref:distributed/configure/ssl.adoc[SSL & TLS] ***** xref:distributed/configure/sieve.adoc[Sieve & ManageSieve] **** Storage dependencies ***** xref:distributed/configure/blobstore.adoc[blobstore.properties] ***** xref:distributed/configure/cassandra.adoc[cassandra.properties] ***** xref:distributed/configure/opensearch.adoc[opensearch.properties] ***** xref:distributed/configure/rabbitmq.adoc[rabbitmq.properties] ***** xref:distributed/configure/redis.adoc[redis.properties] ***** xref:distributed/configure/tika.adoc[tika.properties] **** Core components ***** xref:distributed/configure/batchsizes.adoc[batchsizes.properties] ***** xref:distributed/configure/dns.adoc[dnsservice.xml] ***** xref:distributed/configure/domainlist.adoc[domainlist.xml] ***** xref:distributed/configure/droplists.adoc[DropLists] ***** xref:distributed/configure/healthcheck.adoc[healthcheck.properties] ***** xref:distributed/configure/mailetcontainer.adoc[mailetcontainer.xml] ===================================================== == File: docs/modules/servers/pages/distributed/architecture/mailqueue_combined_extend.adoc ===================================================== * Cassandra enables administrative operations such as browsing, deleting using a time series which might require fine performance tuning (see http://cassandra.apache.org/doc/latest/operating/index.html[Operating Cassandra documentation]). ===================================================== == File: docs/modules/servers/pages/distributed/architecture/consistency_model_data_replication_extend.adoc ===================================================== === Cassandra consistency model link:https://cassandra.apache.org/[Cassandra] is an link:https://en.wikipedia.org/wiki/Eventual_consistency[eventually consistent] data store. This means that replica can hold diverging data, but are guaranteed to converge over time. Several mechanisms are built in Cassandra to enforce this convergence, and need to be leveraged by *Distributed Server Administrator*. Namely link:https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/tools/nodetool/toolsRepair.html[nodetool repair], link:https://cassandra.apache.org/doc/latest/operating/hints.html[Hinted hand-off] and link:https://cassandra.apache.org/doc/latest/operating/read_repair.html[Read repair]. The {server-name} tries to mitigate inconsistencies by relying on link:https://docs.datastax.com/en/archived/cassandra/3.0/cassandra/dml/dmlConfigConsistency.html[QUORUM] read and write levels. This means that a majority of replica are needed for read and write operations to be performed. This guaranty is needed as the Mailbox is a complex datamodel with several layers of metadata, and needs "read-your-writes" guaranties that QUORUM read+writes delivers. Critical business operations, like UID allocation, rely on strong consistency mechanisms brought by link:https://www.datastax.com/blog/2013/07/lightweight-transactions-cassandra-20[lightweight transaction]. ==== About multi data-center setups As strong consistency is required for some operation, especially regarding IMAP monotic UID and MODSEQ generation, and as lightweight transactions are slow across data centers, running James with a link:https://docs.datastax.com/en/ddac/doc/datastax_enterprise/production/DDACmultiDCperWorkloadType.html[multi data-center] Cassandra setup is discouraged. However, xref:{xref-base}/configure/cassandra.adoc[this page] enables setting alternative read level, which could be acceptable regarding limited requirements. `LOCAL_QUORUM` coupled with `LOCAL_SERIAL` is likely the only scalable setup. Some options were added to turn off SERIAL consistency usage for message and mailbox management. However, the use of Lightweight Transaction cannot be disabled for UIDs and ModSeqs. Running the {server-name} IMAP server in a multi datacenter setup will likely result either in data loss, or very slow operations - as we rely on monotic UID generation, without strong consistency, UIDs could be allocated several times. We did wire a multi-DC friendly distributed, POP3 only server that leverages acceptable performance while staying consistent. This is achieved by having a reduced feature set - supporting only the POP3 server and using messageIds as identifiers (generated without synchronisation using TimeUUIDs). You can find this application link:https://github.com/apache/james-project/tree/master/server/apps/distributed-pop3-app[on GitHub]. In the future, JMAP support could be added, but requires followup developments as some components critically depends on UIDs (for instance the search). ===================================================== == File: docs/modules/servers/pages/distributed/architecture/implemented-standards.adoc ===================================================== = Distributed James Server — Implemented standards :navtitle: Implemented standards :server-name: Distributed James Server include::partial$architecture/implemented-standards.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/architecture/specialized-instances.adoc ===================================================== = Distributed James Server — Specialized instances :navtitle: Specialized instances :server-name: Distributed James Server :specialized-instances-file-name: specialized-instances-distributed.png include::partial$architecture/specialized-instances.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/architecture/index.adoc ===================================================== = Distributed James Server — Architecture :navtitle: Architecture :backend-name: cassandra :server-name: Distributed James Server :backend-storage-introduce: Cassandra is used for metadata storage. Cassandra is efficient for a very high workload of small queries following a known pattern. :storage-picture-file-name: storage_james_distributed.png :mailet-repository-path-prefix: cassandra :xref-base: distributed :mailqueue-combined-extend-backend: , Cassandra :mailqueue-combined-extend: servers:distributed/architecture/mailqueue_combined_extend.adoc include::partial$architecture/index.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/architecture/consistency-model.adoc ===================================================== = Distributed James Server — Consistency Model :navtitle: Consistency Model :backend-name: cassandra :backend-name-cap: Cassandra :server-name: Distributed James Server :mailet-repository-path-prefix: cassandra :xref-base: distributed :data_replication_extend: servers:distributed/architecture/consistency_model_data_replication_extend.adoc include::partial$architecture/consistency-model.adoc[] == Denormalization In Cassandra, data needs to be structured to match the read patterns. To support several conflicting read patterns, the data needs to be duplicated into different structures. This process is called denormalization. While data can be consistent at the table level, some inconsistencies can sneak in at the applicative level across denormalization tables. We write to a "table of truth" first, then duplicate the data to denormalization tables. The {server-name} offers several mechanisms to mitigate these inconsistencies: - Writes to denormalization tables are retried. - Some xref:{xref-base}/operate/guide.adoc#_solving_cassandra_inconsistencies[SolveInconsistencies tasks] are exposed and are able to heal a given denormalization table. They reset the "deduplication tables" content to the "table of truth" content. - link:https://github.com/apache/james-project/blob/master/src/adr/0042-applicative-read-repairs.md[Read repairs], when implemented for a given denormalization, enables auto-healing. When an inconsistency is detected, They reset the "deduplication tables" entry to the "table of truth" entry. ===================================================== == File: docs/modules/servers/pages/distributed/extending.adoc ===================================================== = Distributed James Server — Extending behaviour :navtitle: Extending behaviour This section can be read xref:customization:index.adoc[this page]. ===================================================== == File: docs/modules/servers/pages/distributed/objectives.adoc ===================================================== = Distributed James Server — Objectives and motivation :navtitle: Objectives and motivation The objective of the Distributed Server is to provided facilities to execute an advanced, extendable, and distributed email system. It is intended for organization with serious requirements, such as high-throughput or very large data sets. Scaling emails infrastructure is a notoriously hard problem. The intent of the Distributed server is to implement a mail server using modern NoSQL technologies. It relies on: * Object Storage enables scalable yet cheap storage of large amount of data * The use of NoSQL for metadata storage enables horizontal scalability * Finally a Distributed search engine enables quick and efficient search Replication, data availability are thus handled by battle tested technologies. Such a data storage strategy enables: * A centralized management of all server components, as each Distributed James server hold the same view on data. * A better load and data repartition between email servers, as each James servers can cary out any tasks. * Easy scaling. Handling more users or more data is as easy as adding James instances and scaling the underlying databases. * Easier load-balancing, as any email server can handle requests from any user. No sharding is involved. * Rich feature, especially regarding *sharing*. Every user can delegate access to any over users. Furthermore, this server is intended to be easily customisable so that it can easily be adapted to ones needs. * Several packaged extensions can be xref:distributed/configure/index.adoc#_for_extensions[configured] * It is easy to write and load xref:customization:index.adoc[your own extensions] ===================================================== == File: docs/modules/servers/pages/distributed/operate/metrics.adoc ===================================================== = Distributed James Server — Metrics :navtitle: Metrics :other-metrics: Cassandra Java driver metrics :xref-base: distributed :server-name: Distributed James Server include::partial$operate/metrics.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/operate/security.adoc ===================================================== = Security checklist :navtitle: Security checklist :xref-base: distributed :backend-name: Cassandra include::partial$operate/security.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/operate/webadmin/admin-messages-extend.adoc ===================================================== === Fixing message inconsistencies This task is only available on top of Guice Cassandra products. .... curl -XPOST /messages?task=SolveInconsistencies .... Will schedule a task for fixing message inconsistencies created by the message denormalization process. Messages are denormalized and stored in separated data tables in Cassandra, so they can be accessed by their unique identifier or mailbox identifier & local mailbox identifier through different protocols. Failure in the denormalization process will lead to inconsistencies, for example: .... BOB receives a message The denormalization process fails BOB can read the message via JMAP BOB cannot read the message via IMAP BOB marks a message as SEEN The denormalization process fails The message is SEEN via JMAP The message is UNSEEN via IMAP .... link:#_endpoints_returning_a_task[More details about endpoints returning a task]. An admin can specify the concurrency that should be used when running the task: * `messagesPerSecond` rate of messages to be processed per second. Default is 100. This optional parameter must have a strictly positive integer as a value and be passed as query parameter. An admin can also specify the reindexing mode it wants to use when running the task: * `mode` the reindexing mode used. There are 2 modes for the moment: ** `rebuildAll` allows to rebuild all indexes. This is the default mode. ** `fixOutdated` will check for outdated indexed document and reindex only those. ===================================================== == File: docs/modules/servers/pages/distributed/operate/webadmin/admin-mailboxes-extend.adoc ===================================================== ==== Fixing mailboxes inconsistencies .... curl -XPOST /mailboxes?task=SolveInconsistencies .... Will schedule a task for fixing inconsistencies for the mailbox deduplicated object stored in Cassandra. link:#_endpoints_returning_a_task[More details about endpoints returning a task]. The `I-KNOW-WHAT-I-M-DOING` header is mandatory (you can read more information about it in the warning section below). The scheduled task will have the following type `solve-mailbox-inconsistencies` and the following `additionalInformation`: .... { "type":"solve-mailbox-inconsistencies", "processedMailboxEntries": 3, "processedMailboxPathEntries": 3, "fixedInconsistencies": 2, "errors": 1, "conflictingEntries":[{ "mailboxDaoEntry":{ "mailboxPath":"#private:user:mailboxName", "mailboxId":"464765a0-e4e7-11e4-aba4-710c1de3782b" }," + "mailboxPathDaoEntry":{ "mailboxPath":"#private:user:mailboxName2", "mailboxId":"464765a0-e4e7-11e4-aba4-710c1de3782b" } }] } .... Note that conflicting entry inconsistencies will not be fixed and will require to explicitly use link:#_correcting_ghost_mailbox[ghost mailbox] endpoint in order to merge the conflicting mailboxes and prevent any message loss. *WARNING*: this task can cancel concurrently running legitimate user operations upon dirty read. As such this task should be run offline. A dirty read is when data is read between the two writes of the denormalization operations (no isolation). ===================================================== == File: docs/modules/servers/pages/distributed/operate/webadmin/admin-mail-queues-extend.adoc ===================================================== === Cassandra view of the RabbitMQ mailQueue: browse start update .... curl -XPOST 'http://ip:port/mailQueues/{mailQueueName}?action=updateBrowseStart .... Will return a task that updates the browse start of the aforementioned mailQueue, regardless of the configuration. link:#_endpoints_returning_a_task[More details about endpoints returning a task]. This is an advanced, potentially expensive operation which requires a good understanding of the RabbitMQMailQueue design (https://github.com/apache/james-project/blob/master/src/adr/0031-distributed-mail-queue.md). Especially, care needs to be taken to call this at most once per slice (not doing so might be expensive). ===================================================== == File: docs/modules/servers/pages/distributed/operate/migrating.adoc ===================================================== = Distributed James Server — Migrating existing data :navtitle: Migrating existing data :xref-base: distributed :server-name: Distributed James Server include::partial$operate/migrating.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/operate/logging/docker-compose-block.adoc ===================================================== [source,docker-compose] ---- version: "3" services: james: depends_on: - opensearch - cassandra - rabbitmq - s3 entrypoint: bash -c "java -cp 'james-server.jar:extension-jars/*:james-server-memory-guice.lib/*' -Dworking.directory=/root/ -Dlogback.configurationFile=/root/conf/logback.xml org.apache.james.CassandraRabbitMQJamesServerMain" image: linagora/james-rabbitmq-project:branch-master container_name: james hostname: james.local volumes: - ./extension-jars:/root/extension-jars - ./conf/logback.xml:/root/conf/logback.xml - ./logs:/root/logs ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8080:8000" opensearch: image: opensearchproject/opensearch:2.14.0 ports: - "9200:9200" environment: - discovery.type=single-node cassandra: image: cassandra:4.1.5 ports: - "9042:9042" rabbitmq: image: rabbitmq:3.13.3-management ports: - "5672:5672" - "15672:15672" s3: image: ghcr.io/scality/cloudserver:8cbe2c066b3505b26d339dc67315d1041b8c7f3a container_name: s3.docker.test ===================================================== == File: docs/modules/servers/pages/distributed/operate/guide.adoc ===================================================== = Distributed James Server — Operator guide :navtitle: Operator guide :xref-base: distributed :mailet-repository-path-prefix: cassandra :backend-name: cassandra :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :server-name: Distributed James Server include::partial$operate/guide.adoc[] == Solving cassandra inconsistencies Cassandra backend uses data duplication to workaround Cassandra query limitations. However, Cassandra is not doing transaction when writing in several tables, this can lead to consistency issues for a given piece of data. The consequence could be that the data is in a transient state (that should never appear outside of the system). Because of the lack of transactions, it’s hard to prevent these kind of issues. We had developed some features to fix some existing cassandra inconsistency issues that had been reported to James. === Jmap message fast view projections When you read a Jmap message, some calculated properties are expected to be fast to retrieve, like `preview`, `hasAttachment`. James achieves it by pre-calculating and storing them into a caching table (`message_fast_view_projection`). Missing caches are populated on message reads and will temporarily decrease the performance. ==== How to detect the outdated projections You can watch the `MessageFastViewProjection` health check at xref:{xref-base}/operate/webadmin.adoc#_check_all_components[webadmin documentation]. It provides a check based on the ratio of missed projection reads. ==== How to solve Since the MessageFastViewProjection is self healing, you should be concerned only if the health check still returns `degraded` for a while, there’s a possible thing you can do is looking at James logs for more clues. === Mailboxes `mailboxPath` and `mailbox` tables share common fields like `mailboxId` and mailbox `name`. A successful operation of creating/renaming/delete mailboxes has to succeed at updating `mailboxPath` and `mailbox` table. Any failure on creating/updating/delete records in `mailboxPath` or `mailbox` can produce inconsistencies. ===================================================== == File: docs/modules/servers/pages/distributed/operate/performanceChecklist.adoc ===================================================== = Distributed James Server — Performance checklist :navtitle: Performance checklist :xref-base: distributed :backend-name: Cassandra :mail-queue-name: CassandraMailQueueView include::partial$operate/performanceChecklist.adoc[] === RabbitMQ We recommend against the use of the CassandraMailQueueView, as browsing and advanced queue management features is unnecessary for Mail Delivery Agent and are not meaningful in the absence of delays. Similarly, we recommend turning off queue size metrics, which are expensive to compute. We also recommend against the use of publish confirms, which comes at a high performance price. In `rabbitmq.properties`: .... cassandra.view.enabled=false mailqueue.size.metricsEnabled=false event.bus.publish.confirm.enabled=false mailqueue.publish.confirm.enabled=false .... === Object storage We recommend the use of the blob store cache, which will be populated by email headers which shall be treated as metadata. `blob.properties`: .... cache.enable=true cache.cassandra.ttl=1year cache.sizeThresholdInBytes=16 KiB .... === Cassandra People tunning for performance would likely accept relaxing their consistency needs. James allows doing this. **LightWeight Transactions (LWT)** can be disabled where they are not essential. This can be done within xref:[cassandra.properties]: .... mailbox.read.strong.consistency=false message.read.strong.consistency=false ===================================================== == File: docs/modules/servers/pages/distributed/operate/webadmin.adoc ===================================================== = Distributed James Server — WebAdmin REST administration API :navtitle: WebAdmin REST administration API :server-name: Distributed James Server :xref-base: distributed :backend-name: Cassandra :admin-mail-queues-extend: servers:distributed/operate/webadmin/admin-mail-queues-extend.adoc :admin-messages-extend: servers:distributed/operate/webadmin/admin-messages-extend.adoc :admin-mailboxes-extend: servers:distributed/operate/webadmin/admin-mailboxes-extend.adoc include::partial$operate/webadmin.adoc[] == Cassandra extra operations Some webadmin features to manage some extra operations on Cassandra tables, like solving inconsistencies on projection tables. Such inconsistencies can be for example created by a fail of the DAO to add a mapping into ’mappings_sources`, while it was successful regarding the`rrt` table. === Operations on mappings sources You can do a series of action on `mappings_sources` projection table : .... curl -XPOST /cassandra/mappings?action={action} .... Will return the taskId corresponding to the related task. Actions supported so far are : * SolveInconsistencies : cleans up first all the mappings in `mappings_sources` index and then repopulate it correctly. In the meantime, listing sources of a mapping might create temporary inconsistencies during the process. For example : .... curl -XPOST /cassandra/mappings?action=SolveInconsistencies .... link:#_endpoints_returning_a_task[More details about endpoints returning a task]. Response codes : * 201: the taskId of the created task * 400: Invalid action argument for performing operation on mappings data === Cassandra Schema upgrades ===================================================== == File: docs/modules/servers/pages/distributed/operate/logging.adoc ===================================================== = Distributed James Server — Logging :navtitle: Logging :xref-base: distributed :server-name: Distributed James Server :server-tag: distributed :docker-compose-code-block-sample: servers:distributed/operate/logging/docker-compose-block.adoc :backend-name: cassandra include::partial$operate/logging.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/operate/index.adoc ===================================================== = Distributed James Server — Operate the Distributed server :navtitle: Operate the Distributed server :xref-base: distributed :server-name: Distributed James Server :server-tag: distributed include::partial$operate/index.adoc[] Read more about xref:distributed/operate/cassandra-migration.adoc[Cassandra data migration]. Additional functional visualisations can be set up using OpenSearch dashboards as documented in link:https://github.com/apache/james-project/tree/master/examples/opensearch-dahsboard[this example]. == Upgrading This section sums up and links upgrade instructions for people willing to upgrade their Distributed server to newer versions. .Upgrade path |=== | Upgrade from | Recommended upgrade path to 3.7.4 | 3.7.0 - 3.7.4 | Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#380-version[3.8.0 upgrade instructions] | 3.6.0 - 3.6.2 | 1. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#370-version[3.7.0 upgrade instructions] 2. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#380-version[3.8.0 upgrade instructions] | 3.5.0 | 1. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#360-version[3.6.0 upgrade instructions] Note: Because of ElasticSearch upgrade (6.3 -> 7.10) this migration cannot be done in a rolling fashion manner. 2. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#370-version[3.7.0 upgrade instructions] 3. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#380-version[3.8.0 upgrade instructions] | 3.4.0 | 1. Rolling upgrade to 3.5.0, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#350-version[3.5.0 upgrade instructions] 2. Upgrade to 3.6.0, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#360-version[3.6.0 upgrade instructions] Note: Because of ElasticSearch upgrade (6.3 -> 7.10) this migration cannot be done in a rolling fashion manner. 3. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#370-version[3.7.0 upgrade instructions] 4. Upgrade, and apply link:https://github.com/apache/james-project/blob/master/upgrade-instructions.md#380-version[3.8.0 upgrade instructions] | 3.3.0 ===================================================== == File: docs/modules/servers/pages/distributed/operate/cassandra-migration.adoc ===================================================== = Distributed James Server — Cassandra migration :navtitle: Cassandra migration Cassandra upgrades implies the creation of a new table. Thus restarting James is needed, as new tables are created on restart. Once done, we ship code that tries to read from new tables, and if not possible backs up to old tables. You can thus safely run without running additional migrations. On the fly migration can be enabled. However, one might want to force the migration in a controlled fashion, and update automatically current schema version used (assess in the database old versions is no more used, as the corresponding tables are empty). Note that this process is safe: we ensure the service is not running concurrently on this James instance, that it does not bump version upon partial failures, that race condition in version upgrades will be idempotent, etc... These schema updates can be triggered by xref:distributed/operate/webadmin.adoc#_cassandra_schema_upgrades[webadmin]. Note that currently the progress can be tracked by logs. Here are the implemented migrations: * *From V8 to V9* : Adopt a more compact representation for message properties. * *From V9 to V10* : Handles Mailbox ACL transactionality with event-sourcing. We got read of SERIAL consistency upon reads thus unlocking a major performance enhancement. The xref:distributed/operate/guide.adoc#_updating_cassandra_schema_version[Operator guide] further details the migration process. ===================================================== == File: docs/modules/servers/pages/distributed/operate/cli.adoc ===================================================== = Distributed James Server — Command Line Interface :navtitle: Command Line Interface :xref-base: distributed :server-name: Distributed James Server include::partial$operate/cli.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/benchmark/benchmark_prepare.adoc ===================================================== // ===================================================== == File: docs/modules/servers/pages/distributed/benchmark/db-benchmark.adoc ===================================================== = Distributed James Server -- Database benchmarks :navtitle: Database benchmarks :backend-name: cassandra :backend-name-cap: Cassandra :server-name: Distributed James Server :backend-database-extend-sample: Apache Cassandra 4 as main database: 3 nodes, each node has 8 OVH vCores CPU and 30 GB memory limit (OVH b2-30 instance). include::partial$benchmark/db-benchmark.adoc[] === Benchmark Cassandra ==== Benchmark methodology ===== Benchmark tool We use https://cassandra.apache.org/doc/latest/cassandra/tools/cassandra_stress.html[cassandra-stress tool] - an official tool of Cassandra for stress loading tests. The cassandra-stress tool is a Java-based stress testing utility for basic benchmarking and load testing a Cassandra cluster. Data modeling choices can greatly affect application performance. Significant load testing over several trials is the best method for discovering issues with a particular data model. The cassandra-stress tool is an effective tool for populating a cluster and stress testing CQL tables and queries. Use cassandra-stress to: - Quickly determine how a schema performs. - Understand how your database scales. - Optimize your data model and settings. - Determine production capacity. There are several operation types: - write-only, read-only, and mixed workloads of standard data - write-only and read-only workloads for counter columns - user configured workloads, running custom queries on custom schemas ===== How to benchmark Here we are using a simple case to test and compare Cassandra performance between different setup environments. [source,yaml] ---- keyspace: stresscql keyspace_definition: | CREATE KEYSPACE stresscql WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}; table: mixed_workload table_definition: | CREATE TABLE mixed_workload ( key uuid PRIMARY KEY, a blob, b blob ===================================================== == File: docs/modules/servers/pages/distributed/benchmark/james-benchmark.adoc ===================================================== = Distributed James Server benchmark :navtitle: James benchmarks :server-name: Distributed James Server :backend-database-extend-sample: Apache Cassandra 4 as main database: 3 nodes, each node has 8 OVH vCores CPU and 30 GB memory limit (OVH b2-30 instance). :provision_file_url: https://github.com/apache/james-project/tree/master/docs/modules/servers/pages/distributed/benchmark/provision.sh :benchmark_prepare_extend: servers:distributed/benchmark/benchmark_prepare.adoc :james-imap-base-performance-picture: james-imap-base-performance-distributed.png include::partial$benchmark/james-benchmark.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/benchmark/provision.sh ===================================================== #!/bin/bash export WEBADMIN_BASE_URL="http://localhost:8000" export SMTP_URL="localhost:25" export DOMAIN_NAME="domain.org" export USERS_COUNT=10 export DUMMY_MAILBOXES_COUNT=10 export DUMMY_EMAILS_COUNT=100 # Create domain curl -X PUT ${WEBADMIN_BASE_URL}/domains/${DOMAIN_NAME} for i in $(seq 1 $USERS_COUNT) do # Create user echo "Creating user $i" username=user${i}@$DOMAIN_NAME curl -XPUT ${WEBADMIN_BASE_URL}/users/$username \ -d '{"password":"secret"}' \ -H "Content-Type: application/json" # Create mailboxes for each user echo "Creating user $i mailboxes" # Create some basic mailboxes curl -XPUT ${WEBADMIN_BASE_URL}/users/${username}/mailboxes/INBOX curl -XPUT ${WEBADMIN_BASE_URL}/users/${username}/mailboxes/Outbox curl -XPUT ${WEBADMIN_BASE_URL}/users/${username}/mailboxes/Sent curl -XPUT ${WEBADMIN_BASE_URL}/users/${username}/mailboxes/Draft curl -XPUT ${WEBADMIN_BASE_URL}/users/${username}/mailboxes/Trash # Create some other dummy mailboxes for j in $(seq 1 $DUMMY_MAILBOXES_COUNT) do dummyMailbox=MAILBOX${j} curl -XPUT ${WEBADMIN_BASE_URL}/users/${username}/mailboxes/$dummyMailbox done done # Create many dummy randomly messages (DUMMY_EMAILS_COUNT*4 to DUMMY_EMAILS_COUNT*8 messages range) echo "Creating various dummy emails" smtp-source -m ${DUMMY_MAILBOXES_COUNT} -f user1@domain.org -t user2@domain.org ${SMTP_URL} ===================================================== == File: docs/modules/servers/pages/distributed/benchmark/index.adoc ===================================================== = Distributed James Server — Performance testing :navtitle: Performance testing the Distributed server :xref-base: distributed :server-name: Distributed James Server include::partial$benchmark/index.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/index.adoc ===================================================== = James Distributed Mail Server :navtitle: Distributed James Application The Distributed server offers an easy way to scale email server. Based on noSQL solutions, it is intended to be easy to operate for large deployments, without needing sharding and protocol aware load balancing. The Distributed Server does assume that you have advanced technical knowledge and is the most complex and feature-rich option. This server is: * Intended for use by experts only * Used for large-scale distributed deployments * Is designed for Mail Delivery use cases but can also carry out mail processing * The most feature-rich server, but also by far the most complex In this section of the documentation, we will introduce you to: * xref:distributed/objectives.adoc[Objectives and motivation of the Distributed Server] * xref:distributed/architecture/index.adoc[Overview of architecture] * xref:distributed/run/index.adoc[Run the Distributed Server] * xref:distributed/configure/index.adoc[Configure the Distributed Server] * xref:distributed/operate/index.adoc[Operation of the Distributed Server] * xref:customization:index.adoc[How to extend the server] ===================================================== == File: docs/modules/servers/pages/distributed/run/k8s-secrets.adoc ===================================================== == Secrets for James Helm template Helm James has many secret values to configure before being able to use it correctly. Those secrets are linked to the template through their declaration in `james-secrets.yaml`. A sample with dumb secrets can be found in the `secrets.sample.yaml` file. This document presents a quick description of each secret field. For more information about encrypt/descrypt secret with Helm, see: https://github.com/jkroepke/helm-secrets === James secret values [cols="<,<,<",options="header",] |=== |Field |Mandatory or optional |Description |jwtPublicKey |Mandatory |The JWT public key used for JWT tokens. |jwtPrivateKey |Mandatory |The JWT private key used for JWT tokens. |cassandraUser |Mandatory |The user for Cassandra access |cassandraPassword |Mandatory |The password fort Cassandra access |esUser |Optional |The user for OpenSearch access |esPassword |Optional |The password for OpenSearch access |dkimPrivateKey |Optional |The private key for the generated DKIM |s3.endpoint |Mandatory |The S3 endpoint. ie: http://s3-us-east-1.amazonaws.com |s3.region |Mandatory |The region of the S3 object storage. |s3.accessKeyId |Mandatory |The access key to the S3 object storage |s3.secretKey |Mandatory |The secret key to the S3 object storage |s3.bucketNameSuffix |Mandatory |All buckets in S3 related to james storage start by ``james-''. This allows to have a suffix for each tenant |=== === jwtPublicKey Use `openssl` to generate self-signed certificate and convert to Java Key Store JKS. You can find an example https://loneidealist.medium.com/generating-signing-certificates-with-openssl-and-converting-to-java-key-store-jks-3c8185dbf8fe[here] ===================================================== == File: docs/modules/servers/pages/distributed/run/k8s-logsMetrics.adoc ===================================================== == Logs and Metrics === Logs James exposes its logs on the console. Then a fluent bit instance scraps and collects them, before being indexed and used by Kibana, with nice search possibilities. The way James exposes its logs on the console is defined in the `logback.xml` configuration file. James currently exposes logs in JSON format using Jackson Json formatter. === Metrics James exposes its metrics over an HTTP Webadmin endpoint, something like `https://james-web-admin/metrics`. Those metrics can be scraped by Prometheus before being visualized on Grafana. This Helm chart exposes James metrics through Prometheus https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/user-guides/getting-started.md#include-servicemonitors[ServiceMonitor]. You can import the dashboards for James metrics in Grafana defined https://github.com/apache/james-project/tree/master/server/grafana-reporting/prometheus-datasource[here]. Be aware that those dashboards still need more work, as we used to export metrics to Elasticsearch not long ago, which required to redo all dashboards. Some enhancements are highly possible and encouraged. Read more about xref:distributed/operate/metrics.adoc[Metrics in James]. ===================================================== == File: docs/modules/servers/pages/distributed/run/run-docker.adoc ===================================================== = Distributed James Server — Run with docker :navtitle: Run with docker == Running via docker-compose Requirements: docker & docker-compose installed. When you try James this way, you will use the most current state of James. It will be configured to run with Cassandra & OpenSearch. All those three components will be started with a single command. You can retrieve the docker-compose file : ( docker-compose file and james image name should be changed) $ wget https://raw.githubusercontent.com/apache/james-project/master/server/apps/distributed-app/docker-compose.yml Then, you just have to start the services: $ docker-compose up -d Wait a few seconds in order to have all those services start up. You will see the following log when James is available: james | Started : true A default domain, james.local, has been created. You can see this by running: $ docker exec james james-cli -h 127.0.0.1 -p 9999 listdomains James will respond to IMAP port 143 and SMTP port 25. You have to create users before playing with james. You may also want to create other domains. Follow the xref:distributed/operate/cli.adoc['Useful commands'] section for more information about James CLI. == Run with docker === Requirements Compile the whole project: mvn clean install -DskipTests -T 4 Then load the distributed server docker image: docker load -i server/apps/distributed-app/target/jib-image.tar Alternatively we provide convenience distribution for the latest release: docker pull apache/james:distributed-3.8.2 === Running Firstly, create your own user network on Docker for the James environment: ===================================================== == File: docs/modules/servers/pages/distributed/run/run-kubernetes.adoc ===================================================== = Distributed James Server — Run with Kubernetes :navtitle: Run with Kubernetes == Deploy Apache James on Kubernetes with Helm chart. This chart bootstraps a James mail server on a link:http://kubernetes.io[Kubernetes] cluster using the link:https://helm.sh[Helm] package manager. == Before Starting Before running the Helm chart, James should have particularly accessed to the following external products: Apache Cassandra:: - You can deploy Cassandra on Kubernetes with a link:https://github.com/bitnami/charts/tree/master/bitnami/cassandra[Cassandra chart] for testing purpose. However we would recommend running Cassandra on VirtualMachine for better stablilty. OpenSearch:: - OpenSearch community maintains link:https://github.com/opensearch-project/helm-charts[Helm charts] RabbitMQ:: - link:https://github.com/rabbitmq/cluster-operator[RabbitMQ Cluster Operator] is a custom Kubernetes resource designed for the lifecycle (creation, upgrade, graceful shutdown) of a RabbitMQ cluster. Using Quickstart setup is enough for James deployment. == Configuration === Helm Configuration The James helm package take parameters that will configure and determine the behavior of James. There are 2 configuration files: * One contains global, non-confidential, configuration: `values.yaml` * The other one contains secrets: `secrets.yaml`. Values are encrypted with a key stored generated by link:https://github.com/mozilla/sops[sops]. You need to pass these 2 files as parameters to the James Helm package. To verify the coherence and avoid errors, the packages can validate the input. This package contains a default `values.yaml` file, but that you should override with proper configuration for your deployment (`conf.yaml`). The file `secrets.sample.yaml` will show you the possible values of the secrets file. To generate the `secrets.yaml` file, you will need a plugin for Helm called link:https://github.com/jkroepke/helm-secrets[helm-secrets]. Usually, you will save those configurations in different repositories, per deployment. Have a look at `values.md` and `secrets.md` in our Chart link:https://github.com/apache/james-project/tree/master/server/apps/distributed-app/helm-chart/james/doc/[documents] to have more information on the configuration James is using. You can find our Helm chart for James in link:https://github.com/apache/james-project/tree/master/server/apps/distributed-app/helm-chart[here] === James Configuration The configuration files proper to James are stored in the Chart `james/configs` folder. They are being stored in a `ConfigMap` and then being mounted in the James pod at /root/conf path. If you need to change a conf in James, this is where you need to look at. ===================================================== == File: docs/modules/servers/pages/distributed/run/k8s-values.adoc ===================================================== == Values for Helm James template Helm James has many visible values to configure before being able to use it correctly. Values are injected into the deployment template as environment variables. An example with default values can be found in the `+values.yaml+` file. This document presents a quick description of each value field. === DNS values [cols="<,<,<",options="header",] |=== |Field |Default value |Description |emailDomain |mail.example.com |The domain name for your tenant’s email addresses |jmapUrl |jmap.example.com |The url for the ingress jmap endpoint |adminUrl |admin.example.com |The url for the ingress admin endpoint |smtpHostname |smtp.example.com |The SMTP Ehlo hostname |=== === James values [cols="<,<,<",options="header",] |=== |Field |Default value |Description |replicaJmapInstanceCount |1 |The number of pods we deploy for James JMAP instance in the cluster |replicaImapSmtpInstanceCount |1 |The number of pods we deploy for James IMAP/SMTP instance in the cluster |image |apache/james:distributed-3.8.2 |The James image used for deployment (Cassandra - RabbitMQ - LDAP distributed James flavor) |=== === James environment values [cols="<,<,<",options="header",] |=== |Field |Default value |Description |jamesCassandraKeyspace |sandbox_james |The keyspace used for Cassandra James data |jamesCassandraCacheKeyspace |sandbox_james_cache |The keyspace used for the Cassandra cache |jamesEsMailboxIndex |mailbox_v1 |The index used for mailbox in OpenSearch. The default value should be enough, but in case you had ===================================================== == File: docs/modules/servers/pages/distributed/run/index.adoc ===================================================== = Distributed James Server — Run :navtitle: Run This sections presents guidance to all current deployment types of Distributed James Server. == Run with Java Build your own Apache James Distributed artifacts and start xref:distributed/run/run-java.adoc[Running it directly on a Java Virtual Machine]. == Run with Docker We have prepared a docker-compose for Apache James to run with Cassandra & OpenSearch. You can start xref:distributed/run/run-docker.adoc[Running James with few simple Docker commands]. == Run with Kubernetes A more complete - production ready deployment type. We have packed xref:distributed/run/run-kubernetes.adoc[Apache James in a Helm chart], parameterized most of the application resources. With it you can easily deploy and test different set of configuration on a Kubernetes Cluster. ===================================================== == File: docs/modules/servers/pages/distributed/run/run-java.adoc ===================================================== = Distributed James Server — Run :navtitle: Run == Building === Requirements * Java 11 SDK * Docker ∕ OpenSearch 2.1.0, RabbitMQ Management 3.8.18, S3 compatible ObjectStorage and Cassandra 4.0 * Maven 3 === Building the artifacts An usual compilation using maven will produce two artifacts into server/apps/distributed-app/target directory: * james-server-distributed-app.jar * james-server-distributed-app.lib You can for example run in the base of https://github.com/apache/james-project[this git repository]: .... mvn clean install .... == Running === Requirements * Cassandra 4.0 * OpenSearch 2.1.0 * RabbitMQ-Management 3.8.17 * Swift ObjectStorage 2.15.1 or Zenko Cloudserver or AWS S3 === James Launch To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called *conf*. You can get a sample directory for configuration from https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/[server/apps/distributed-app/sample-configuration/]. You might need to adapt it to your needs. You need to have a Cassandra, OpenSearch, S3 and RabbitMQ instance running. You can either install the servers or launch them via docker: ===================================================== == File: docs/modules/servers/pages/distributed/run/k8s-checklist.adoc ===================================================== = Checklist There is some things that you must have before being able to run James on your Kubernetes Cluster. == MUST have Those are absolutely necessary if you want at least James to start without crashing. - [ ] Setup RabbitMQ and create James user in it. - [ ] Create a Kubernetes namespace for James deployment. - [ ] A `distributed` version of James image. - [ ] An ObjectStorage compatible with S3 APIs. - [ ] Configure JWT keys, keystores. - [ ] Adding the proper `mailetcontainer.xml` file with other conf files in James Helm package With those you should be able to startup James for first tests without having it crashing. However it's still not enough to have it fully functional. == Should have - [ ] Cassandra nodes deployed. - [ ] Put valid Cassandra keyspaces in the configuration. - [ ] Have an appropriate email domain (Contact your Domain Service Provider) - [ ] Create your Domain SPF and DKIM Record. See document [here](https://james.apache.org/howTo/) - [ ] OpenSearch nodes deployed. - [ ] DNS registered entries for JMAP, IMAP, SMTP, Webadmin. - [ ] Enable Ingress and create the secret for TLS certificate used by Ingress. * Preproduction: Usually, we use link:https://github.com/jetstack/cert-manager[cert-manager] to request a Let's Encrypt Certificate. Remember to use the full chain certificate. You can verify that your certificate works well with `openssl` before adding the name of that secret to your James values. * Production: Some certificates belonging to the client should exist already. See that with the team. - [ ] Change IMAP ports to NodePort if your Cloud Provider Load Balancer has short idle timeout and we need longer connections for performance reasons (and the RFC for IMAP states also we need 30 minutes for the timeout). - [ ] Use an external LB (ie. HA Proxy) to redirect traffic towards James IMAP service NodePort IPs and ports. == After setup operations When all of this is working, normally your chain mail should be able to work. To check it you can: * Use a mail client (ThunderBird, Outlook, ...) to test James IMAP. * Send a mail internally from one test account to an other. * Send a mail from James to an external mail provider (your Gmail, Yahoo account for example). * Send a mail from an external provider to James. * Use services like link:https://www.mail-tester.com/[mail-tester] to check your score. ===================================================== == File: docs/modules/servers/pages/distributed/configure/collecting-events.adoc ===================================================== = Event collection :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/collecting-events.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/matchers.adoc ===================================================== = Distributed James Server — Matchers :navtitle: Matchers :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/matchers.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/mailets.adoc ===================================================== = Distributed James Server — Mailets :navtitle: Mailets :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :server-name: Distributed James Server include::partial$configure/mailets.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/batchsizes.adoc ===================================================== = Distributed James Server — batchsizes.properties :navtitle: batchsizes.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/batchsizes.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/smtp-hooks.adoc ===================================================== = Distributed James Server — SMTP Hooks :navtitle: SMTP Hooks :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/smtp-hooks.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/domainlist.adoc ===================================================== = Distributed James Server — domainlist.xml :navtitle: domainlist.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/domainlist.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/queue.adoc ===================================================== = Distributed James Server — queue.properties :navtitle: queue.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/queue.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/dsn.adoc ===================================================== = Distributed James Server — Delivery Submission Notifications :navtitle: ESMTP DSN setup :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :mailet-repository-path-prefix: cassandra include::partial$configure/dsn.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/jmx.adoc ===================================================== = Distributed James Server — jmx.properties :navtitle: jmx.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/jmx.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/cassandra.adoc ===================================================== = Distributed James Server — cassandra.properties :navtitle: cassandra.properties This configuration file allow setting some configuration properties in conjunction to Cassandra driver native configuration. Consult this link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/cassandra.properties[example] to get some examples and hints. Consult this link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/cassandra-driver.conf[example] to get some examples and hints for Cassandra driver native configuration. Cassandra native configuration allows configuring SSL, timeouts, logs and metrics as well as execution profiles. == Configuration Here are generic properties: .cassandra.properties content |=== | Property name | explanation | cassandra.nodes | List of some nodes of the cassandra's cluster in following format host:port or host, if the port is not specified we use 9042 |cassandra.keyspace.create |Indicate if the keyspace should be created by James. Optional, default value: *false* If set to true James will attempt to create the keyspace when starting up. |cassandra.keyspace |Is the name of the keyspace used by James. Optional, default value: *apache_james* |cassandra.user |Username used as a credential for contacting Cassandra cluster. Optional, default is absent, required if *cassandra.password* is supplied |cassandra.password |Password used as a credential for contacting Cassandra cluster. Optional, default is absent, required if <strong>cassandra.user</strong> is supplied |cassandra.replication.factor |Is the replication factor used upon keyspace creation. Modifying this property while the keyspace already exists will have no effect. Optional. Default value 1. |cassandra.local.dc |Optional. Allows specifying the local DC as part of the load balancing policy. Specifying it would result in the use of `new TokenAwarePolicy(DCAwareRoundRobinPolicy.builder().withLocalDc(value).build())` as a LoadBalancingPolicy. This value is useful in a multi-DC Cassandra setup. Be aware of xref:distributed/architecture/consistency-model.adoc#_about_multi_data_center_setups[limitation of multi-DC setups for James] Not specifying this value results in the driver's default load balancing policy to be used. ===================================================== == File: docs/modules/servers/pages/distributed/configure/tika.adoc ===================================================== = Distributed James Server — tika.properties :navtitle: tika.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/tika.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/jvm.adoc ===================================================== = Distributed James Server — jvm.properties :navtitle: jvm.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/jvm.adoc[] == Disable OpenSearchListeningMessageSearchIndex fetch full message content Whether to fetch full message content when indexing messages in OpenSearch. This is useful when you want to avoid fetch full message content while indexing only headers for example. Be careful whether the custom `OpenSearchListeningMessageSearchIndex.Indexer` (s) need full message content or not. Ex in `jvm.properties`: ---- opensearch.index.listener.fetch.full.content=false ---- Optional. Boolean. Defaults to true. ===================================================== == File: docs/modules/servers/pages/distributed/configure/jmap.adoc ===================================================== = Distributed James Server — jmap.properties :navtitle: jmap.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :server-name: Distributed James Server :backend-name: Cassandra include::partial$configure/jmap.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/mailrepositorystore.adoc ===================================================== = Distributed James Server — mailrepositorystore.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server :mailet-repository-path-prefix: cassandra :mail-repository-protocol: cassandra :mail-repository-class: org.apache.james.mailrepository.cassandra.CassandraMailRepository include::partial$configure/mailrepositorystore.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/collecting-contacts.adoc ===================================================== = Contact collection :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/collecting-contacts.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/droplists.adoc ===================================================== = Distributed James Server — DropLists :navtitle: DropLists :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed include::partial$configure/droplists.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/search.adoc ===================================================== = Distributed James Server — Search configuration :navtitle: Search configuration :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/search.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/blobstore.adoc ===================================================== = Distributed James Server — blobstore.properties :navtitle: blobstore.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed == BlobStore This file is optional. If omitted, the *cassandra* blob store will be used. BlobStore is the dedicated component to store blobs, non-indexable content. James uses the BlobStore for storing blobs which are usually mail contents, attachments, deleted mails... You can choose the underlying implementation of BlobStore to fit with your James setup. It could be the implementation on top of Cassandra or file storage service S3 compatible like Openstack Swift and AWS S3. Consult link:{sample-configuration-prefix-url}/blob.properties[blob.properties] in GIT to get some examples and hints. === Implementation choice *implementation* : * cassandra: use cassandra based BlobStore * objectstorage: use Swift/AWS S3 based BlobStore * file: (experimental) use directly the file system. Useful for legacy architecture based on shared ISCI SANs and/or distributed file system with no object store available. WARNING: JAMES-3591 Cassandra is not made to store large binary content, its use will be suboptimal compared to Alternatives (namely S3 compatible BlobStores backed by for instance S3, MinIO or Ozone) The generated startup warning log can be deactivated via the `cassandra.blob.store.disable.startup.warning` environment variable being positioned to `false`. *deduplication.enable*: Mandatory. Supported value: true and false. If you choose to enable deduplication, the mails with the same content will be stored only once. WARNING: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all the mails sharing the same content once one is deleted. NOTE: If you are upgrading from James 3.5 or older, the deduplication was enabled. Deduplication requires a garbage collector mechanism to effectively drop blobs. A first implementation based on bloom filters can be used and triggered using the WebAdmin REST API. See xref:{pages-path}/operate/webadmin.adoc#_running_blob_garbage_collection[Running blob garbage collection]. In order to avoid concurrency issues upon garbage collection, we slice the blobs in generation, the two more recent generations are not garbage collected. ===================================================== == File: docs/modules/servers/pages/distributed/configure/extensions.adoc ===================================================== = Distributed James Server — extensions.properties :navtitle: extensions.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed include::partial$configure/extensions.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/sieve.adoc ===================================================== = Sieve :navtitle: Sieve :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/sieve.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/listeners.adoc ===================================================== = Distributed James Server — listeners.xml :navtitle: listeners.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :server-name: Distributed James Server include::partial$configure/listeners.adoc[] === MailboxOperationLoggingListener Provides more insights on mailbox operationsby logging them. This MailboxListener is supported. Example: [source,xml] .... <listeners> <listener> <class>org.apache.james.mailbox.cassandra.MailboxOperationLoggingListener</class> </listener> <!-- ... --> </listeners> .... ===================================================== == File: docs/modules/servers/pages/distributed/configure/vault.adoc ===================================================== = Distributed James Server — deletedMessageVault.properties :navtitle: deletedMessageVault.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server :backend-name: Cassandra include::partial$configure/vault.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/imap.adoc ===================================================== = Distributed James Server — imapserver.xml :navtitle: imapserver.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed include::partial$configure/imap.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/ssl.adoc ===================================================== = Distributed James Server — SSL & TLS configuration :navtitle: SSL & TLS configuration :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/ssl.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/smtp.adoc ===================================================== = Distributed James Server — smtpserver.xml :navtitle: smtpserver.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/smtp.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/mailetcontainer.adoc ===================================================== = Distributed James Server — mailetcontainer.xml :navtitle: mailetcontainer.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed include::partial$configure/mailetcontainer.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/webadmin.adoc ===================================================== = Distributed James Server — webadmin.properties :navtitle: webadmin.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/webadmin.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/recipientrewritetable.adoc ===================================================== = Distributed James Server — recipientrewritetable.xml :navtitle: recipientrewritetable.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/recipientrewritetable.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/rabbitmq.adoc ===================================================== = Distributed James Server — rabbitmq.properties :navtitle: rabbitmq.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/rabbitmq.adoc[] == RabbitMQ MailQueue Configuration James mail queue is a component acting like a queue where it can enqueue and dequeue mails. Beside of the basic features, it also allows some extra operations like getting size, browsing all items in the mail queue... One of the mailqueue implementation is using RabbitMQ. As RabbitMQ doesn't offer enough features to implement efficiently all mailqueue operations, this implementation relies on Cassandra. .rabbitmq.properties content |=== | Property name | explanation | cassandra.view.enabled | Whether the Cassandra administrative view should be activated. Boolean value defaulting to true. Not necessarily needed for MDA deployments, mail queue management adds significant complexity. | mailqueue.view.sliceWindow | James divides the view into slices, each slice contains data for a given period, sliceWindow parameter controls this period. This dividing of periods allows faster browsing of the mail queue. Tips for choosing sliceWindow are explained in {sample-configuration-prefix-url}/rabbitmq.properties[rabbitmq.properties] | mailqueue.view.bucketCount | Mails in a mail queue are distributed across the underlying storage service. BucketCount describes how to be distributing mails to fit with your James setup Tips for choosing bucketCount are explained in {sample-configuration-prefix-url}/rabbitmq.properties[rabbitmq.properties] | mailqueue.view.updateBrowseStartPace | To browse, James needs a starting point and to continuously update that point in runtime. UpdateBrowseStartPace describes the probability to update the starting point. Tips for choosing updateBrowseStartPace are explained in {sample-configuration-prefix-url}/rabbitmq.properties[rabbitmq.properties] | mailqueue.size.metricsEnabled | By default, the metrics are disabled for the mail queue size. As computing the size of the mail queue is currently implemented on top of browse operation and thus has a linear complexity, sometimes it can get too big, making it impossible for the ES reporter to handle it correctly without crashing. It can be useful then to disable it. Tips for choosing metricsEnabled are explained in {sample-configuration-prefix-url}/rabbitmq.properties[rabbitmq.properties] | notification.queue.ttl | Configure queue ttl (in ms). References: https://www.rabbitmq.com/ttl.html#queue-ttl. ===================================================== == File: docs/modules/servers/pages/distributed/configure/spam.adoc ===================================================== = Distributed James Server — Anti-Spam configuration :navtitle: Anti-Spam configuration :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server :mailet-repository-path-prefix: cassandra include::partial$configure/spam.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/remote-delivery-error-handling.adoc ===================================================== = Distributed James Server — About RemoteDelivery error handling :navtitle: About RemoteDelivery error handling :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server :mailet-repository-path-prefix: cassandra include::partial$configure/remote-delivery-error-handling.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/index.adoc ===================================================== = Distributed James Server — Configuration :navtitle: Configuration This section presents how to configure the Distributed server. The Distributed Server relies on separated files for configuring various components. Some files follow a *xml* format and some others follow a *property* format. Some files can be omitted, in which case the functionality can be disabled, or rely on reasonable defaults. The following configuration files are exposed: :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :xref-base: distributed/configure :server-name: Distributed James Server include::partial$configure/forProtocolsPartial.adoc[] include::partial$configure/forStorageDependenciesPartial.adoc[] ** xref:distributed/configure/cassandra.adoc[*cassandra.properties*] allows to configure the Cassandra driver link:{sample-configuration-prefix-url}/sample-configuration/cassandra.properties[example] include::partial$configure/forCoreComponentsPartial.adoc[] include::partial$configure/forExtensionsPartial.adoc[] include::partial$configure/systemPropertiesPartial.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/dns.adoc ===================================================== = Distributed James Server — dnsservice.xml :navtitle: dnsservice.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/dns.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/redis.adoc ===================================================== = Distributed James Server — redis.properties :navtitle: redis.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/redis.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/healthcheck.adoc ===================================================== = Distributed James Server — healthcheck.properties :navtitle: healthcheck.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/healthcheck.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/usersrepository.adoc ===================================================== = Distributed James Server — usersrepository.xml :navtitle: usersrepository.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration include::partial$configure/usersrepository.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/opensearch.adoc ===================================================== = Distributed James Server — opensearch.properties :navtitle: opensearch.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server :package-tag: cassandra include::partial$configure/opensearch.adoc[] ===================================================== == File: docs/modules/servers/pages/distributed/configure/pop3.adoc ===================================================== = Distributed James Server — pop3server.xml :navtitle: pop3server.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration :pages-path: distributed :server-name: Distributed James Server include::partial$configure/pop3.adoc[] ===================================================== == File: docs/modules/servers/pages/5-minute-demo.adoc ===================================================== = Short Demo In this short demo (~5 minutes), we will set up a running James demo very quickly using a prepared Docker image. Then you will add a domain, and a user account within that domain. Requirements: * Docker == Set up the demo server To begin, run the James demo server using Docker: [source,bash] ---- docker run -d -p "25:25" -p "143:143" --name james apache/james:demo-latest ---- Explanation: * `docker run` runs the provided image with the given parameters * The `-d` parameter runs the container in "detached" mode * `-p "25:25" -p "143:143"` attaches the image ports to the ports 25 (SMTP) and 143 (IMAP) on the host machine * The `--name james` parameter gives the running container a name to make it easier to manipulate * `apache/james:demo-latest` is the image that is used for this demo Docker will pull the image and start the container. == Connect via the CLI **** To run commands using the James CLI, you can use the running container via Docker: ---- docker exec james james-cli <<COMMAND>> ---- **** As an example, list all the domains currently in use by James: [source,bash] ---- docker exec james james-cli listDomains ---- You should notice that a default domain, james.local, has been created ===================================================== == File: docs/modules/servers/pages/15-minute-demo.adoc ===================================================== = Long Demo In this demo (~15 minutes), we will set up a running James demo using a prepared Docker image. We will then test the server by connecting with an email client. Finally, we will connect to the server via the REST-based Admin API. Requirements: * Docker * curl * Thunderbird client (optional) == Set up the demo server Before starting the server, because we will be connecting to the Admin API we need to set some configuration parameters. We will create a `webadmin.properties` file that James will use in order to allow us to connect to the API. Run this command to create the `webadmin.properties` file: [source,bash] ---- printf 'enabled=true\nport=8000\nhost=localhost' >> webadmin.properties ---- Explanation: * `enabled=true` instructs James to run the Admin API service * `port=8000` configures the Admin API to be made available via port 8000 * `host=localhost` configures the Admin API to respond on localhost Now run the James demo server using this command: [source,bash] ---- docker run -d -p "25:25" -p "143:143" -p "127.0.0.1:8000:8000" -v $(pwd)/webadmin.properties:/root/conf/webadmin.properties --name james apache/james:demo-latest ---- Explanation: * `docker run` runs the provided image with the given parameters * The `-d` parameter runs the container in "detached" mode * `-p "25:25" -p "143:143"` attaches the image ports to the ports 25 (SMTP) and 143 (IMAP) on the host machine * `-p "127.0.0.1:8000:8000" attaches the port 8000 to localhost on the host machine to allow us to connect to the Admin API * `-v $(pwd)/webadmin.properties:/root/conf/webadmin.properties` mounts the webadmin.properties file to configure the Admin API * The `--name james` parameter gives the running container a name to make it easier to manipulate * `apache/james:demo-latest` is the image that is used for this demo Docker will pull the image and start the container. ===================================================== == File: docs/modules/servers/pages/test.adoc ===================================================== = James Test Server :navtitle: Test https://github.com/apache/james-project/tree/master/server/apps/memory-app[Apache James Memory App] is a memory-only implementation of Apache James. It is useful for testing and development purposes. ===================================================== == File: docs/modules/servers/pages/demo.adoc ===================================================== = Server Demo :navtitle: Demo The James Demo Server sets up a light-weight, disposable mail server so you can try it out easily on your own local machine. * xref:servers:5-minute-demo.adoc[Short demo] (~5 minutes) ** Set up a demo server ** Create a new user with the CLI * xref:servers:15-minute-demo.adoc[Long demo] (~15 minutes) ** Same steps as above ** Interact with the server via the Admin API ** Test the server with an email client ===================================================== == File: docs/modules/servers/pages/basic/context.adoc ===================================================== = James Basic Server — Context :navtitle: Context Email has been around in one form or another for more than 50 years. It is arguably one of the most resilient applications or our day, and may even be called **THE** killer app of our time. Most of us, if not all but the most unfortunate, use email on a regular basis. If you are reading this page over the web, it is almost 100% certain that you have used and continue to use email. Despite its ubiquity, the vast majority of people do not control their own email infrastructure. Although, unlike telecommunications or electricity for example, the barriers to owning and maintaining your own infrastructure are very low, individuals and companies alike usually defer to the large email providers for this essential service. Although relying on the big providers is easy, what they offer is often limited and in some cases much more costly than it ought to be. The Apache James Community is dedicated to liberating email. Our mission is to make email hosting both easy and fun. We do this by: * Providing an easy-to-use self-hosted server for amateur Operators * Providing an extendable server for those more experienced Operators * Providing a distributed solution for heavy-duty projects * Ensuring that James remains a flexible, reliable technology platform ===================================================== == File: docs/modules/servers/pages/basic/objectives.adoc ===================================================== = James Basic Server — Objectives :navtitle: Objectives The objective of the Basic Server is to be as simple and minimalistic as possible, while still being useful. Many people wish to have a basic self-hosted mail server that they can use without having to become a deep technical expert. The Basic Server is intended to be an entry-level server that is accessible to those who want a self-hosted mail server, but who don't want to have to learn about all the complexities of email communications. This server is therefore intended to be the simplest to set up and use in production. Of all the James Servers, it has the least amount of dependencies and configurations. If you are not sure which of the James servers is best for you, you should probably choose this one. The default configuration of the Basic Server includes the following features: * Secure SMTP (SSL/TLS) over port 465 * Secure IMAP4 (SSL/TLS) over port 993 * Local Mailbox support ** Files are stored locally on the filesystem ** Optionally use a volume if you are a Docker or Kubernetes user * Multi-domain (virtual domain) support * Administration of users either via a command-line tool or the admin api We have disabled all of the insecure communications and require SSL. If you have a specific requirement to use an insecure protocol, or if the above list does not satisfy your needs, then after having successfully set up this server you may want to move on to the xref:extendable.adoc[Extendable Server]. ===================================================== == File: docs/modules/servers/pages/basic/conf/index.adoc ===================================================== = James Basic Mail Server Configuration :navtitle: Configuration (Work in progress.) //// == JIRA Issues * dnsservice.xml - DNS Service Configuration -> https://issues.apache.org/jira/browse/JAMES-3219 ** Status: to be removed * domainlist.xml - Domain List Configuration -> https://issues.apache.org/jira/browse/JAMES-3220 ** Status: to be removed * events.xml - Event system Configuration (Spring only) ** Status: Spring only, so n/a * fetchmail.xml- FetchMail Configuration (Spring only) ** Status: Spring only, so n/a * imapserver.xml - IMAP4 Configuration -> https://issues.apache.org/jira/browse/JAMES-3229 ** Status: * jmap.properties - JMAP Configuration (Guice only) -> https://issues.apache.org/jira/browse/JAMES-3230 ** Status: * lmtpserver.xml - LMTP Configuration -> https://issues.apache.org/jira/browse/JAMES-3231 ** Status: * mailrepositorystore.xml - Mail Repository Stores Configuration -> https://issues.apache.org/jira/browse/JAMES-3232 ** Status: * mailbox.xml - Mailbox Configuration (Spring only) ** Status: Spring only, so n/a * mailetcontainer.xml - Mailet Container Configuration -> https://issues.apache.org/jira/browse/JAMES-3233 ** Status: * pop3server.xml - POP3 Configuration -> https://issues.apache.org/jira/browse/JAMES-3234 ** Status: * mailbox.xml - Quota Configuration (Spring only) ** Status: Spring only, so n/a * recipientrewritetable.xml - Recipient Rewrite Table Configuration -> https://issues.apache.org/jira/browse/JAMES-3235 ** Status: * smtpserver.xml - SMTP Configuration -> https://issues.apache.org/jira/browse/JAMES-3236 ** Status: * usersrepository.xml - Users Configuration -> https://issues.apache.org/jira/browse/JAMES-3237 ** Status: * webadmin.properties - WebAdmin Configuration -> https://issues.apache.org/jira/browse/JAMES-3238 ** Status: * jmx.properties -> https://issues.apache.org/jira/browse/JAMES-3240 ** Status: * extensions.properties -> https://issues.apache.org/jira/browse/JAMES-3241 ** Status: * jwt_publickey -> https://issues.apache.org/jira/browse/JAMES-3242a ** Status: * healthcheck.properties -> https://issues.apache.org/jira/browse/JAMES-3243 ** Status: * listeners.xml -> https://issues.apache.org/jira/browse/JAMES-3244 ** Status: ===================================================== == File: docs/modules/servers/pages/basic/help.adoc ===================================================== = James Basic Server — Where to get help :navtitle: Help //// This information is based on the email discussion from here: --> https://www.mail-archive.com/server-dev@james.apache.org/msg66420.html However, I am not satisfied that I have properly captured the community's opinion, and there are only a few people who have contributed to the thread. Would be good to have some comments on this content. It could just be that I don't like the content. But if that is what the community thinks, then that is what we should write. //// //// Comment this out until there is agreement. == Warning Please note that if you want to try to use James, you are pretty much on your own. James is intended for use only by the current committers, or perhaps only by competent developers only who have the ability to understand the code as it exists now and can make changes themselves without any help. What you see is what you get. Take it or leave it. The James Community is made up of people who "scratch their own itch". If you have a problem with the code or the documentation, then please step up and fix it rather than asking for help. If you are a user who wants to try to use James, you should seriously consider hiring a professional organization to help you. Most likely, James is not for you. You can try filing issues, but there is absolutely no guarantee it will be fixed. If you are lucky and a developer has the same problem as you, then it may be fixed. Or if one of the developers is feeling particularly generous and wants to volunteer their valuable time to help you, it may happen. There is no way to know unless you try. On the other hand, the developers would **love** for you to do stuff that they are not interested in doing, like documentation. If you don't know anything about the code, it would be a good way to help out until you can eventually join the exclusive committer club, too. //// ===================================================== == File: docs/modules/servers/pages/basic/concepts.adoc ===================================================== = James Basic Server — Background Concepts :navtitle: Concepts Before embarking on your adventure with the **James Basic Server**, we highly recommend that you familiarize yourself with the following concepts: [TODO: provide links and ensure that articles exist for each of these topics] * xref:concepts:user/index.adoc[James User Model] * xref:concepts:protocols/smtp.adoc[SMTP] * xref:concepts:protocols/imap.adoc[IMAP] // What link should go here?? * Secured email communications * xref:concepts:/storage/index.adoc[Email storage] ===================================================== == File: docs/modules/servers/pages/basic/architecture.adoc ===================================================== = James Basic Server — Architecture :navtitle: Architecture (TODO) ===================================================== == File: docs/modules/servers/pages/basic/index.adoc ===================================================== = James Basic Mail Server :navtitle: Basic The **James Basic Server** is intended for xref:concepts:user/index.adoc#Operator[Operators] who are just getting initiated with operating their own xref:concepts/???[Self-Hosted] mail server. The server is intended to be a mostly "out-of-the-box" solution. With a few small interactions necessary to configure the system, you should be up and running in no time with all the standard features. These documents will present all the concepts that underpin this server, and will walk you through its installation and configuration. If you run into trouble, we explain how you can get help from the James Community. * xref:basic/context.adoc[The context of contemporary email] * xref:basic/objectives.adoc[Objectives and motivation of the Basic Server] * xref:basic/concepts.adoc[Useful background concepts] * xref:basic/architecture.adoc[Overview of architecture] * xref:basic/conf/index.adoc[Configuration] * xref:basic/help.adoc[Where to go for help] ===================================================== == File: docs/modules/servers/pages/basic/self-hosting.notes ===================================================== The name of the project is "Jame Self Hosting Sandbox", and I see the term "self hosting" in a few places... So it sounds like it is important, but what is that intended to mean? I would like to understand better the intention behind the term. I would say "self hosting" means individuals having bought a domain name and want to install their own mail server for hosting their personal emails. Volumetry is small. They want control on their data. One generally tricky point about this kind of set up is getting third parties (like eg GMail) trusting your setup. It would be important to document a checklist regarding Mail Exchange trust like: I'm not an open spam relay MX record registered for my domain Reverse DNS setted up for MX servers SPF records setted up DKIM signature setted up (which is slightly external to James as DNS setup is required) A "how to" regarding this is a MUST have in my opinion http://james.apache.org/howTo/index.html Just a thought based on the ideas you wrote here... But what if the mission of James were to "help people self-host their email" as an alternative to providers like gmail etc. Right now James is very obscure and is only for total tekkie geeks. If we modify the target, perhaps this could be the mission. The way of accomplishing this is: Provide in-depth "concept" articles Provide more "how tos" for important things Make James easier to install and operate wdyt? It would be more like: Apache James give you the ability to "self-host" email. Many companies and individuals are unable to develop their own mail infrastructure, but often feel trapped into using services like gmail, yahoo, etc. James provides a low-cost alternative for those who desire the freedom to use email the way they want. Or something like that. Apache James give you the ability to "self-host" email. Many companies and individuals are unable to develop their own mail infrastructure, but often feel trapped into using services like gmail, yahoo, etc. James provides a low-cost alternative for those who desire the freedom to use email the way they want. This should be the goal of the Basic server. Regarding "Advanced server": ===================================================== == File: docs/modules/servers/pages/run.adoc ===================================================== = Run James in Production :navtitle: Run James provides a number of *profiles* out of the box. These profiles have been tested and verified so you can get set up quickly with a production mail server that you can use with confidence. The available profiles are: * <<minimal,James Minimal Profile>> * <<basic,James Basic Profile>> * <<advanced,James Advanced Profile>> * <<distributed,James Distributed Profile>> [#minimal] == James Minimal Profile If you are not sure which profile you should be using, then you probably ought to be using the *James Minimal Profile*. This profile is intended to be the simplest to set up and use in production. It has the least amount of dependencies and complexities. If you do not yet have a huge amount of emails to process, then usually the simplicity is well worth the loss of some functionality. The last thing you need is to have to resolve difficult issues on a production server when you have not yet acquired the requisite knowledge to deal with those issues. Using the *James Minimal Profile* will help you reduce the risk of running into production issues. This profile is: * Suggested for use with smaller deployments * Appropriate for use by most operators * The preferred choice for most installations * Endowed with fewer dependencies, which makes it simpler and less risky to use in production * Only dependent on your local file system for data storage, so very easy to manage (TODO: Add link to details page) [#basic] == James Basic Profile This profile is intended to be relatively easy to use, but provides additional features with regards to data storage and management. Of course, these additional features come at the cost of more operational complexity. You will have to now deal with a relational database and all the fun that comes with it. However, if you are already an expert at relational database management, ===================================================== == File: docs/modules/servers/pages/index.adoc ===================================================== = Apache James Mail Servers :navtitle: Servers James offers five types of ready-made Mail Servers. The servers are intended for those with different needs, ranging from xref:concepts:user/index.adoc#Operators[Operators] who are interested in setting up a server for the first time, to experienced teams of xref:concepts:user/index.adoc#Developer[Developers] looking to deploy an advanced distributed system. Each of the servers has been tested and verified so you can deploy a production-grade xref:concepts/insert-link[Mail Server] with confidence. The available James Servers are: * <<demo,James Demo Mail Server>> * <<basic,James Basic Mail Server>> * <<extendable,James Extendable Mail Server>> * <<distributed,James Distributed Mail Server>> * <<postgres,James Postgres Mail Server>> * <<test,James Test Server>> If you are just checking out James for the first time, then we highly recommend investigating the servers in this order: . Initiate yourself with James by using the <<demo,Demo Server>> . Install the <<basic,Basic Server>> . If and only if the Basic Server is not enough, then try the <<extendable,Extendable Server>> [#demo] == James Demo Server The xref:demo.adoc[Demo Server] is intended for those who just want to give James a quick spin on their local machine to see what all the fuss is about. [#basic] == James Basic Mail Server If you just want to get up and running quickly, if you have very simple needs, or you want to try deploying a mail server for the first time, then the xref:basic/index.adoc[*Basic Server*] is the right choice for you. If you are not sure which server you should be using, then this server is probably the right choice. This server is intended to be the simplest to set up and use in production. It has the least amount of complexity and configurations to worry about. The last thing you need is to have to resolve difficult issues on a production server when you have not yet acquired the requisite knowledge to deal with those issues. Using the ===================================================== == File: docs/modules/servers/pages/postgres/architecture/mailqueue_combined_extend.adoc ===================================================== // 123 ===================================================== == File: docs/modules/servers/pages/postgres/architecture/consistency_model_data_replication_extend.adoc ===================================================== // ===================================================== == File: docs/modules/servers/pages/postgres/architecture/implemented-standards.adoc ===================================================== = Postgresql James server — Implemented standards :navtitle: Implemented standards :server-name: Postgresql James server include::partial$architecture/implemented-standards.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/architecture/specialized-instances.adoc ===================================================== = Postgresql James server — Specialized instances :navtitle: Specialized instances :server-name: Postgresql James server :specialized-instances-file-name: specialized-instances-postgres.png include::partial$architecture/specialized-instances.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/architecture/index.adoc ===================================================== = Postgresql James server — Architecture :navtitle: Architecture :backend-name: postgres :server-name: Postgresql James server :backend-storage-introduce: Postgresql is used for metadata storage. Postgresql is efficient for a very high workload. :storage-picture-file-name: storage_james_postgres.png :mailet-repository-path-prefix: postgres :xref-base: postgres :mailqueue-combined-extend: servers:postgres/architecture/mailqueue_combined_extend.adoc :mailqueue-combined-extend-backend: include::partial$architecture/index.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/architecture/consistency-model.adoc ===================================================== = Postgresql James server — Consistency Model :navtitle: Consistency Model :backend-name: postgres :backend-name-cap: Postgres :server-name: Postgresql James server :mailet-repository-path-prefix: postgres :xref-base: postgres :data_replication_extend: servers:postgres/architecture/consistency_model_data_replication_extend.adoc include::partial$architecture/consistency-model.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/extending.adoc ===================================================== = Postgres James Mail Server — Extending behaviour :navtitle: Extending behaviour This section can be read xref:customization:index.adoc[this page]. ===================================================== == File: docs/modules/servers/pages/postgres/objectives.adoc ===================================================== = Distributed James Server — Objectives and motivation :navtitle: Objectives and motivation From the outstanding advantages of a distributed mail system, such as scalability and enhancement, this project aims to implement a backend database version using Postgres. Primary Objectives: * Provide more options: The current James Distributed server uses Cassandra as the backend database. This project aims to provide an alternative to Cassandra, using Postgres as the backend database. This choice aims to offer a highly scalable and reactive James mail server, suitable for small to medium deployments, while the distributed setup remains more fitting for larger ones. * Propose an alternative to the jpa-app variant: The jpa-app variant is a simple version of James that uses JPA to store data and is compatible with various SQL databases. With the postgres-app, we use the `r2dbc` library to connect to the Postgres database, implementing non-blocking, reactive APIs for higher performance. * Leverage advanced Postgres features: Postgres is a powerful database that supports many advanced features. This project aims to leverage these features to improve the efficiency of the James server. For example, the implement https://www.postgresql.org/docs/current/ddl-rowsecurity.html[row-level security] to improve the security of the James server. * Flexible deployment: The new architecture allows flexible module choices. You can use Postgres directly for blob storage or use Object Storage (e.g Minio, S3...). ===================================================== == File: docs/modules/servers/pages/postgres/operate/metrics.adoc ===================================================== = Postgresql James Server — Metrics :navtitle: Metrics :other-metrics: Postgresql Java driver metrics :xref-base: postgres :server-name: Postgresql James Server include::partial$operate/metrics.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/security.adoc ===================================================== = Security checklist :navtitle: Security checklist :xref-base: postgres :backend-name: postgres include::partial$operate/security.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/webadmin/admin-messages-extend.adoc ===================================================== // The document only covers Postgres ===================================================== == File: docs/modules/servers/pages/postgres/operate/webadmin/admin-mailboxes-extend.adoc ===================================================== // The document only covers Postgres ===================================================== == File: docs/modules/servers/pages/postgres/operate/webadmin/admin-mail-queues-extend.adoc ===================================================== // The document only covers Postgres ===================================================== == File: docs/modules/servers/pages/postgres/operate/migrating.adoc ===================================================== = Postgresql James Server — Migrating existing data :navtitle: Migrating existing data :xref-base: postgres :server-name: Postgresql James Server include::partial$operate/migrating.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/logging/docker-compose-block.adoc ===================================================== [source,docker-compose] ---- version: "3" services: james: depends_on: - elasticsearch - postgres - rabbitmq - s3 image: apache/james:postgres-latest container_name: james hostname: james.local volumes: - ./extension-jars:/root/extension-jars - ./conf/logback.xml:/root/conf/logback.xml - ./logs:/root/logs ports: - "80:80" - "25:25" - "110:110" - "143:143" - "465:465" - "587:587" - "993:993" - "8080:8000" elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2 ports: - "9200:9200" environment: - discovery.type=single-node postgres: image: postgres:16.3 ports: - "5432:5432" environment: - POSTGRES_DB=james - POSTGRES_USER=james - POSTGRES_PASSWORD=secret1 rabbitmq: image: rabbitmq:3.13.3-management ports: - "5672:5672" - "15672:15672" ===================================================== == File: docs/modules/servers/pages/postgres/operate/guide.adoc ===================================================== = Postgresql James Server — Operator guide :navtitle: Operator guide :xref-base: postgres :mailet-repository-path-prefix: postgres :backend-name: postgres :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/master/server/apps/postgres-app/sample-configuration :server-name: Postgresql James Server include::partial$operate/guide.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/performanceChecklist.adoc ===================================================== = Postgresql James Server — Performance checklist :navtitle: Performance checklist :xref-base: postgres :backend-name: postgres include::partial$operate/performanceChecklist.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/webadmin.adoc ===================================================== = Postgresql James Server — WebAdmin REST administration API :navtitle: WebAdmin REST administration API :server-name: Postgresql James Server :xref-base: postgres :backend-name: postgres :admin-mail-queues-extend: servers:postgres/operate/webadmin/admin-mail-queues-extend.adoc :admin-messages-extend: servers:postgres/operate/webadmin/admin-messages-extend.adoc :admin-mailboxes-extend: servers:postgres/operate/webadmin/admin-mailboxes-extend.adoc include::partial$operate/webadmin.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/logging.adoc ===================================================== = Postgresql James Server — Logging :navtitle: Logging :xref-base: postgres :server-name: Postgresql James Server :server-tag: postgres :docker-compose-code-block-sample: servers:postgres/operate/logging/docker-compose-block.adoc :backend-name: postgres include::partial$operate/logging.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/index.adoc ===================================================== = Postgresql James Server — Operate the Distributed server :navtitle: Operate the Distributed server :xref-base: postgres :server-name: Postgresql James Server :server-tag: postgres include::partial$operate/index.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/operate/cli.adoc ===================================================== = Postgresql James Server — Command Line Interface :navtitle: Command Line Interface :xref-base: postgres :server-name: Postgresql James Server include::partial$operate/cli.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/benchmark/benchmark_prepare.adoc ===================================================== === Postgresql prepare benchmark ==== Install extension pg_stat_statements The `pg_stat_statements` extension provides a means for tracking execution statistics of all SQL statements executed by a server. The extension is useful for identifying high-traffic queries and for monitoring the performance of the server. For more information, see the [PostgreSQL documentation](https://www.postgresql.org/docs/current/pgstatstatements.html). To install the extension, connect to the database and run the following query: [source,sql] ---- create extension if not exists pg_stat_statements; alter system set shared_preload_libraries='pg_stat_statements'; -- restart postgres -- optional alter system set pg_stat_statements.max = 100000; alter system set pg_stat_statements.track = 'all'; ---- To reset statistics, use: `select pg_stat_statements_reset()`; The response fields that we are interested in are: - `query`: Text of a representative statement - `calls`: Number of times the statement was executed - `total_exec_time`, `mean_exec_time`, `min_exec_time`, `max_exec_time` To view the statistics, run the following query: ```sql select query, mean_exec_time, total_exec_time, calls from pg_stat_statements order by total_exec_time desc; ``` The result sample: image::postgres_pg_stat_statements.png[Storage responsibilities for the {server-name}] ===================================================== == File: docs/modules/servers/pages/postgres/benchmark/db-benchmark.adoc ===================================================== = Postgresql James server -- Database benchmarks :navtitle: Database benchmarks :backend-name: postgres :server-name: Postgresql James server :backend-database-extend-sample: PostgreSQL 16 as main database: 1 nodes (OVH instance, 2 CPU / 7 GB RAM, 160 GB SSD) include::partial$benchmark/db-benchmark.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/benchmark/james-benchmark.adoc ===================================================== = Postgresql James server benchmark :navtitle: James benchmarks :server-name: Postgresql James server :backend-database-extend-sample: PostgreSQL 16 as main database: 1 nodes (OVH instance, 2 CPU / 7 GB RAM, 160 GB SSD) :provision_file_url: https://github.com/apache/james-project/blob/d8225ed7c5ca8d79cde3b1c8755ee9ffcf462e29/server/apps/postgres-app/provision.sh :benchmark_prepare_extend: servers:postgres/benchmark/benchmark_prepare.adoc :james-imap-base-performance-picture: james-imap-base-performance-postgres.png include::partial$benchmark/james-benchmark.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/benchmark/index.adoc ===================================================== = Postgresql James server — Performance testing :navtitle: Performance testing the Postgresql James server :xref-base: postgres :server-name: Postgresql James server include::partial$benchmark/index.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/index.adoc ===================================================== = Postgres James Mail Server :navtitle: Distributed Postgres James Application The Postgres James server offers an easy way to scale email server. Based on SQL database solutions, here is https://www.postgresql.org/[Postgres]. Postgres is a powerful and versatile database server. Known for its advanced features, scalability, and robust performance, Postgres is the ideal choice for handling high-throughput and large data sets efficiently. Its row-level security ensures top-notch data protection, while the flexible architecture allows seamless integration with various storage and search solutions In this section of the documentation, we will introduce you to: * xref:postgres/objectives.adoc[Objectives and motivation of the Distributed Postgres Server] * xref:postgres/run/index.adoc[Run the Postgresql Server] ===================================================== == File: docs/modules/servers/pages/postgres/extending/index.adoc ===================================================== = Distributed James Postgres Server — Extending server behavior :navtitle: Extending server behavior ===================================================== == File: docs/modules/servers/pages/postgres/run/run-docker.adoc ===================================================== = Postgresql James Server — Run with docker :navtitle: Run with docker == Running via docker-compose Requirements: docker & docker-compose installed. When you try James this way, you will use the most current state of James. === Running with Postgresql only It will be configured to run with Postgresql. All those components will be started with a single command. You can retrieve the docker-compose file : ( docker-compose file and james image name should be changed) $ wget https://raw.githubusercontent.com/apache/james-project/master/server/apps/postgres-app/docker-compose.yml Then, you just have to start the services: $ docker-compose up -d Wait a few seconds in order to have all those services start up. You will see the following log when James is available: james | Started : true A default domain, james.local, has been created. You can see this by running: $ docker exec james james-cli -h 127.0.0.1 -p 9999 listdomains James will respond to IMAP port 143 and SMTP port 25. You have to create users before playing with james. You may also want to create other domains. Follow the xref:postgres/operate/cli.adoc['Useful commands'] section for more information about James CLI. === Running distributed James We also have a distributed version of the James postgresql app with: * OpenSearch as a search indexer * S3 as the object storage * RabbitMQ as the event bus To run it, simply type: $ docker compose -f docker-compose-distributed.yml up -d == Run with docker === Requirements ===================================================== == File: docs/modules/servers/pages/postgres/run/index.adoc ===================================================== = Postgresql James Server — Run :navtitle: Run This sections presents guidance to all current deployment types of Postgresql James Server. == Run with Java Build your own Apache James Postgresql artifacts and start xref:postgres/run/run-java.adoc[Running it directly on a Java Virtual Machine]. == Run with Docker We have prepared a docker-compose for Apache James to run with Postgresql & OpenSearch. You can start xref:postgres/run/run-docker.adoc[Running James with few simple Docker commands]. ===================================================== == File: docs/modules/servers/pages/postgres/run/run-java.adoc ===================================================== = Postgresql James Server — Run :navtitle: Run == Building === Requirements * Java 21 SDK * Maven 3 === Building the artifacts An usual compilation using maven will produce two artifacts into server/apps/postgres-app/target directory: * james-server-postgres-app.jar * james-server-postgres-app.lib You can for example run in the base of https://github.com/apache/james-project[this git repository]: .... mvn clean install .... == Running === Running James with Postgresql only ==== Requirements * Postgresql 16.0+ ==== James launch To run james, you have to create a directory containing required configuration files. James requires the configuration to be in a subfolder of working directory that is called conf. A https://github.com/apache/james-project/tree/master/server/apps/postgres-app/sample-configuration[sample directory] is provided with some default values you may need to replace. You will need to update its content to match your needs. Also you might need to add the files like in the https://github.com/apache/james-project/tree/master/server/apps/postgres-app/sample-configuration-single[sample directory] to not have OpenSearch indexing enabled by default for the search. You need to have a Postgresql instance running. You can either install the server or launch it via docker: [source,bash] ---- ===================================================== == File: docs/modules/servers/pages/postgres/configure/collecting-events.adoc ===================================================== = Event collection :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/collecting-events.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/matchers.adoc ===================================================== = Postgresql James Server — Matchers :navtitle: Matchers :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/matchers.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/mailets.adoc ===================================================== = Postgresql James Server — Mailets :navtitle: Mailets :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :server-name: Postgresql James server include::partial$configure/mailets.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/batchsizes.adoc ===================================================== = Postgresql James Server — batchsizes.properties :navtitle: batchsizes.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/batchsizes.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/smtp-hooks.adoc ===================================================== = Postgresql James Server — SMTP Hooks :navtitle: SMTP Hooks :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/smtp-hooks.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/domainlist.adoc ===================================================== = Postgresql James Server — domainlist.xml :navtitle: domainlist.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/domainlist.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/queue.adoc ===================================================== = Postgresql James Server — queue.properties :navtitle: queue.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/queue.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/dsn.adoc ===================================================== = Postgresql James Server — Delivery Submission Notifications :navtitle: ESMTP DSN setup :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: distributed :mailet-repository-path-prefix: postgres include::partial$configure/dsn.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/jmx.adoc ===================================================== = Postgresql James Server — jmx.properties :navtitle: jmx.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/jmx.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/tika.adoc ===================================================== = Postgresql James Server — tika.properties :navtitle: tika.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/tika.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/jvm.adoc ===================================================== = Postgresql James Server — jvm.properties :navtitle: jvm.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/jvm.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/jmap.adoc ===================================================== = Postgresql James Server — jmap.properties :navtitle: jmap.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :server-name: Postgresql James server :backend-name: Postgresql include::partial$configure/jmap.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/mailrepositorystore.adoc ===================================================== = Postgresql James Server — mailrepositorystore.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server :mailet-repository-path-prefix: postgres :mail-repository-protocol: postgres :mail-repository-class: org.apache.james.mailrepository.postgres.PostgresMailRepository include::partial$configure/mailrepositorystore.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/collecting-contacts.adoc ===================================================== = Contact collection :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/collecting-contacts.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/droplists.adoc ===================================================== = Postgresql James Server — DropLists :navtitle: DropLists :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres include::partial$configure/droplists.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/search.adoc ===================================================== = Postgresql James Server — Search configuration :navtitle: Search configuration :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/search.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/blobstore.adoc ===================================================== = Postgresql James Server — blobstore.properties :navtitle: blobstore.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres == BlobStore This file is optional. If omitted, the *postgres* blob store will be used. BlobStore is the dedicated component to store blobs, non-indexable content. James uses the BlobStore for storing blobs which are usually mail contents, attachments, deleted mails... You can choose the underlying implementation of BlobStore to fit with your James setup. It could be the implementation on top of Postgres or file storage service S3 compatible like Openstack Swift and AWS S3. Consult link:{sample-configuration-prefix-url}/blob.properties[blob.properties] in GIT to get some examples and hints. === Implementation choice *implementation* : * postgres: use cassandra based Postgres * objectstorage: use Swift/AWS S3 based BlobStore * file: (experimental) use directly the file system. Useful for legacy architecture based on shared ISCI SANs and/or distributed file system with no object store available. *deduplication.enable*: Mandatory. Supported value: true and false. If you choose to enable deduplication, the mails with the same content will be stored only once. WARNING: Once this feature is enabled, there is no turning back as turning it off will lead to the deletion of all the mails sharing the same content once one is deleted. Deduplication requires a garbage collector mechanism to effectively drop blobs. A first implementation based on bloom filters can be used and triggered using the WebAdmin REST API. See xref:{pages-path}/operate/webadmin.adoc#_running_blob_garbage_collection[Running blob garbage collection]. In order to avoid concurrency issues upon garbage collection, we slice the blobs in generation, the two more recent generations are not garbage collected. *deduplication.gc.generation.duration*: Allow controlling the duration of one generation. Longer implies better deduplication but deleted blobs will live longer. Duration, defaults on 30 days, the default unit is in days. *deduplication.gc.generation.family*: Every time the duration is changed, this integer counter must be incremented to avoid conflicts. Defaults to 1. ===================================================== == File: docs/modules/servers/pages/postgres/configure/extensions.adoc ===================================================== = Postgresql James Server — extensions.properties :navtitle: extensions.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres include::partial$configure/extensions.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/sieve.adoc ===================================================== = Sieve :navtitle: Sieve :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/sieve.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/listeners.adoc ===================================================== = Postgresql James Server — listeners.xml :navtitle: listeners.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :server-name: Postgresql James server include::partial$configure/listeners.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/vault.adoc ===================================================== = Postgresql James Server — deletedMessageVault.properties :navtitle: deletedMessageVault.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server :backend-name: Postgresql include::partial$configure/vault.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/imap.adoc ===================================================== = Postgresql James Server — imapserver.xml :navtitle: imapserver.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres include::partial$configure/imap.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/ssl.adoc ===================================================== = Postgresql James Server — SSL & TLS configuration :navtitle: SSL & TLS configuration :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/ssl.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/smtp.adoc ===================================================== = Postgresql James Server — smtpserver.xml :navtitle: smtpserver.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/smtp.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/mailetcontainer.adoc ===================================================== = Postgresql James Server — mailetcontainer.xml :navtitle: mailetcontainer.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres include::partial$configure/mailetcontainer.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/webadmin.adoc ===================================================== = Postgresql James Server — webadmin.properties :navtitle: webadmin.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/webadmin.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/recipientrewritetable.adoc ===================================================== = Postgresql James Server — recipientrewritetable.xml :navtitle: recipientrewritetable.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/recipientrewritetable.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/rabbitmq.adoc ===================================================== = Postgresql James Server — rabbitmq.properties :navtitle: rabbitmq.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/rabbitmq.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/spam.adoc ===================================================== = Postgresql James Server — Anti-Spam configuration :navtitle: Anti-Spam configuration :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server :mailet-repository-path-prefix: postgres include::partial$configure/spam.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/remote-delivery-error-handling.adoc ===================================================== = Postgresql James Server — About RemoteDelivery error handling :navtitle: About RemoteDelivery error handling :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server :mailet-repository-path-prefix: postgres include::partial$configure/remote-delivery-error-handling.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/index.adoc ===================================================== = Postgresql James Server — Configuration :navtitle: Configuration This section presents how to configure the Postgresql James server. The Postgresql James Server relies on separated files for configuring various components. Some files follow a *xml* format and some others follow a *property* format. Some files can be omitted, in which case the functionality can be disabled, or rely on reasonable defaults. The following configuration files are exposed: :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :xref-base: postgres/configure :server-name: Postgresql James server include::partial$configure/forProtocolsPartial.adoc[] include::partial$configure/forStorageDependenciesPartial.adoc[] include::partial$configure/forCoreComponentsPartial.adoc[] include::partial$configure/forExtensionsPartial.adoc[] include::partial$configure/systemPropertiesPartial.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/dns.adoc ===================================================== = Postgresql James Server — dnsservice.xml :navtitle: dnsservice.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/dns.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/redis.adoc ===================================================== = Postgresql James Server — redis.properties :navtitle: redis.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/redis.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/healthcheck.adoc ===================================================== = Postgresql James Server — healthcheck.properties :navtitle: healthcheck.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/healthcheck.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/usersrepository.adoc ===================================================== = Postgresql James Server — usersrepository.xml :navtitle: usersrepository.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration include::partial$configure/usersrepository.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/opensearch.adoc ===================================================== = Postgresql James Server — opensearch.properties :navtitle: opensearch.properties :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server :package-tag: postgres include::partial$configure/opensearch.adoc[] ===================================================== == File: docs/modules/servers/pages/postgres/configure/pop3.adoc ===================================================== = Postgresql James Server — pop3server.xml :navtitle: pop3server.xml :sample-configuration-prefix-url: https://github.com/apache/james-project/blob/postgresql/server/apps/postgres-app/sample-configuration :pages-path: postgres :server-name: Postgresql James server include::partial$configure/pop3.adoc[] ===================================================== == File: docs/modules/servers/partials/architecture/implemented-standards.adoc ===================================================== This page details standards implemented by the {server-name}. == Message formats - link:https://datatracker.ietf.org/doc/html/rfc5322[RFC-5322] Internet Message Format (MIME) - link:https://datatracker.ietf.org/doc/html/rfc2045[RFC-2045] Format of Internet Message Bodies - link:https://datatracker.ietf.org/doc/html/rfc3464[RFC-3464] An Extensible Message Format for Delivery Status Notifications - James allow emmit DSNs from the mailet container. - link:https://datatracker.ietf.org/doc/html/rfc8098[RFC-8098] Message Disposition Notification == TLS & authentication - link:https://datatracker.ietf.org/doc/html/rfc2595.html[RFC-2595] TLS for IMAP, POP3, SMTP (StartTLS) - link:https://datatracker.ietf.org/doc/html/rfc8314.html[RFC-8314] Implicit TLS - link:https://www.rfc-editor.org/rfc/rfc4959.html[RFC-4959] SASL IR: Initial client response - link:https://datatracker.ietf.org/doc/html/rfc4616[RFC-4616] SASL plain authentication - link:https://datatracker.ietf.org/doc/html/rfc8314.html[RFC-7628] SASL for OAUTH - Implemented for IMAP and SMTP - Support for OIDC standard only. == SMTP - link:https://datatracker.ietf.org/doc/html/rfc5321[RFC-5321] SMTP Protocol - link:https://datatracker.ietf.org/doc/html/rfc974[RFC-974] MAIL ROUTING AND THE DOMAIN SYSTEM - link:https://www.rfc-editor.org/rfc/rfc3461[RFC-3461] Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery Status Notifications (DSNs) - Requires extra configuration. - link:https://datatracker.ietf.org/doc/html/rfc1652[RFC-1652] SMTP Service Extension for 8bit-MIME transport - link:https://datatracker.ietf.org/doc/html/rfc1830[RFC-1830] SMTP Service Extensions for Transmission of Large and Binary MIME Messages - link:https://datatracker.ietf.org/doc/html/rfc1869[RFC-1869] SMTP Service Extensions - link:https://datatracker.ietf.org/doc/html/rfc1870[RFC-1870] SMTP Service Extension for Message Size Declaration - link:https://datatracker.ietf.org/doc/html/rfc1891[RFC-1891] SMTP Service Extension for Delivery Status Notifications - link:https://datatracker.ietf.org/doc/html/rfc1893[RFC-1893] Enhanced Mail System Status Codes - link:https://datatracker.ietf.org/doc/html/rfc2034[RFC-2034] SMTP Service Extension for Returning Enhanced Error Codes - link:https://datatracker.ietf.org/doc/html/rfc2142[RFC-2142] Mailbox Names For Common Services, Roles And Functions - link:https://datatracker.ietf.org/doc/html/rfc2197[RFC-2197] SMTP Service Extension for Command Pipelining - link:https://datatracker.ietf.org/doc/html/rfc2554[RFC-2554] ESMTP Service Extension for Authentication - link:https://datatracker.ietf.org/doc/rfc6710/[RFC-6710] SMTP Extension for Message Transfer Priorities - link:https://datatracker.ietf.org/doc/rfc8689/[RFC-8689] SMTP Require TLS Option - link:https://datatracker.ietf.org/doc/html/rfc1893[RFC-1893] Enhanced Mail System Status Codes == LMTP - link:https://james.apache.org/server/rfclist/lmtp/rfc2033.txt[RFC-2033] LMTP Local Mail Transfer Protocol == IMAP The following IMAP specifications are implemented: - link:https://datatracker.ietf.org/doc/html/rfc3501.html[RFC-3501] INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1 - link:https://datatracker.ietf.org/doc/html/rfc2177.html[RFC-2177] IMAP IDLE (mailbox scoped push notifications) ===================================================== == File: docs/modules/servers/partials/architecture/specialized-instances.adoc ===================================================== While it is perfectly possible to deploy homogeneous James instances, with the same configuration and thus the same protocols and the same responsibilities one might want to investigate in 'Specialized instances'. This deployment topology consists of {server-name} with heterogeneous configurations on top of shared databases. Groups of James servers will thus handle various protocols and have different responsibilities. This approach limits cascading failures across protocols and services. Think of *OutOfMemoryErrors*, CPUs starvation, {backend-name} driver issue, etc. However, we can't speak of microservices here: all James instances runs the same code, James is still a monolith, and databases need to be shared across instances. image::{specialized-instances-file-name}[Example of Specialized instances topology] We speak of: - **Front-line servers** serves protocols. James enables to easily turn protocols on and off. Typically, each protocol would be isolated in its own group of James instances: james-imap, james-jmap, james-smtp, james-webadmin, etc... Refer to protocols configuration files to learn more. - **Back-office servers** handles other services like: - Mail processing. - Remote delivery. - Event processing. - Task execution. Front-line servers will likely not handle back office responsibilities (but be sure to have back-office servers that do!). - xref:{xref-base}/configure/mailetcontainer.adoc[Mail processing can be switched off]. - xref:{xref-base}/configure/listeners.adoc[Mailbox event processing can be switched off]. - xref:{xref-base}/configure/rabbitmq.adoc[Task execution can be switched off]. - Remote Delivery service is not started if the RemoteDelivery mailet is not positioned in mailetcontainer.xml. Of course, the above instances can be collocated at will, to reach some intermediate deployments with fewer instances to mitigate costs. ===================================================== == File: docs/modules/servers/partials/architecture/index.adoc ===================================================== This sections presents the {server-name} architecture. == Storage In order to deliver its promises, the {server-name} leverages the following storage strategies: image::{storage-picture-file-name}[Storage responsibilities for the {server-name}] * {backend-storage-introduce} * The *blob store* storage interface is responsible for storing potentially large binary data. For instance email bodies, headers or attachments. Different technologies can be used: *{backend-name}*, or S3 compatible *Object Storage* (S3 or Swift). * *OpenSearch* component empowers full text search on emails. It also enables querying data with unplanned access patterns. OpenSearch throughput do not however match the one of {backend-name} thus its use is avoided upon regular workloads. * *RabbitMQ* enables James nodes of a same cluster to collaborate together. It is used to implement connected protocols, notification patterns as well as distributed resilient work queues and mail queue. * *Tika* (optional) enables text extraction from attachments, thus improving full text search results. * *link:https://spamassassin.apache.org/[SpamAssassin] or link:https://rspamd.com/[Rspamd]* (optional) can be used for Spam detection and user feedback is supported. xref:{xref-base}/architecture/consistency-model.adoc[This page] further details {server-name} consistency model. == Protocols The following protocols are supported and can be used to interact with the {server-name}: * *SMTP* * *IMAP* * xref:{xref-base}/operate/webadmin.adoc[WebAdmin] REST Administration API * *LMTP* * *POP3* The following protocols should be considered experimental: * *JMAP* (RFC-8620 &RFC-8621 specifications and known limitations of the James implementation are defined link:https://github.com/apache/james-project/tree/master/server/protocols/jmap-rfc-8621/doc[here]) * *ManagedSieve* Read more on xref:{xref-base}/architecture/implemented-standards.adoc[implemented standards]. == Topology While it is perfectly possible to deploy homogeneous James instances, with the same configuration and thus the same protocols and the same responsibilities one might want to investigate in xref:{xref-base}/architecture/specialized-instances.adoc['Specialized instances']. == Components This section presents the various components of the {server-name}, providing context about their interactions, and about their implementations. === High level view ===================================================== == File: docs/modules/servers/partials/architecture/consistency-model.adoc ===================================================== This page presents the consistency model used by the {server-name} and points to the tools built around it. == Data Replication The {server-name} relies on different storage technologies, all having their own consistency models. These data stores replicate data in order to enforce some level of availability. By consistency, we mean the ability for all replica to hold the same data. By availability, we mean the ability for a replica to answer a request. In distributed systems, link:https://en.wikipedia.org/wiki/CAP_theorem[according to the CAP theorem], as we will necessarily encounter network partitions, then trade-offs need to be made between consistency and availability. This section details this trade-off for data stores used by the {server-name}. === OpenSearch consistency model OpenSearch relies on link:https://opensearch.org/docs/latest/tuning-your-cluster/[strong consistency] with home-grown algorithm. The 2.x release line, that the distributed server is using, is known to provide faster recovery. Be aware that data is asynchronously indexed in OpenSearch, changes will be eventually visible. === RabbitMQ consistency model The {server-name} can be set up to rely on a RabbitMQ cluster. All queues can be set up in an high availability fashion using link:https://www.rabbitmq.com/docs/quorum-queues[quorum queues] - those are replicated queues using the link:https://raft.github.io/[RAFT] consensus protocol and thus are strongly consistent. include::{data_replication_extend}[] == Consistency across data stores The {server-name} leverages several data stores: - {backend-name} is used for metadata storage - OpenSearch for search - Object Storage for large object storage Thus the {server-name} also offers mechanisms to enforce consistency across data stores. === Write path organisation The primary data stores are composed of {backend-name} for metadata and Object storage for binary data. ===================================================== == File: docs/modules/servers/partials/IsOverQuota.adoc ===================================================== === IsOverQuota This matcher will check if the incoming email will make recipients exceed their quotas. Here is a configuration example: .... <mailet match="IsOverQuota" class="<any-class>"/> .... ===================================================== == File: docs/modules/servers/partials/HasHeaderWithPrefix.adoc ===================================================== === HasHeaderWithPrefix Matches emails with headers having a given prefix. If a header with the given prefix is found in the message (global) all recipients will be matched. If a header with the given prefix is found per recipient (specific), only these will be matched. Otherwise, no recipient in returned. use: .... <mailet match="HasHeaderWithPrefix=PREFIX" class="..." /> .... ===================================================== == File: docs/modules/servers/partials/ManageSieveMailet.adoc ===================================================== === Manage Sieve scripts via a mailet Each user can manage his SIEVE scripts through the `ManageSieveMailet` mailet. To use the manage SIEVE mailet : * You need to create the user sievemanager@DOMAIN ( if you don't, the SMTP server will check the domain, recognize it, and look for an absent local user, and will generate an error ). * You can send Manage Sieve commands by mail to sievemanager@DOMAIN. Your subject must contain the command. Scripts need to be added as attachments and need the ".sieve" extension. To activate a script for a user, you need the following combination : * PUTSCRIPT scriptname * SETACTIVE scriptname ===================================================== == File: docs/modules/servers/partials/AddFooter.adoc ===================================================== === AddFooter Takes the message and attaches a footer message to it. Right now, it only supports simple messages. Needs to have additions to make it support messages with alternate content types or with attachments. ===================================================== == File: docs/modules/servers/partials/FileRegexMatcher.adoc ===================================================== === FileRegexMatcher Initializes RegexMatcher with regular expressions from a file. ===================================================== == File: docs/modules/servers/partials/AtMostPriority.adoc ===================================================== === AtMostPriority Numeric value. The priority of this mail should be at most the specified value to be matched. Inclusive. ===================================================== == File: docs/modules/servers/partials/RecipientToLowerCase.adoc ===================================================== === RecipientToLowerCase GenericMailet which convert all Recipients to lowercase. ===================================================== == File: docs/modules/servers/partials/MailToAllUsers.adoc ===================================================== === MailToAllUsers A mailet that helps to email to all users in the system. ==== Sample configuration [source,xml] ---- <matcher name="notify-matcher" match="org.apache.james.mailetcontainer.impl.matchers.And"> <matcher match="SenderIs=admin@gov.org"/> <matcher match="RecipientIs=all@gov.org"/> </matcher> <mailet match="notify-matcher" class="MailToAllUsers"/> ---- ===================================================== == File: docs/modules/servers/partials/Expires.adoc ===================================================== === Expires Sanitizes or adds an expiration date to a message, in the form of an `Expires` header (RFC 4021). The mailet can force an existing expiration date to be within the bounds given by `minAge`, `maxAge`, or both. `minAge` specifies the minimum time the date must lie in the future, while `maxAge` specifies a maximum. If a message has no expiration date, the mailet can add one according to the optional `defaultAge` parameter. All parameter values should be expressed in the following format: `Nunit`. `N` should be positive. `unit` could be either in the short form (`h`, `d`, `w`, `y` etc.), or in the long form (`hours`, days`, `weeks`, `months`, `years`). The default unit is `days`. Sample configuration: .... <mailet match="All" class="Expires"> <minAge>12h</minAge> <defaultAge>7d</defaultAge> <maxAge>8w</maxAge> </mailet> .... By itself the `Expires` header is informational only. But some variants of James will let you delete expired messages through the xref:distributed/operate/webadmin.adoc#_administrating_messages[WebAdmin] interface: .... curl -XDELETE http://ip:port/messages?byExpiresHeader .... ===================================================== == File: docs/modules/servers/partials/AmqpForwardAttribute.adoc ===================================================== === AmqpForwardAttribute This mailet forwards the attributes values to a AMPQ. It takes 4 parameters: * attribute (mandatory): content to be forwarded, expected to be a Map<String, byte[]> where the byte[] content is issued from a MimeBodyPart. It is typically generated from the StripAttachment mailet. * uri (mandatory): AMQP URI defining the server where to send the attachment. High availability is supported with a coma separated list of uris, whost and credentials are taken from the first URI specified. * exchange (mandatory): name of the AMQP exchange. * exchange_type (optional, default to "direct"): type of the exchange. Can be "direct", "fanout", "topic", "headers". * routing_key (optional, default to empty string): name of the routing key on this exchange. This mailet will sent the data attached to the mail as an attribute holding a map. ===================================================== == File: docs/modules/servers/partials/LogMessage.adoc ===================================================== === LogMessage Logs Message Headers and/or Body. If the "passThrough" in confs is true the mail will be left untouched in the pipe. If false will be destroyed. Default is true. ===================================================== == File: docs/modules/servers/partials/ClamAVScan.adoc ===================================================== === ClamAVScan Does an antivirus scan check using a ClamAV daemon (CLAMD) Interacts directly with the daemon using the "stream" method, which should have the lowest possible overhead. The CLAMD daemon will typically reside on *localhost*, but could reside on a different host. It may also consist on a set of multiple daemons, each residing on a different server and on different IP number. In such case a DNS host name with multiple IP addresses (round-robin load sharing) is supported by the mailet (but on the same port number). Handles the following init parameters: * *<debug>* * *<host>*: the host name of the server where CLAMD runs. It can either be a machine name, such as "*java.sun.com*", or a textual representation of its IP address. If a literal IP address is supplied, only the validity of the address format is checked. If the machine name resolves to multiple IP addresses, *round-robin load sharing* will be used. The default is *localhost*. * *<port>*: the port on which CLAMD listens. The default is *3310*. * *<maxPings>*: the maximum number of connection retries during startup. If the value is *0* no startup test will be done. The default is *6*. * *<pingIntervalMilli>*: the interval (in milliseconds) between each connection retry during startup. The default is *30000* (30 seconds). * *<streamBufferSize>*: the BufferedOutputStream buffer size to use writing to the *stream connection*. The default is *8192*. The actions performed are as follows: * During initialization: * Gets all *config.xml* parameters, handling the defaults; * resolves the *<host>* parameter, creating the round-robin IP list; * connects to CLAMD at the first IP in the round-robin list, on the specified *<port>*; * if unsuccessful, retries every *<pingIntervalMilli>* milliseconds up to *<maxPings>* times; * sends a *PING* request; * waits for a *PONG* answer; * repeats steps 3-6 for every other IP resolved. * For every mail ===================================================== == File: docs/modules/servers/partials/MailAttributesToMimeHeaders.adoc ===================================================== === MailAttributesToMimeHeaders Convert attributes of type Collection<String> to headers Sample configuration: .... <mailet match="All" class="MailAttributesToMimeHeaders"> <simplemapping>org.apache.james.attribute1;headerName1</simplemapping> <simplemapping>org.apache.james.attribute2;headerName2</simplemapping> </mailet> .... ===================================================== == File: docs/modules/servers/partials/RemoveMimeHeader.adoc ===================================================== === RemoveMimeHeader Remove mime headers from the message (global) and per recipient (specific). Sample configuration: .... <mailet match="All" class="RemoveMimeHeader"> <name>header1,header2</name> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SenderIsNull.adoc ===================================================== === SenderIsNull Matches mails that are sent by a null sender. .... <mailet match="SenderIsNull" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/SerialiseToHTTP.adoc ===================================================== === SerialiseToHTTP Serialise the email and pass it to an HTTP call Sample configuration: .... <mailet match="All" class="SerialiseToHTTP"> <name>URL</name> <value>url where serialised message will be posted</value> <name>ParameterKey</name> <value>An arbitrary parameter be added to the post</value> <name>ParameterValue</name> <value>A value for the arbitrary parameter</value> <name>MessageKeyName</name> <value>Field name for the serialised message</value> <name>passThrough</name> <value>true or false</value> </mailet> .... ===================================================== == File: docs/modules/servers/partials/ClassifyBounce.adoc ===================================================== === ClassifyBounce Assesses the message to determine if it was a hard or soft bounce, and if it was a soft bounce, something of its nature.. Sample configuration: .... <mailet match="All" class="ClassifyBounce"> <headerName>X-MailetHeader</headerName> </mailet> .... ===================================================== == File: docs/modules/servers/partials/IsSMIMESigned.adoc ===================================================== === IsSMIMESigned Checks if a mail is smime encrypted. ===================================================== == File: docs/modules/servers/partials/SubjectIs.adoc ===================================================== === SubjectIs Matches mail where the subject is contained in a configurable list. ===================================================== == File: docs/modules/servers/partials/ToPlainText.adoc ===================================================== === ToPlainText This mailet converts HTML parts of a message into Plain text. It starts looking for multipart/alternative containing a text/plain and a text/html part and only keep the text/plain part. Then in a second pass replaces remaining text/html by their textual content, infered by parsing the HTML content and handling common tags. Eg: ---- <mailet matcher="All" class="ToPlainText"/> ---- ===================================================== == File: docs/modules/servers/partials/WithStorageDirective.adoc ===================================================== === WithStorageDirective WithStorageDirective position storage directive for the recipients of this email. These directives are used by <strong>LocalDelivery</strong> mailet when adding the email to the recipients mailboxes. The following storage directives can be set: * targetFolderNames: the folders to append the email in. Defaults to none (INBOX). Coma separated list of folder names. Fallback to targetFolderName. * targetFolderName: the folder to append the email in. Defaults to none (INBOX). * seen: boolean, whether the message should be automatically marked as seen. Defaults to false. * important: boolean, whether the message should be automatically marked as important. Defaults to false. * keywords: set of string, encoded as a string (value are coma separated). IMAP user flags to set for the message. Defaults to none Example: .... <mailet match="IsMarkedAsSpam" class="WithStorageDirective"> <targetFolderName>Spam</targetFolderName> <seen>true</seen> <important>true</important> <keywords>keyword1,keyword2</keywords> </mailet> .... Alternatively, several target folders can be specified: .... <mailet match="IsMarkedAsSpam" class="WithStorageDirective"> <targetFolderNames>Important, INBOX</targetFolderNames> <seen>true</seen> <important>true</important> <keywords>keyword1,keyword2</keywords> </mailet> .... ===================================================== == File: docs/modules/servers/partials/IsSMIMEEncrypted.adoc ===================================================== === IsSMIMEEncrypted Checks if a mail is smime encrypted. ===================================================== == File: docs/modules/servers/partials/AtMost.adoc ===================================================== === AtMost Checks that a mail did at most X executions on a specific operation. If no executions have been performed previously for Y attribute, it will be set up. In the mail, every time the check succeeds, its counter will be incremented by one. The check fails when the defined X limit is reached. * X - count of how many times a specific operation is performed * Y - name of attribute represented for specific operation executions, default value is: *AT_MOST_EXECUTIONS* The example below will match a mail with at most 3 executions on the mailet with attribute name *AT_MOST_EXECUTIONS* .... <mailet match="AtMost=AT_MOST_EXECUTIONS:3" class="<any-class>"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/ExtractMDNOriginalJMAPMessageId.adoc ===================================================== === ExtractMDNOriginalJMAPMessageId This mailet handles MDN messages and define a header X-JAMES-MDN-JMAP-MESSAGE-ID referencing the original message (by its Jmap Id) asking for the recipient to send an MDN. ===================================================== == File: docs/modules/servers/partials/RecipientRewriteTable.adoc ===================================================== === RecipientRewriteTable Mailet which should get used when using RecipientRewriteTable-Store to implementations for mappings of forwards and aliases. By specifying an 'errorProcessor' you can specify your logic upon RecipientRewriteTable failures. Example: .... <mailet match="All" class="RecipientRewriteTable"> <errorProcessor>rrt-errors</errorProcessor> </mailet> .... The *rewriteSenderUponForward* option (default to true) can be used to prevent senders to be rewritten upon forwards in the transport envelope (JAMES 3.8.0 default behaviour). *WARNING*: Please note that not rewriting the sender will cause issues forwarding emails from external senders to external addresses as the DKIM and SPF records will not be matching the ones of the sending domain. The *forwardAutoSubmittedEmails* option (default to false) can be used to prevent forwarding bounces as such a scenario can lead to an infinite loop if the forward recipient bounces the email. ===================================================== == File: docs/modules/servers/partials/RecipientIsLocal.adoc ===================================================== === RecipientIsLocal Matches mail where the recipient is local. ===================================================== == File: docs/modules/servers/partials/RemoveMimeHeaderByPrefix.adoc ===================================================== === RemoveMimeHeader This mailet removes all of the headers starting with a given prefix in the message (global) and per recipient (specific). Sample configuration: .... <mailet match="All" class="RemoveMimeHeaderByPrefix"> <name>X-APPLICATIVE-HEADER-</name> </mailet> .... ===================================================== == File: docs/modules/servers/partials/ConvertTo7Bit.adoc ===================================================== === ConvertTo7Bit Make sure the message stream is 7bit. Every 8bit part is encoded to quoted-printable or base64 and the message is saved. ===================================================== == File: docs/modules/servers/partials/HostIs.adoc ===================================================== === HostIs Matches mail to given hosts. ===================================================== == File: docs/modules/servers/partials/UserIs.adoc ===================================================== === UserIs Matches mail where the user is contained in a configurable list. ===================================================== == File: docs/modules/servers/partials/XOriginatingIpInNetwork.adoc ===================================================== === XOriginatingIpInNetwork Checks the first X_ORIGINATING_IP IP address against a comma-delimited list of IP addresses, domain names or sub-nets. See AbstractNetworkMatcher for details on how to specify entries. ===================================================== == File: docs/modules/servers/partials/ICalendarParser.adoc ===================================================== === ICalendarParser This mailet can be combined with the Strip attachment mailet. The ICS body part byte array is arranged as map then this mailet should look for ICS and parse it with Ical4J then store it as a mail attribute Configuration: The mailet contains 2 mandatory attributes .... <mailet match="All" class="ICalendarParser" > <sourceAttribute>source.attribute.name</sourceAttribute> <!-- The attribute which contains output value of StripAttachment mailet -- > <destAttribute>dest.attribute.name</destAttribute> <!-- The attribute store the map of Calendar -- > </mailet > .... ===================================================== == File: docs/modules/servers/partials/HasPriority.adoc ===================================================== === HasPriority Numeric value. The priority of this mail should be equal to the specified value to be matched. ===================================================== == File: docs/modules/servers/partials/LocalDelivery.adoc ===================================================== === LocalDelivery Receives a Mail from the Queue and takes care of delivery of the message to local inboxes. ===================================================== == File: docs/modules/servers/partials/NESSpamCheck.adoc ===================================================== === NESSpamCheck This is based on a sample filter.cfg for a Netscape Mail Server to stop spam. ===================================================== == File: docs/modules/servers/partials/SPF.adoc ===================================================== === SPF Check the ip, sender, helo against SPF. Add the following attributes to the mail object: .... org.apache.james.transport.mailets.spf.explanation org.apache.james.transport.mailets.spf.result .... Sample configuration: .... <mailet match="All" class="SPF"> <addHeader>true</addHeader> <debug>false</debug> </mailet> .... ===================================================== == File: docs/modules/servers/partials/TextCalendarBodyToAttachment.adoc ===================================================== === TextCalendarBodyToAttachment This mailet converts Content-Type of MimeMessage from text/calendar to mulitpart/mixed The BodyPart should be retrieved from content of text/calendar with all the same "Content-*" headers from original message and those "Content-" header are removed from original message It does not takes any parameter Sample configuration: .... <mailet match="All" class="TextCalendarBodyToAttachment"/> .... ===================================================== == File: docs/modules/servers/partials/WithPriority.adoc ===================================================== === WithPriority This mailet sets the priority of the incoming mail. Example configuration: .... <mailet match="All" class="WithPriority"> <priority>7</priority> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SpamAssassin.adoc ===================================================== === SpamAssassin Sends the message through daemonized SpamAssassin (spamd), visit http://spamassassin.apache.org[spamassassin.apache.org] for info on configuration. The header X-Spam-Status is added to every message, this contains the score and the threshold score for spam (usually 5.0). If the message exceeds the threshold, the header X-Spam-Flag will be added with the value of YES. The default host for spamd is localhost and the default port is 783. .... org.apache.james.spamassassin.status - Holds the status org.apache.james.spamassassin.flag - Holds the flag .... Sample Configuration: .... <mailet notmatch="SenderHostIsLocal" class="SpamAssassin"> <spamdHost>localhost</spamdHost> <spamdPort>783</spamdPort> </mailet> .... ===================================================== == File: docs/modules/servers/partials/Forward.adoc ===================================================== === Forward Replaces incoming recipients with those specified, and resends the message unaltered. Can be totally replaced by an equivalent usage of {@link Resend} (see below), simply replacing *<forwardto>* with *<recipients>*. Sample configuration: .... <mailet match="All" class="Forward"> <forwardTo>*comma delimited list of email addresses*</forwardTo> <passThrough>*true or false, default=false*</passThrough> <fakeDomainCheck>*true or false, default=true*</fakeDomainCheck> <debug>*true or false, default=false*</debug> </mailet> .... The behaviour of this mailet is equivalent to using Resend with the following configuration: .... <mailet match="All" class="Resend"> <forwardTo>comma delimited list of email addresses</recipients> <passThrough>true or false</passThrough> <fakeDomainCheck>*true or false*</fakeDomainCheck> <debug>*true or false*</debug> </mailet> .... *forwardto* can be used instead of *forwardTo*; such name is kept for backward compatibility. ===================================================== == File: docs/modules/servers/partials/RecipientDomainIs.adoc ===================================================== === RecipientDomainIs This will return recipients matching a configured domain. Sample configuration: .... <mailet match="RecipientDomainIs=<domain.com>" class="<any-class>"/> .... ===================================================== == File: docs/modules/servers/partials/SMTPIsAuthNetwork.adoc ===================================================== === SMTPIsAuthNetwork Matches mails that are sent by a client which is allowed to relay. .... <mailet match="SMTPIsAuthNetwork" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/HasMailAttributeWithValueRegex.adoc ===================================================== === HasMailAttributeWithValueRegex This Matcher determines if the mail contains the attribute specified in the condition and that attribute matches the supplied regular expression, it returns all recipients if that is the case. Sample configuration: .... <mailet match="HasMailAttributeWithValueRegex=whatever,<regex>" class="<any-class>"> .... Note: as it is not possible to put arbitrary objects in the configuration, toString() is called on the attribute value, and that is the value matched against. ===================================================== == File: docs/modules/servers/partials/ReplaceContent.adoc ===================================================== === ReplaceContent Replace text contents This mailet allow to specific regular expression to replace text in subject and content. Each expression is defined as: */REGEX_PATTERN/SUBSTITUTION_PATTERN/FLAGS/* * *REGEX_PATTERN* is a regex used for the match * *SUBSTITUTION_PATTERN* is a substitution pattern * *FLAGS* flags supported for the pattern: ** i: case insensitive ** m: multi line ** x: extended (N/A) ** r: repeat - keep matching until a substitution is possible To identify subject and body pattern we use the tags <subjectPattern> and <bodyPattern> Rules can be specified in external files. Lines must be CRLF terminated and lines starting with # are considered comments. Tags used to include external files are <subjectPatternFile> and <bodyPatternFile> If file path starts with # then the file is loaded as a resource. Use of both files and direct patterns at the same time is allowed. This mailet allow also to enforce the resulting charset for messages processed, when a replacement has been done. To do that the tag <charset> must be specified. NOTE: Regexp rules must be escaped by regexp escaping rules and applying this 2 additional rules: - "/" char inside an expression must be prefixed with "\": e.g: "/\//-//" replaces "/" with "-" - when the rules are specified using <subjectPattern> or <bodyPattern> and "/,/" has to be used in a pattern string it must be prefixed with a "\". E.g: "/\/\/,//" replaces "/" with "," (the rule would be "/\//,//" but the "/,/" must be escaped. ===================================================== == File: docs/modules/servers/partials/RemoteAddrInNetwork.adoc ===================================================== === RemoteAddrInNetwork Checks the IP address of the sending server against a comma-delimited list of IP addresses, domain names or sub-nets. See AbstractNetworkMatcher for details on how to specify entries. ===================================================== == File: docs/modules/servers/partials/NotifyPostmaster.adoc ===================================================== === NotifyPostmaster Sends a notification message to the Postmaster. A sender of the notification message can optionally be specified. If one is not specified, the postmaster's address will be used. The "To:" header of the notification message can be set to "unaltered"; if missing will be set to the postmaster. A notice text can be specified, and in such case will be inserted into the notification inline text. If the notified message has an "error message" set, it will be inserted into the notification inline text. If the *attachError* init parameter is set to true, such error message will be attached to the notification message. The notified messages are attached in their entirety (headers and content) and the resulting MIME part type is "message/rfc822". Supports the *passThrough* init parameter (true if missing). Sample configuration: .... <mailet match="All" class="NotifyPostmaster"> <sender>*an address or postmaster or sender or unaltered, default=postmaster*</sender> <attachError>*true or false, default=false*</attachError> <message>*notice attached to the original message text (optional)*</message> <prefix>*optional subject prefix prepended to the original message, default="Re:"*</prefix> <inline>*default=none*</inline> <attachment>*default=message*</attachment> <passThrough>*true or false, default=true*</passThrough> <fakeDomainCheck>*true or false, default=true*</fakeDomainCheck> <to>*unaltered (optional, defaults to postmaster)*</to> <debug>*true or false, default=false*</debug> </mailet> .... The behaviour of this mailet is equivalent to using Resend with the following configuration: .... <mailet match="All" class="Resend"> <sender>*an address or postmaster or sender or unaltered*</sender> <attachError>*true or false*</attachError> <message>*<b>dynamically built</b>*</message> ===================================================== == File: docs/modules/servers/partials/HeadersToHTTP.adoc ===================================================== === HeadersToHTTP Serialise the email and pass it to an HTTP call Sample configuration: .... <mailet match="All" class="HeadersToHTTP"> <url>http://192.168.0.252:3000/alarm</url> <parameterKey>Test</parameterKey> <parameterValue>ParameterValue</parameterValue> <passThrough>true</passThrough> </mailet> .... ===================================================== == File: docs/modules/servers/partials/CommandForListserv.adoc ===================================================== === CommandForListserv Returns positive if the recipient is a command for a listserv. For example, if my listserv is james@list.working-dogs.com, this matcher will return true for james-on@list.working-dogs.com and james-off@list.working-dogs.com. ===================================================== == File: docs/modules/servers/partials/RandomStoring.adoc ===================================================== === RandomStoring Process messages and randomly assign them to 4 to 8 mailboxes. ===================================================== == File: docs/modules/servers/partials/PostmasterAlias.adoc ===================================================== === PostmasterAlias Rewrites recipient addresses to make sure email for the postmaster is always handled. This mailet is silently inserted at the top of the root spool processor. All recipients mapped to postmaster@<servernames> are changed to the postmaster account as specified in the server conf. ===================================================== == File: docs/modules/servers/partials/SMIMECheckSignature.adoc ===================================================== === SMIMECheckSignature Verifies the s/mime signature of a message. The s/mime signing ensure that the private key owner is the real sender of the message. To be checked by this mailet the s/mime signature must contain the actual signature, the signer's certificate and optionally a set of certificate that can be used to create a chain of trust that starts from the signer's certificate and leads to a known trusted certificate. This check is composed by two steps: firstly it's ensured that the signature is valid, then it's checked if a chain of trust starting from the signer certificate and that leads to a trusted certificate can be created. The first check verifies that the message has not been modified after the signature was put and that the signer's certificate was valid at the time of the signing. The latter should ensure that the signer is who he declare to be. The results of the checks perfomed by this mailet are wrote as a mail attribute which default name is org.apache.james.SMIMECheckSignature (it can be changed using the mailet parameter *mailAttribute*). After the check this attribute will contain a list of SMIMESignerInfo object, one for each message's signer. These objects contain the signer's certificate and the trust path. Optionally, specifying the parameter *strip*, the signature of the message can be stripped after the check. The message will become a standard message without an attached s/mime signature. The configuration parameter of this mailet are summerized below. The firsts defines the location, the format and the password of the keystore containing the certificates that are considered trusted. Note: only the trusted certificate entries are read, the key ones are not. * fileType (default: keystore): type of file that is used to construct keystore object. Possible values: keystore, pem. If fileType is "keystore". The following configuration parameters would be used: * keyStoreType (default: jks): Certificate store format . "jks" is the standard java certificate store format, but pkcs12 is also quite common and compatible with standard email clients like Outlook Express and Thunderbird. * keyStoreFileName (default: JAVA_HOME/jre/lib/security/cacert): Certificate store path. * keyStorePassword (default: ""): Certificate store password. If fileType is "pem". The following configuration parameters would be used: * pemFileName: pem file path. Other parameters configure the behavior of the mailet: * strip (default: false): Defines if the s/mime signature of the message ===================================================== == File: docs/modules/servers/partials/RecoverAttachment.adoc ===================================================== === RecoverAttachment This mailet takes an attachment stored in an attribute and attach it back to the message This may be used to place back attachment stripped by StripAttachment and stored in the attribute *org.apache.james.mailet.standard.mailets.StripAttachment.saved* .... <mailet match="All" class="RecoverAttachment" > <attribute>my.attribute.name</attribute> </mailet > .... ===================================================== == File: docs/modules/servers/partials/StripAttachment.adoc ===================================================== === StripAttachment Remove attachments from a Message. Supports simple removal, storing to file, or storing to mail attributes. Configuration: .... <mailet match="All" class="StripAttachment" > <pattern >.*\.xls </pattern> <!-- The regular expression that must be matched -- > <!-- notpattern >.*\.xls </notpattern--> <!-- The regular expression that must be matched -- > <mimeType>text/calendar</mimeType> <!-- The matching mimeType -- > <directory >c:\temp\james_attach </directory> <!-- The directory to save to -- > <remove >all </remove> <!-- either "no", "matched", "all" -- > <!-- attribute>my.attribute.name</attribute --> </mailet > .... At least one of pattern, notpattern and mimeType is required. ===================================================== == File: docs/modules/servers/partials/SubAddressing.adoc ===================================================== === SubAddressing SubAddressing positions a storage directive for the folder this email will be delivered in if the following criteria are met: * the sender has requested the storage directive by sending the mail to <strong> `recipient+folder@domain` </strong> instead of just `recipient@domain` ; * the folder <strong>exists</strong> and the recipient has <strong>allowed</strong> the sender to send a mail to that specific folder. These directives are used by <strong>LocalDelivery</strong> mailet when adding the email to the recipients mailboxes. The storage directive is recognized when a specific character or character sequence is present in the local part of the recipient address. <strong>By default, it is "+"</strong>. If the sender is not allowed to send a mail to the specified folder, then the mail is delivered in the recipient's inbox. Likewise, if the storage directive is empty or absent, the mail will simply be delivered in the recipient's inbox. Thus, * a mail sent to `recipient+folder@domain` will be delivered to recipient's folder `folder` if allowed ; * a mail sent to `recipient+my-super-folder@domain` will be delivered to recipient's folder `my-super-folder` if allowed ; * a mail sent to `recipient@domain` or `recipient+@domain` will be delivered to recipient's inbox. Any user can position rights for other users and for its different folders. They may create whitelists or blacklists, for one or several folders. In the case where the sender is unknown, the mail will be delivered in the specified folder only if the recipient has allowed everyone for that folder. ===================================================== == File: docs/modules/servers/partials/DKIMSign.adoc ===================================================== === DKIMSign This mailet sign a message using the DKIM protocol If the privateKey is encoded using a password then you can pass the password as privateKeyPassword parameter. Sample configuration with inlined private key: .... <mailet match="All" class="DKIMSign"> <signatureTemplate>v=1; s=selector; d=example.com; h=from:to:received:received; a=rsa-sha256; bh=; b=;</signatureTemplate> <privateKey> -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQDYDaYKXzwVYwqWbLhmuJ66aTAN8wmDR+rfHE8HfnkSOax0oIoT M5zquZrTLo30870YMfYzxwfB6j/Nz3QdwrUD/t0YMYJiUKyWJnCKfZXHJBJ+yfRH r7oW+UW3cVo9CG2bBfIxsInwYe175g9UjyntJpWueqdEIo1c2bhv9Mp66QIDAQAB AoGBAI8XcwnZi0Sq5N89wF+gFNhnREFo3rsJDaCY8iqHdA5DDlnr3abb/yhipw0I /1HlgC6fIG2oexXOXFWl+USgqRt1kTt9jXhVFExg8mNko2UelAwFtsl8CRjVcYQO cedeH/WM/mXjg2wUqqZenBmlKlD6vNb70jFJeVaDJ/7n7j8BAkEA9NkH2D4Zgj/I OAVYccZYH74+VgO0e7VkUjQk9wtJ2j6cGqJ6Pfj0roVIMUWzoBb8YfErR8l6JnVQ bfy83gJeiQJBAOHk3ow7JjAn8XuOyZx24KcTaYWKUkAQfRWYDFFOYQF4KV9xLSEt ycY0kjsdxGKDudWcsATllFzXDCQF6DTNIWECQEA52ePwTjKrVnLTfCLEG4OgHKvl Zud4amthwDyJWoMEH2ChNB2je1N4JLrABOE+hk+OuoKnKAKEjWd8f3Jg/rkCQHj8 mQmogHqYWikgP/FSZl518jV48Tao3iXbqvU9Mo2T6yzYNCCqIoDLFWseNVnCTZ0Q b+IfiEf1UeZVV5o4J+ECQDatNnS3V9qYUKjj/krNRD/U0+7eh8S2ylLqD3RlSn9K tYGRMgAtUXtiOEizBH6bd/orzI9V9sw8yBz+ZqIH25Q= -----END RSA PRIVATE KEY----- </privateKey> </mailet> .... Sample configuration with file-provided private key: .... <mailet match="All" class="DKIMSign"> <signatureTemplate>v=1; s=selector; d=example.com; h=from:to:received:received; a=rsa-sha256; bh=; b=;</signatureTemplate> <privateKeyFilepath>dkim-signing.pem</privateKeyFilepath> </mailet> .... By default the mailet assume that Javamail will convert LF to CRLF when sending so will compute the hash using converted newlines. If you don't want this behaviour then set forceCRLF attribute to false. ===================================================== == File: docs/modules/servers/partials/TooManyRecipients.adoc ===================================================== === TooManyRecipients This matcher matches emails that have too many recipients. The example below will reject any email with more than 5 recipients .... <mailet match="TooManyRecipients=5" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/SplitMail.adoc ===================================================== === SplitMail A mailet to split email with too much recipients. The first batch is sent directly, while the remaining batches are sent asynchronously. The batch size can be configured via the <b>batchSize</b> parameter (optional, defaults to 100). ==== Sample configuration [source,xml] ---- <mailet match="notify-matcher" class="SplitMail"> <batchSize>100</batchSize> </mailet> ---- ===================================================== == File: docs/modules/servers/partials/RemoveAllMailAttributes.adoc ===================================================== === RemoveAllMailAttributes This mailet sets removes all attributes set on the Mail instance Sample configuration: .... <mailet match="All" class="RemoveAllMailAttributes"/> .... ===================================================== == File: docs/modules/servers/partials/ICALToHeader.adoc ===================================================== === ICALToHeader ICALToHeader takes a Map of filenames to ICAL4J calendars, will pick the first Calendar, and add it to the headers of the e-mail. The following headers will be added : X_MEETING_UID, X_MEETING_METHOD, X_MEETING_RECURRENCE_ID, X_MEETING_SEQUENCE, X_MEETING_DTSTAMP The only configuration parameter for this mailet is the attribute the ICAL4J Calendar map should be attached to, named *attribute*. Configuration example : .... <mailet match=??? class=ICALToHeader> <attribute>icalendars</attribute> </mailet> .... ===================================================== == File: docs/modules/servers/partials/HasMimeTypeAnySubPart.adoc ===================================================== === HasMimeTypeAnySubPart This matcher checks if the content type matches. This matcher walks down the mime tree and will look up at all the mime parts of this message. use: .... <mailet match="HasMimeTypeAnySubPart=text/plain,text/html" class="..." /> .... ===================================================== == File: docs/modules/servers/partials/AttachmentFileNameIs.adoc ===================================================== === AttachmentFileNameIs Checks if at least one attachment has a file name which matches any element of a comma-separated or space-separated list of file name masks. Syntax: *match="AttachmentFileNameIs=[-d] [-z] masks"* The match is case insensitive. File name masks may start with a wildcard '\*'. Multiple file name masks can be specified, e.g.: '\*.scr,\*.bat'. If '*-d*' is coded, some debug info will be logged. If '*-z*' is coded, the check will be non-recursively applied to the contents of any attached '*.zip' file. ===================================================== == File: docs/modules/servers/partials/MimeDecodingMailet.adoc ===================================================== === MailAttributesToMimeHeaders This mailet replace the mail attribute map of key to MimePart by a map of key to the MimePart content (as bytes). It takes only one parameter: * attribute (mandatory): mime content to be decoded, expected to be a Map<String, byte[]> Then all this map attribute values will be replaced by their content. ===================================================== == File: docs/modules/servers/partials/IsX509CertificateSubject.adoc ===================================================== === IsX509CertificateSubject Checks if the subject of a X509Certificate contains the supplied string. The certificate is read from the specified mail attribute. If the specified attribute contains more than one certificate the matcher matches if at least one of the certificates contains the given string. Configuration string: * mailAttribute;string ===================================================== == File: docs/modules/servers/partials/Bounce.adoc ===================================================== === Bounce Generates a response to the reverse-path address. Note that this is different than a mail-client's reply, which would use the Reply-To or From header. Bounced messages are attached in their entirety (headers and content) and the resulting MIME part type is "message/rfc822". The reverse-path and the Return-Path header of the response is set to "null" ("<>"), meaning that no reply should be sent. A sender of the notification message can optionally be specified. If one is not specified, the postmaster's address will be used. A notice text can be specified, and in such case will be inserted into the notification inline text. If the notified message has an "error message" set, it will be inserted into the notification inline text. If the *attachError* init parameter is set to true, such error message will be attached to the notification message. Supports the *passThrough* init parameter (true if missing). Sample configuration: .... <mailet match="All" class="Bounce"> <sender>*an address or postmaster or sender or unaltered, default=postmaster*</sender> <attachError>*true or false, default=false*</attachError> <message>*notice attached to the original message text (optional)*</message> <prefix>*optional subject prefix prepended to the original message*</prefix> <inline>*default=none*</inline> <attachment>*default=message*</attachment> <passThrough>*true or false, default=true*</passThrough> <fakeDomainCheck>*true or false, default=true*</fakeDomainCheck> <debug>*true or false, default=false*</debug> </mailet> .... The behaviour of this mailet is equivalent to using Resend with the following configuration: .... <mailet match="All" class="Resend"> <sender>*an address or postmaster or sender or unaltered*</sender> <attachError>*true or false*</attachError> <message>**dynamically built**</message> <prefix>*a string*</prefix> ===================================================== == File: docs/modules/servers/partials/RecipientCountExceeds.adoc ===================================================== === RecipientCountExceeds Matches mail with more recipients than the configured limit. Eg: .... <mailet match="RecipientCountExceeds=36"; class="Null"\> .... ===================================================== == File: docs/modules/servers/partials/WrapText.adoc ===================================================== === WrapText Convert a message to format=flowed ===================================================== == File: docs/modules/servers/partials/DKIMVerify.adoc ===================================================== === DKIMVerify This mailet verify a message using the DKIM protocol Sample configuration: .... <mailet match="All" class="DKIMVerify"> </mailet> .... By default the mailet assume that Javamail will use LF instead of CRLF so it will verify the hash using converted newlines. If you don't want this behaviour then set forceCRLF attribute to false. ===================================================== == File: docs/modules/servers/partials/IsSenderInRRTLoop.adoc ===================================================== === IsSenderInRRTLoop This matcher allow you to know if the sender of an email is part of a RRT loop. This is useful when bouncing upon RRT execution issues: we don't want to create a bouncing loop (as the execution of that RRT loop will fail). Example: .... <mailet match="IsSenderInRRTLoop" class="<any-class>"/> .... ===================================================== == File: docs/modules/servers/partials/SetMimeHeader.adoc ===================================================== === SetMailAttribute Adds a specified header and value to the message. Sample configuration: .... <mailet match="All" class="AddHeader"> <name>X-MailetHeader</name> <value>TheHeaderValue</value> </mailet> .... ===================================================== == File: docs/modules/servers/partials/Redirect.adoc ===================================================== === Redirect A mailet providing configurable redirection services. Can produce listserver, forward and notify behaviour, with the original message intact, attached, appended or left out altogether. It differs from Resend because (i) some defaults are different, notably for the following parameters: *<recipients>*, *<to>*, *<reversePath>* and *<inline>*; (ii) because it allows the use of the *<static>* parameter;. Use <code>Resend</code> if you need full control, <code>Redirect</code> if the more automatic behaviour of some parameters is appropriate. This built in functionality is controlled by the configuration as laid out below. In the table please note that the parameters controlling message headers accept the <b>"unaltered"</b> value, whose meaning is to keep the associated header unchanged and, unless stated differently, corresponds to the assumed default if the parameter is missing. The configuration parameters are: .Redirect parameters |=== | Property name | explanation | recipients | A comma delimited list of addresses for recipients of this message; it will use the "to" list if not specified, and "unaltered" if none of the lists is specified. These addresses will only appear in the To: header if no "to" list is supplied. Such addresses can contain "full names", like *Mr. John D. Smith <john.smith@xyz.com>*. The list can include constants "sender", "from", "replyTo", "postmaster", "reversePath", "recipients", "to", "null" and "unaltered"; "replyTo" uses the ReplyTo header if available, otherwise the From header if available, otherwise the Sender header if available, otherwise the return-path; "from" is made equivalent to "sender", and "to" is made equivalent to "recipients"; "null" is ignored. | to | A comma delimited list of addresses to appear in the To: header; the email ===================================================== == File: docs/modules/servers/partials/RelayLimit.adoc ===================================================== === RelayLimit Matches mail which has been relayed more than a given number of times. ===================================================== == File: docs/modules/servers/partials/DeconnectionRight.adoc ===================================================== === DeconnectionRight Mailet to avoid people to receive emails outside working hour. Working hours are defined by a starting time and an end time, on weekdays from monday to friday. Emails received outside working hours are to be delayed to next working hours. Example: ....xml <mailet match="all" class="DeconnectionRight"> <zoneId>Europe/Paris</zoneId> <workDayStart>07:00:00</workDayStart> <workDayEnd>20:00:00</metricName> </mailet> .... ===================================================== == File: docs/modules/servers/partials/ICALToJsonAttribute.adoc ===================================================== === ICALToJsonAttribute ICALToJsonAttribute takes a map of ICAL4J objects attached as attribute, and output the map of corresponding json bytes as an other attribute, with unique String keys. The JSON contains the following fields : * *ical* : the raw ical string, in UTF-8 * *sender* : the sender of the mail (compulsory, mail without sender will be discarded) * *recipient* : the recipient of the mail. If the mail have several recipients, each recipient will have its own JSON. * *uid* : the UID of the ical (optional) * *sequence* : the sequence of the ical (optional) * *dtstamp* : the date stamp of the ical (optional) * *method* : the method of the ical (optional) * *recurrence-id* : the recurrence-id of the ical (optional) Example are included in test call ICalToJsonAttributeTest. Configuration example : .... <mailet match=??? class=ICALToJsonAttribute> <sourceAttribute>icalendars</sourceAttribute> <destinationAttribute>icalendarJson</destinationAttribute> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SenderIs.adoc ===================================================== === SenderIs This matcher matches a specific sender, passed as a condition to this matcher. The example below will match mail with a sender being user@domain .... <mailet match="SenderIs=user@domain" class="<any-class>"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/TooManyLines.adoc ===================================================== === TooManyLines This matcher matches emails that have too many lines. This allows better rejection of emails when, for instance, MIME4J is configured with a limited number of lines. <p>The example below will match mail with more than 10000 lines</p> .... <mailet match="TooManyLines=10000" class="<any-class>"/> .... ===================================================== == File: docs/modules/servers/partials/IsSingleRecipient.adoc ===================================================== === IsSingleRecipient Matches mail where the number of recipients is exactly one. ===================================================== == File: docs/modules/servers/partials/ToRepository.adoc ===================================================== === ToRepository Stores incoming Mail in the specified Repository. If the "passThrough" in conf is true the mail will be returned untouched in the pipe and may be processed by additional mailets. If false will be destroyed. ===================================================== == File: docs/modules/servers/partials/SenderInFakeDomain.adoc ===================================================== === SenderInFakeDomain Does a DNS lookup (MX and A/CNAME records) on the sender's domain. If there are no entries, the domain is considered fake and the match is successful. ===================================================== == File: docs/modules/servers/partials/Null.adoc ===================================================== === Null Simplest Mailet which destroys any incoming messages by setting their state to GHOST. This effectively stops all processing of this mail. ===================================================== == File: docs/modules/servers/partials/IsRemoteDeliveryPermanentError.adoc ===================================================== === IsRemoteDeliveryPermanentError Checks if the mail has a permanent remote delivery failure attribute Example: .... <mailet match="IsRemoteDeliveryPermanentError" class="<any-class>"/> .... ===================================================== == File: docs/modules/servers/partials/RemoteDelivery.adoc ===================================================== === RemoteDelivery The RemoteDelivery mailet delivers messages to a remote SMTP server able to deliver or forward messages to their final destination. The remote SMTP server through which each mail is delivered is resolved using MX lookup for each message destination unless the *<gateway/>* parameter is set. The *<gateway/>* parameter enables the definition of one or more gateway servers through which all messages are sent. If an attempt to deliver a message fails, a redelivery attempt is scheduled according to the scheme defined by the *<delayTime/>* parameter, retrying up to the limit defined by the *<maxRetries/>* parameter. When the retry limit is exceeded, delivery failure is processed according to the setting of the *<bounceProcessor/>* parameter. These are the parameters that control the operation of the RemoteDelivery mailet: * *outgoing* (required) - a String containing the name of the queue that will hold messages being processed by this mailet. * *bind* (optional) - a String describing the local IP address to which the mailet should be bound while delivering emails. This tag is useful for multihomed machines. Default is to bind to the default local address of the machine.<br> Note: The same IP address must be used for all of those RemoteDelivery instances where you explicitly supply a bind address. * *delayTime* (optional) a String containing a comma separated list of patterns defining the number of and delays between delivery attempts. The pattern is *[attempts\*]delay [unit]* where: ** *attempts* (optional) - an Integer for the number of delivery attempts. Default is 1. ** *delay* (required) - a Long for the delay between attempts. ** *unit* (optional) - a String with the value of one of 'msec', 'sec', 'minute', 'hour', or 'day'. Default is msec. Default is one attempt after 6 hours, which if explicitly declared would be written as *<delayTime>1 6 hour</delayTime>* * *maxRetries* (optional) an Integer for the number of times an attempt is made to deliver a particular mail. Default is the greater of five and the sum of the attempts for each *<delayTime/>* specified. * *maxDnsProblemRetries* (optional) - an Integer for the number of times to retry if DNS problems for a domain occur. Default is 0. * *timeout* (optional) - an Integer for the Socket I/O timeout in milliseconds. Default is 180000 * *connectionTimeout* (optional) - an Integer for the Socket connection timeout in milliseconds. Default is 60000 * *bounceProcessor* (optional) - a String containing the name of the mailet processor to pass messages that cannot be delivered to for DSN bounce processing. Default is to send a traditional message containing the bounce details. * *onSuccess* (optional) - if specified, this processor is called for each email successfully sent to remote third parties. When using bounceProcessor or onSuccess processors, take special care of error handling (see onMailetException and onMatchException) to avoid confusing situations. Also remember that on partial delivery, both processors will be used: *onSuccess* with successfull recipients, and *bounceProcessor* with failed recipients. * *startTLS* (optional) - a Boolean (true/false) indicating whether the STARTTLS command (if supported by the server) to switch the connection to a TLS-protected connection before issuing any login commands. Default is false. * *sslEnable* (optional) - a Boolean (true/false) indicating whether to use SSL to connect and use the SSL port unless explicitly overridden. Default is false. Setting up to true will result in delivery attempts in SMTPS on port 465 with a fallback to SMTP on port 25. The trust-store if needed can be customized by *-Djavax.net.ssl.trustStore=/root/conf/keystore*. * *verifyServerIdentity* (optional) - a Boolean (true/false) indicating whether to match the remote server name against its certificate on TLS connections. Default is true. Disabling this runs the risk of someone spoofing a legitimate server and intercepting mails, but may be necessary to contact servers that have strange certificates, no DNS entries, are reachable by IP address only, and similar edge cases. * *gateway* (optional) - a String containing a comma separated list of patterns defining the gateway servers to be used to ===================================================== == File: docs/modules/servers/partials/ServerTime.adoc ===================================================== === ServerTime Returns the current time for the mail server. Sample configuration: .... <mailet match="RecipientIs=time@cadenza.lokitech.com" class="ServerTime"/> .... ===================================================== == File: docs/modules/servers/partials/AddSubjectPrefix.adoc ===================================================== === AddSubjectPrefix Add an prefix (tag) to the subject of a message <br> Sample Configuration: .... <mailet match="RecipientIs=robot@james.apache.org" class="TagMessage"> <subjectPrefix>[robot]</subjectPrefix> </mailet> .... ===================================================== == File: docs/modules/servers/partials/RemoveMailAttribute.adoc ===================================================== === RemoveMailAttribute This mailet sets attributes on the Mail. Sample configuration: .... <mailet match="All" class="RemoveMailAttribute"> <name>attribute_name1</name> <name>attribute_name2</name> </mailet> .... ===================================================== == File: docs/modules/servers/partials/Resend.adoc ===================================================== === Resend A mailet providing configurable redirection services. Can produce listserver, forward and notify behaviour, with the original message intact, attached, appended or left out altogether. Can be used as a replacement to {@link Redirect}, having more consistent defaults, and new options available. Use <code>Resend</code> if you need full control, <code>Redirect</code> if the more automatic behaviour of some parameters is appropriate. This built in functionality is controlled by the configuration as laid out below. In the table please note that the parameters controlling message headers accept the <b>"unaltered"</b> value, whose meaning is to keep the associated header unchanged and, unless stated differently, corresponds to the assumed default if the parameter is missing. The configuration parameters are: .Resend properties |=== | Property name | explanation | recipients | A comma delimited list of addresses for recipients of this message. Such addresses can contain "full names", like *Mr. John D. Smith <john.smith@xyz.com>*. The list can include constants "sender", "from", "replyTo", "postmaster", "reversePath", "recipients", "to", "null" and "unaltered"; "replyTo" uses the ReplyTo header if available, otherwise the From header if available, otherwise the Sender header if available, otherwise the return-path; "from" is made equivalent to "sender", and "to" is made equivalent to "recipients"; "null" is ignored. Default: "unaltered". | to | A comma delimited list of addresses to appear in the To: header. Such addresses can contain "full names", like *Mr. John D. Smith <john.smith@xyz.com>*. The list can include constants "sender", "from", "replyTo", "postmaster", "reversePath", "recipients", "to", "null" and "unaltered"; "from" uses the From header if available, otherwise the Sender header if available, otherwise the return-path; ===================================================== == File: docs/modules/servers/partials/HasException.adoc ===================================================== === HasException This Matcher determines if the exception specified in the condition or the subclasses of it has occurred during the processing of the mail. If true, all recipients are returned, else null. This matcher presupposes that the exception has been captured as a Mail attribute org.apache.mailet.Mail#MAILET_ERROR_ATTRIBUTE_NAME in the process. Sample configuration: .... <mailet match="HasException=org.apache.james.managesieve.api.ManageSieveException" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/UnwrapText.adoc ===================================================== === UnwrapText Remove (best effort to) the hardcoded wrapping from a message. If the text is "format=flowed" then deflows the text. Otherwise it forces a dewrap of the text. Parameters: * quotewidth - when we try to dewrap e quoted text it helps knowing the original with, so we can reconstruct "wrapped wraps" created by multiple wrappings by clients with different original width or simply to the add of the heading ">" that increase the line length. The value should be "WIDTH+X" if the original length is known, "-X" otherwise. In the latter case the length of the longer line will be used. X is the tollerance needed for the quoting chars: if the original width is known the suggested value for X is 2 (because of "> " prefix), otherwise it is suggested to increase it to a value like 10 (-10) In summary, if the original wrap is known (for example 76, for flowed messages) *quotewidth = 78* Otherwise *quotewidth = -10* ===================================================== == File: docs/modules/servers/partials/ToSenderDomainRepository.adoc ===================================================== === ToSenderDomainRepository Stores incoming Mail in a repository defined by the sender's domain.<br> Supported configuration parameters: * "urlPrefix" mandatory: defines the prefix for the per sender's domain repository. For example for the value 'cassandra://var/mail/sendersRepositories/', a mail sent by 'user@james.org' will be stored in 'cassandra://var/mail/sendersRepositories/james.org'. * "passThrough" optional, defaults to false. If true, the processing of the mail continues. If false it stops. * "allowRepositoryCreation" optional, defaults to true. If true, non existing repository will be created. In case of misconfiguration, this might lead to arbitrary repository creation. If false, the incoming mails will be stored only in already existing repository. If not existing, the email will be dropped with an appropriate log warning (leading to potential data loss). In case, you want to create a repository manually, make a http PUT request to /mailRepositories/encodedUrlOfTheRepository from web admin api. For example http://ip:port/mailRepositories/file%3A%2F%2FmailRepo Example: .... <mailet match="All" class="ToSenderDomainRepository"> <urlPrefix>cassandra://var/mail/sendersRepositories/</urlPrefix> <passThrough>false</passThrough> <allowRepositoryCreation>true</allowRepositoryCreation> </mailet> .... ===================================================== == File: docs/modules/servers/partials/VacationMailet.adoc ===================================================== === VacationMailet This mailet uses https://jmap.io/spec-mail.html#vacation-response[JMAP VacationResponse] and sends back a vacation notice to the sender if needed. ===================================================== == File: docs/modules/servers/partials/HasAttachment.adoc ===================================================== === HasAttachment Checks whether this message has an attachment ===================================================== == File: docs/modules/servers/partials/operate/metrics.adoc ===================================================== James relies on the https://metrics.dropwizard.io/4.1.2/manual/core.html[Dropwizard metric library] for keeping track of some core metrics of James. Such metrics are made available via JMX. You can connect for instance using VisualVM and the associated mbean plugins. We also support displaying them via https://grafana.com/[Grafana]. Two methods can be used to back grafana display: - Prometheus metric collection - Data are exposed on a HTTP endpoint for Prometheus scrape. - ElasticSearch metric collection - This method is depreciated and will be removed in next version. == Expose metrics for Prometheus collection To enable James metrics, add ``extensions.routes`` to xref:{xref-base}/operate/webadmin.adoc[webadmin.properties] file: ``` extensions.routes=org.apache.james.webadmin.dropwizard.MetricsRoutes ``` Connect to james-admin url to test the result: .... http://james-admin-url/metrics .... == Configure Prometheus Data source You need to set up https://prometheus.io/docs/prometheus/latest/getting_started/[Prometheus] first to scrape James metrics. + Add Apache James WebAdmin Url or IP address to ``prometheus.yaml`` configuration file: .... scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'WebAdmin url Example' scrape_interval: 5s metrics_path: /metrics static_configs: - targets: ['james-webamin-url'] - job_name: 'WebAdmin IP Example' scrape_interval: 5s metrics_path: /metrics static_configs: - targets: ['192.168.100.10:8000'] .... == Connect Prometheus to Grafana You can do this either from https://prometheus.io/docs/visualization/grafana/[Grafana UI] or from a https://grafana.com/docs/grafana/latest/datasources/prometheus/[configuration file]. + The following `docker-compose.yaml` will help you install a simple Prometheus/ Grafana stack : ``` version: '3' #Metric monitoring grafana: ===================================================== == File: docs/modules/servers/partials/operate/security.adoc ===================================================== This document aims as summarizing threats, security best practices as well as recommendations. == Threats Operating an email server exposes you to the following threats: - Spammers might attempt to use your servers to send their spam messages on their behalf. We speak of *open relay*. In addition to the resources consumed being an open relay will affect the trust other mail installations have in you, and thus will cause legitimate traffic to be rejected. - Emails mostly consist of private data, which shall only be accessed by their legitimate user. Failure to do so might result in *information disclosure*. - *Email forgery*. An attacker might craft an email on the behalf of legitimate users. - Email protocols allow user to authenticate and thus can be used as *oracles* to guess user passwords. - *Spam*. Non legitimate traffic can be a real burden to your users. - *Phishing*: Crafted emails that tricks the user into doing unintended actions. - *Viruses*: An attacker sends an attachment that contains an exploit that could run if a user opens it. - *Denial of service*: A small request may result in a very large response and require considerable work on the server... - *Denial of service*: A malicious JMAP client may use the JMAP push subscription to attempt to flood a third party server with requests, creating a denial-of-service attack and masking the attacker’s true identity. - *Dictionary Harvest Attacks*: An attacker can rely on SMTP command reply code to know if a user exists or not. This can be used to obtain the list of local users and later use those address as targets for other attacks. == Best practices The following sections ranks best practices. === Best practices: Must - 1. Configure James in order not to be an xref:{xref-base}/configure/smtp.adoc#_about_open_relays[open relay]. This should be the case with the default configuration. Be sure in xref:{xref-base}/configure/smtp.adoc[smtpserver.xml] to activate the following options: `verifyIdentity`. We then recommend to manually test your installation in order to ensure that: - Unauthenticated SMTP users cannot send mails to external email addresses (they are not relayed) - Unauthenticated SMTP users can send mails to internal email addresses - Unauthenticated SMTP users cannot use local addresses in their mail from, and send emails both locally and to distant targets. - 2. Avoid *STARTTLS* usage and favor SSL. Upgrade from a non encrypted channel into an encrypted channel is an opportunity for additional vulnerabilities. This is easily prevented by requiring SSL connection upfront. link:https://nostarttls.secvuln.info/[Read more...] Please note that STARTTLS is still beneficial in the context of email relaying, which happens on SMTP port 25 unencrypted, and enable opportunistic encryption upgrades that would not overwise be possible. We recommend keeping STARTTLS activated for SMTP port 25. - 3. Use SSL for xref:{xref-base}/configure/mailets.adoc#_remotedelivery[remote delivery] whenever you are using a gateway relaying SMTP server. - 4. Rely on an external identity service, dedicated to user credential storage. James supports xref:{xref-base}/configure/usersrepository.adoc#_configuring_a_ldap[LDAP]. If you are forced to store users in James be sure to choose `PBKDF2` as a hashing algorithm. Also, delays on authentication failures ===================================================== == File: docs/modules/servers/partials/operate/migrating.adoc ===================================================== This page presents how operators can migrate your user mailbox and mails into the {server-name} in order to adopt it. We assume you have a xref:{xref-base}/configure/index.adoc[well configured] running {server-name} at hand. We also assume existing mails are hosted on a tier mail server which can be accessed via IMAP and supports impersonation. First, you want to create the domains handled by your server, as well as the users you will be hosting. This operation can be performed via WebAdmin or the CLI. * Using webadmin : ** Read xref:{xref-base}/operate/webadmin.adoc#_create_a_domain[this section] for creating domains ** Read xref:{xref-base}/operate/webadmin.adoc#_create_a_user[this section] for creating users * Using the CLI : ** Read xref:{xref-base}/operate/cli.adoc#_manage_domains[this section] for creating domains ** Read xref:{xref-base}/operate/cli.adoc#_managing_users[this section] for creating users Second, you want to allow an administrator account of your {server-name} to have write access on other user mailboxes. This can be setted up this the *administratorId* configuration option of the xref:{xref-base}/configure/usersrepository.adoc[usersrepository.xml] configuration file. Then, it is time to run https://github.com/imapsync/imapsync[imapsync] script to copy the emails from the previous mail server into the {server-name}. Here is an example migrating a single user, relying on impersonation: .... imapsync --host1 previous.server.domain.tld \ --user1 user@domain.tld --authuser1 adminOldServer@domain.tld \ --proxyauth1 --password1 passwordOfTheOldAdmin \ --host2 distributed.james.domain.tld \ --user2 use1@domain.tld \ --authuser2 adminNewServer@domain.tld --proxyauth2 \ --password2 passwordOfTheNewAdmin .... ===================================================== == File: docs/modules/servers/partials/operate/guide.adoc ===================================================== This guide aims to be an entry-point to the James documentation for user managing a {server-name}. It includes: * Simple architecture explanations * Propose some diagnostics for some common issues * Present procedures that can be set up to address these issues In order to not duplicate information, existing documentation will be linked. Please note that this product is under active development, should be considered experimental and thus targets advanced users. == Basic Monitoring A toolbox is available to help an administrator diagnose issues: * xref:{xref-base}/operate/logging.adoc[Structured logging into Kibana] * xref:{xref-base}/operate/metrics.adoc[Metrics graphs into Grafana] * xref:{xref-base}/operate/webadmin.adoc#_healthcheck[WebAdmin HealthChecks] == Mail processing Currently, an administrator can monitor mail processing failure through `ERROR` log review. We also recommend watching in Kibana INFO logs using the `org.apache.james.transport.mailets.ToProcessor` value as their `logger`. Metrics about mail repository size, and the corresponding Grafana boards are yet to be contributed. Furthermore, given the default mailet container configuration, we recommend monitoring `{mailet-repository-path-prefix}://var/mail/error/` to be empty. WebAdmin exposes all utilities for xref:{xref-base}/operate/webadmin.adoc#_reprocessing_mails_from_a_mail_repository[reprocessing all mails in a mail repository] or xref:{xref-base}/operate/webadmin.adoc#_reprocessing_a_specific_mail_from_a_mail_repository[reprocessing a single mail in a mail repository]. In order to prevent unbounded processing that could consume unbounded resources. We can provide a CRON with `limit` parameter. Ex: 10 reprocessed per minute Note that it only support the reprocessing all mails. Also, one can decide to xref:{xref-base}/operate/webadmin.adoc#_removing_all_mails_from_a_mail_repository[delete all the mails of a mail repository] or xref:{xref-base}/operate/webadmin.adoc#_removing_a_mail_from_a_mail_repository[delete a single mail of a mail repository]. Performance of mail processing can be monitored via the ===================================================== == File: docs/modules/servers/partials/operate/performanceChecklist.adoc ===================================================== This guide aims to help James operators refine their James configuration and set up to achieve better performance. == Database setup {backend-name}, OpenSearch, RabbitMQ is a large topic in itself that we do not intend to cover here. Yet, here are some very basic recommendation that are always beneficial to keep in mind. We recommend: * Running {backend-name}, OpenSearch on commodity hardware with attached SSD. SAN disks are known to cause performance issues for these technologies. HDD disks are to be banned for these performance related applications. * We recommend getting an Object Storage SaaS offering that suites your needs. Most generalist S3 offers will suite James needs. * We do provide a guide on xref:[Database benchmarks] that can help identify and fix issues. == James configuration === JMAP protocol If you are not using JMAP, disabling it will avoid you the cost of populating related projections and thus is recommended. Within `jmap.properties`: .... enabled=false .... We recommend turning on EmailQueryView as it enables resolution of mailbox listing against {backend-name}, thus unlocking massive stability / performance gains. Within `jmap.properties`: .... view.email.query.enabled=true .... === IMAP / SMTP We recommend against resolving client connection DNS names. This behaviour can be disabled via a system property within `jvm.properties`: .... james.protocols.mdc.hostname=false .... Concurrent IMAP request count is the critical setting. In `imapServer.xml`: .... <concurrentRequests>200</concurrentRequests> <maxQueueSize>4096</maxQueueSize> .... Other recommendation includes avoiding unecessary work upon IMAP IDLE, not starting dedicated BOSS threads: ===================================================== == File: docs/modules/servers/partials/operate/webadmin.adoc ===================================================== The web administration supports for now the CRUD operations on the domains, the users, their mailboxes and their quotas, managing mail repositories, performing {backend-name} migrations, and much more, as described in the following sections. *WARNING*: This API allow authentication only via the use of JWT. If not configured with JWT, an administrator should ensure an attacker can not use this API. By the way, some endpoints are not filtered by authentication. Those endpoints are not related to data stored in James, for example: Swagger documentation & James health checks. In case of any error, the system will return an error message which is json format like this: .... { statusCode: <error_code>, type: <error_type>, message: <the_error_message> cause: <the_detail_message_from_throwable> } .... Also be aware that, in case things go wrong, all endpoints might return a 500 internal error (with a JSON body formatted as exposed above). To avoid information duplication, this is omitted on endpoint specific documentation. Finally, please note that in case of a malformed URL the 400 bad request response will contain an HTML body. == HealthCheck === Check all components This endpoint is simple for now and is just returning the http status code corresponding to the state of checks (see below). The user has to check in the logs in order to have more information about failing checks. .... curl -XGET http://ip:port/healthcheck .... Will return a list of healthChecks execution result, with an aggregated result: .... { "status": "healthy", "checks": [ ===================================================== == File: docs/modules/servers/partials/operate/logging.adoc ===================================================== We recommend to closely monitoring *ERROR* and *WARNING* logs. Those logs should be considered not normal. If you encounter some suspicious logs: * If you have any doubt about the log being caused by a bug in James source code, please reach us via the bug tracker, the user mailing list or our Gitter channel (see our http://james.apache.org/#second[community page]) * They can be due to insufficient performance from tier applications (eg {backend-name} timeouts). In such case we advise you to conduct a close review of performances at the tier level. Leveraging filters in Kibana discover view can help to filter out ''already known'' frequently occurring logs. When reporting ERROR or WARNING logs, consider adding the full logs, and related data (eg the raw content of a mail triggering an issue) to the bug report in order to ease resolution. == Logging configuration {server-name} uses link:http://logback.qos.ch/[logback] as a logging library and link:https://docs.fluentbit.io/[FluentBit] as centralize logging. Information about logback configuration can be found link:http://logback.qos.ch/manual/configuration.html[here]. It is possible to configure a logback appender to expose structured logging as JSON using logback's `JsonEncoder` like in the following example: ``` <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.JsonEncoder"> <withFormattedMessage>true</withFormattedMessage> </encoder> <immediateFlush>false</immediateFlush> </appender> ``` Note that dedicated formatters can be added to your docker containers : - Add the corresponding JAR onto the `/root/libs` folder of docker container - Add the JAR path onto `/root/jib-classpath-file` for it to be loaded on the classpath by the JAVA runtime. ===================================================== == File: docs/modules/servers/partials/operate/index.adoc ===================================================== The following pages detail how to operate the {server-name}. Once you have a {server-name} up and running you then need to ensure it operates correctly and has a decent performance. You may also need to perform some operation maintenance or recover from incidents. This section covers these topics. Read more about xref:{xref-base}/operate/logging.adoc[Logging]. The xref:{xref-base}/operate/webadmin.adoc[WebAdmin Restfull administration API] is the recommended way to operate the {server-name}. It allows managing and interacting with most server components. The xref:{xref-base}/operate/cli.adoc[Command line interface] allows to interact with some server components. However it relies on JMX technologies and its use is discouraged. The xref:{xref-base}/operate/metrics.adoc[metrics] allows to build latency and throughput graphs, that can be visualized, for instance in *Grafana*. We did put together a xref:{xref-base}/operate/guide.adoc[detailed guide] for {server-tag} James operators. We also propose a xref:{xref-base}/operate/performanceChecklist.adoc[performance checklist]. We also included a guide for xref:{xref-base}/operate/migrating.adoc[migrating existing data] into the {server-tag} server. Additional functional visualisations can be set up using OpenSearch dashboards as documented in link:https://github.com/apache/james-project/tree/master/examples/opensearch-dahsboard[this example]. ===================================================== == File: docs/modules/servers/partials/operate/cli.adoc ===================================================== The {server-name} is packed with a command line client. To run this command line client simply execute: .... java -jar /root/james-cli.jar -h 127.0.0.1 -p 9999 COMMAND .... The following document will explain you which are the available options for *COMMAND*. Note: the above command line before *COMMAND* will be documented as _\{cli}_. == Manage Domains Domains represent the domain names handled by your server. You can add a domain: .... {cli} AddDomain domain.tld .... You can remove a domain: .... {cli} RemoveDomain domain.tld .... (Note: associated users are not removed automatically) Check if a domain is handled: .... {cli} ContainsDomain domain.tld .... And list your domains: .... {cli} ListDomains .... == Managing users Note: the following commands are explained with virtual hosting turned on. Users are accounts on the mail server. James can maintain mailboxes for them. ===================================================== == File: docs/modules/servers/partials/All.adoc ===================================================== === All Matches all mail. ===================================================== == File: docs/modules/servers/partials/benchmark/db-benchmark.adoc ===================================================== This document provides basic performance of {server-name} databases, benchmark methodologies as a basis for a James administrator who can test and evaluate if his {server-name} databases are performing well. It includes: * A sample deployment topology * Propose benchmark methodology and base performance for each database. This aims to help operators to quickly identify performance issues and compliance of their databases. == Sample deployment topology We deploy a sample topology of {server-name} with these following databases: - OpenDistro 1.13.1 as search engine: 3 nodes, each node has 8 OVH vCores CPU and 30 GB memory limit (OVH b2-30 instance). - RabbitMQ 3.8.17 as message queue: 3 Kubernetes pods, each pod has 0.6 OVH vCore CPU and 2 GB memory limit. - OVH Swift S3 as an object storage - {backend-database-extend-sample} With the above system, our email service operates stably with valuable performance. For a more details, it can handle a load throughput up to about 1000 JMAP requests per second with 99th percentile latency is 400ms. == Benchmark methodologies and base performances We are willing to share the benchmark methodologies and the result to you as a reference to evaluate your {server-name}' performance. Other evaluation methods are welcome, as long as your databases exhibit similar or even better performance than ours. It is up to your business needs. If your databases shows results that fall far from our baseline performance, there's a good chance that there are problems with your system, and you need to check it out thoroughly. === Benchmark OpenSearch ==== Benchmark methodology ===== Benchmark tool We use https://github.com/opensearch-project/opensearch-benchmark[opensearch-benchmark] - an official OpenSearch benchmarking tool. It provides the following features: - Automatically create OpenSearch clusters, stress tests them, and delete them. - Manage stress testing data and solutions by OpenSearch version. - Present stress testing data in a comprehensive way, allowing you to compare and analyze the data of different stress tests and store the data on a particular OpenSearch instance for secondary analysis. - Collect Java Virtual Machine (JVM) details, such as memory and garbage collection (GC) data, to locate performance problems. ===== How to benchmark To install the `opensearch-benchmark` tool, you need Python 3.8+ including pip3 first, then run: ``` python3 -m pip install opensearch-benchmark ``` If you have any trouble or need more detailed instructions, please look in the https://github.com/opensearch-project/OpenSearch-Benchmark/blob/main/DEVELOPER_GUIDE.md[detailed installation guide]. Let's see which workloads (simulation profiles) that `opensearch-benchmark` provides: ```opensearch-benchmark list worloads```. For our James use case, we are interested in ```pmc``` workload: ```Full-text benchmark with academic papers from PMC```. ===================================================== == File: docs/modules/servers/partials/benchmark/james-benchmark.adoc ===================================================== This document provides benchmark methodology and basic performance of {server-name} as a basis for a James administrator who can test and evaluate if his {server-name} is performing well. It includes: * A sample {server-name} deployment topology * Propose benchmark methodology * Sample performance results This aims to help operators quickly identify performance issues. == Sample deployment topology We deploy a sample topology of {server-name} with these following components: - {server-name}: 3 Kubernetes pods, each pod has 2 OVH vCore CPU and 4 GB memory limit. - OpenDistro 1.13.1 as search engine: 3 nodes, each node has 8 OVH vCores CPU and 30 GB memory limit (OVH b2-30 instance). - RabbitMQ 3.8.17 as message queue: 3 Kubernetes pods, each pod has 0.6 OVH vCore CPU and 2 GB memory limit. - OVH Swift S3 as an object storage - {backend-database-extend-sample} == Benchmark methodology and base performance include::{benchmark_prepare_extend}[] === Provision testing data Before doing the performance test, you should make sure you have a {server-name} up and running with some provisioned testing data so that it is representative of reality. Please follow these steps to provision testing data: * Prepare James with a custom `mailetcontainer.xml` having Random storing mailet. This help us easily setting a good amount of provisioned emails. Add this under transport processor [source,xml] ---- <mailet match="All" class="RandomStoring"/> ---- * Modify {provision_file_url}[provision.sh] upon your need (number of users, mailboxes, emails to be provisioned). Currently, this script provisions 10 users, 15 mailboxes and hundreds of emails for example. Normally to make the performance test representative, you should provision thousands of users, thousands of mailboxes and millions of emails. * Add the permission to execute the script: ---- ===================================================== == File: docs/modules/servers/partials/benchmark/index.adoc ===================================================== The following pages detail how to do performance testing for the {server-name} also its database. Once you have a {server-name} up and running you then need to ensure it operates correctly and has a decent performance. You may need to do performance testings periodically to make sure your James performs well. We introduced xref:{xref-base}/benchmark/james-benchmark.adoc[tools and base benchmark result for {server-name}] also xref:{xref-base}/benchmark/db-benchmark.adoc[James database's base performance and how to benchmark them] to cover this topic. ===================================================== == File: docs/modules/servers/partials/CommandListservMatcher.adoc ===================================================== === CommandListservMatcher CommandListservMatcher is the matcher that pairs with the CommandListservManager It checks to see if the request is intended for the ListservManager, but doesn't guarantee that it is a valid command. To configure, insert this into the config.xml inside of the root processor block. .... <mailet match="CommandListservMatcher=announce@localhost" class="CommandListservManager"> ... </mailet> .... ===================================================== == File: docs/modules/servers/partials/Sieve.adoc ===================================================== === Sieve Execute Sieve scripts for incoming emails, and set the result of the execution as attributes of the mail ===================================================== == File: docs/modules/servers/partials/ToProcessor.adoc ===================================================== === ToProcessor This mailet redirects the mail to the named processor Sample configuration: .... <mailet match="All" class="ToProcessor"> <processor>spam</processor> <notice>Notice attached to the message (optional)</notice> </mailet> .... ===================================================== == File: docs/modules/servers/partials/MailAttributesListToMimeHeaders.adoc ===================================================== === MailAttributesListToMimeHeaders Convert attributes of type Collection<String> to headers Sample configuration: .... <mailet match="All" class="MailAttributesToMimeHeaders"> <simplemapping>org.apache.james.attribute1;headerName1</simplemapping> <simplemapping>org.apache.james.attribute2;headerName2</simplemapping> </mailet> .... ===================================================== == File: docs/modules/servers/partials/FetchedFrom.adoc ===================================================== === FetchedFrom Matches mail with a header set by Fetchpop X-fetched-from fetchpop sets X-fetched-by to the "name" of the fetchpop fetch task. This is used to match all mail fetched from a specific pop account. Once the condition is met the header is stripped from the message to prevent looping if the mail is re-inserted into the spool. ===================================================== == File: docs/modules/servers/partials/HostIsLocal.adoc ===================================================== === HostIsLocal Matches mail to Domains which are local ===================================================== == File: docs/modules/servers/partials/SetMailAttribute.adoc ===================================================== === SetMailAttribute This mailet sets attributes on the Mail. Sample configuration: .... <mailet match="All" class="SetMailAttribute"> <name1>value1</name1> <name2>value2</name2> </mailet> .... ===================================================== == File: docs/modules/servers/partials/HasMimeTypeParameter.adoc ===================================================== === HasMimeTypeParameter This matcher checks if the content type parameters matches. use: .... <mailet match="HasMimeTypeParameter=report-type=disposition-notification,report-type=other" class="..." /> .... ===================================================== == File: docs/modules/servers/partials/RemoteAddrNotInNetwork.adoc ===================================================== === RemoteAddrInNetwork Checks the IP address of the sending server against a comma-delimited list of IP addresses, domain names or sub-nets. See AbstractNetworkMatcher for details on how to specify entries. ===================================================== == File: docs/modules/servers/partials/AtLeastPriority.adoc ===================================================== === AtLeastPriority Numeric value. The priority of this mail should be at least the specified value to be matched. Inclusive. ===================================================== == File: docs/modules/servers/partials/ContactExtractor.adoc ===================================================== === ContactExtractor Collects the sender and the recipients of a message and store them as JSON in a specified message attribute. Here is the JSON format: .... { "userEmail" : "sender@james.org", "emails" : [ "to@james.org", "cc@james.org" ] } .... Sample configuration: .... <mailet match="All" class="ContactExtractor"> <attribute>ExtractedContacts</attribute> </mailet> .... ===================================================== == File: docs/modules/servers/partials/Sign.adoc ===================================================== === Sign Puts a *server-side* SMIME signature on a message. It is a concrete subclass of Sign, with very few modifications to it, to specialize for SMIME. Handles the following init parameters: * <keyHolderClass>: Sets the class of the KeyHolder object that will handle the cryptography functions, for example org.apache.james.security.SMIMEKeyHolder for SMIME. * <debug>: if *true* some useful information is logged. The default is *false*. * <keyStoreFileName>: the {@link java.security.KeyStore} full file name. * <keyStorePassword>: the *KeyStore* password. If given, it is used to check the integrity of the keystore data, otherwise, if null, the integrity of the keystore is not checked. * <keyAlias>: the alias name to use to search the Key using {@link java.security.KeyStore#getKey}. The default is to look for the first and only alias in the keystore; if zero or more than one is found a {@link java.security.KeyStoreException} is thrown. * <keyAliasPassword>: the alias password. The default is to use the *KeyStore* password. At least one of the passwords must be provided. * <keyStoreType>: the type of the keystore. The default will use {@link java.security.KeyStore#getDefaultType}. * <postmasterSigns>: if *true* the message will be signed even if the sender is the Postmaster. The default is *true*. * <rebuildFrom>: If *true* will modify the "From:" header. The default is *true*. * <signerName>: the name of the signer to be shown in the explanation text. The default is to use the "CN=" property of the signing certificate. * <explanationText>. There is a default explanation string template in English, displaying also all the headers of the original message. ===================================================== == File: docs/modules/servers/partials/HasMailAttributeWithValue.adoc ===================================================== === HasMailAttributeWithValue This Matcher determines if the mail contains the attribute specified in the condition and if the value answered when the method toString() is invoked on the attribute is equal to the String value specified in the condition. If both tests are true, all recipients are returned, else null. Notes: The current matcher implementation expects a single String value to match on. This matcher requires two values, the attribute name and attribute value. This requires some implicit rules to govern how the single value supplied to the matcher is parsed into two values. * In the match condition, the split between the attribute name and the attribute value is made at the first comma. Attribute names that include a comma will parse incorrectly and therefore are not supported by this matcher. * Leading and trailing spaces are removed from both the attribute name and attribute value specified in the condition and the tested attribute value in the mail prior to matching. Therefore, "abc" , " abc", "abc " and " abc " are considered equivalent. * To test for an empty string, do not specify an attribute value after the comma. Sample configuration: .... <mailet match="HasMailAttributeWithValue=name, value" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/DSNBounce.adoc ===================================================== === DSNBounce Generates a Delivery Status Notification (DSN) Note that this is different than a mail-client's reply, which would use the Reply-To or From header. Bounced messages are attached in their entirety (headers and content) and the resulting MIME part type is "message/rfc822". The reverse-path and the Return-Path header of the response is set to "null" ("<>"), meaning that no reply should be sent. A sender of the notification message can optionally be specified. If one is not specified, the postmaster's address will be used. Supports the <code>passThrough</code> init parameter (true if missing). Sample configuration: .... <mailet match="All" class="DSNBounce"> <sender>*an address or postmaster or sender or unaltered, default=postmaster*</sender> <prefix>*optional subject prefix prepended to the original message*</prefix> <attachment>*message, heads or none, default=message*</attachment> <messageString>*the message sent in the bounce, the first occurrence of the pattern [machine] is replaced with the name of the executing machine, default=Hi. This is the James mail server at [machine] ... *</messageString> <passThrough>*true or false, default=true*</passThrough> <debug>*true or false, default=false*</debug> </mailet> .... ===================================================== == File: docs/modules/servers/partials/RemoteDeliveryFailedWithSMTPCode.adoc ===================================================== === RemoteDeliveryFailedWithSMTPCode Checks the SMTP error code attached to remote delivery failures ===================================================== == File: docs/modules/servers/partials/FoldLongLines.adoc ===================================================== === FoldLongLines This mailet fold (wrap) any header lines of the mail that exceed the maximum number of characters. This sanitizing of EML message will prevent downstream server from applying it, and prevent them to break the DKIM signature positioned by James. It takes only one parameter: * maxCharacters: maximum number of characters. Default to 998 (This line limit is defined in RFC5322). ===================================================== == File: docs/modules/servers/partials/HasMailAttribute.adoc ===================================================== === HasMailAttribute This Matcher determines if the mail contains the attribute specified in the condition, and returns all recipients if it is the case. Sample configuration: .... <mailet match="HasMailAttribute=whatever" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/ToSenderFolder.adoc ===================================================== === ToSenderFolder Receives a Mail from the Queue and takes care to deliver the message to a defined folder of the sender. You have to define the folder name of the sender. The flag 'consume' will tell is the mail will be further processed by the upcoming processor mailets, or not. .... <mailet match="RecipientIsLocal" class="ToSenderFolder"> <folder> *Sent Items* </folder> <consume> *false* </consume> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SenderHostIsLocal.adoc ===================================================== === SenderHostIsLocal Checks the sender's displayed domain name against a the hosts serviced by this mail context. Sample Configuration: .... <mailet match="SenderHostIsLocal" class="SpamAssassin"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/CompareNumericHeaderValue.adoc ===================================================== === CompareNumericHeaderValue Matches mails containing a header with a numeric value whose comparison with the specified value is true. If the header is missing in the message, there will be *no match* Configuration string: The headerName, a comparison operator and the numeric headerValue to compare with, *space or tab delimited*. The comparison operators are: *<, <=, ==, >=, >*; another set of operators is: *LT, LE, EQ, GE, GT*. Also the following operators are accepted: *=<, =, =>*. Example: .... <mailet match="CompareNumericHeaderValue=X-MessageIsSpamProbability > 0.9" class="ToProcessor"> <processor> spam </processor> </mailet> .... ===================================================== == File: docs/modules/servers/partials/RecipientIsRegex.adoc ===================================================== === RecipientIsRegex Matches recipients whose address matches a regular expression. Is equivalent to the SenderIsRegex matcher but matching on the recipient. Configuration string: a regular expression. .... <mailet match="RecipientIsRegex=<regular-expression>" class="<any-class>"> .... The example below will match any recipient in the format user@log.anything .... <mailet match="RecipientIsRegex=(.*)@log\.(.*)" class="<any-class>"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/NotifySender.adoc ===================================================== === NotifySender Sends a notification message to the sender of a message. A sender of the notification message can optionally be specified. If one is not specified, the postmaster's address will be used. The "To:" header of the notification message can be set to "unaltered"; if missing will be set to the sender of the notified message. A notice text can be specified, and in such case will be inserted into the notification inline text. If the notified message has an "error message" set, it will be inserted into the notification inline text. If the *attachError* init parameter is set to true, such error message will be attached to the notification message. The notified messages are attached in their entirety (headers and content) and the resulting MIME part type is "message/rfc822". Supports the *passThrough* init parameter (true if missing). Sample configuration: .... <mailet match="All" class="NotifySender"> <sender>*an address or postmaster or sender or unaltered, default=postmaster*</sender> <attachError>*true or false, default=false*</attachError> <prefix>*optional subject prefix prepended to the original message*</prefix> <inline>default=none*</inline> <attachment>default=message*</attachment> <passThrough>*true or false, default=true*</passThrough> <fakeDomainCheck>*true or false, default=true*</fakeDomainCheck> <to>*unaltered or sender or from(optional, defaults to sender)*</to> <debug>*true or false, default=false*</debug> </mailet> .... The behaviour of this mailet is equivalent to using Resend with the following configuration: .... <mailet match="All" class="Resend"> <sender>*an address or postmaster or sender or unaltered*</sender> <attachError>*true or false*</attachError> <message>*<b>dynamically built</b>*</message> <prefix>*a string*</prefix> <passThrough>true</passThrough> <fakeDomainCheck>*true or false*</fakeDomainCheck> ===================================================== == File: docs/modules/servers/partials/LDAPMatchers.adoc ===================================================== = LDAP matchers for Apache James This project is an extension for Apache James that allows configuring conditions based on LDAP content within Apache James mailetcontainer. Those include: - LDAP conditions based on attributes of the recipients - LDAP conditions based on attributes of the sender - LDAP groups of the recipients - LDAP groups of the sender Support is planned for LDAP groups both for sender and recipients. == Set up Build this project. For the root of the repository: ....bash mvn clean install -DskipTests --am --pl :james-server-mailet-ldap .... Then copy the JAR located in `/target` into the `extensions-jars` folder of your Apache James installation. == Configuration The LDAP settings are reused from the `usersrepository.xml` configuration file. Then LDAP matchers can be configured within `mailetcontainer.xml`. For instance: ....xml <!-- Matches recipients that have the following attribute with the specified value--> <mailet matcher="HasLDAPAttribute=description:blocked" class="Null"> </mailet> .... or ....xml <!-- Matches sender that have the following attribute with the specified value--> <mailet matcher="SenderHasLDAPAttribute=description:blocked" class="Null"> </mailet> .... or ===================================================== == File: docs/modules/servers/partials/SMIMESign.adoc ===================================================== === SMIMESign Puts a *server-side* signature on a message. It is a concrete subclass of AbstractSign, with very few modifications to it. A text file with an explanation text is attached to the original message, and the resulting message with all its attachments is signed. * The resulting appearance of the message is almost unchanged: only an extra attachment * and the signature are added. The kind of signature depends on the value of the <keyHolderClass> init parameter. Handles the following init parameters: * <keyHolderClass>: Sets the class of the KeyHolder object that will handle the cryptography functions, for example org.apache.james.security.SMIMEKeyHolder for SMIME. * <debug>: if *true* some useful information is logged. The default is *false*. * <keyStoreFileName>: the {@link java.security.KeyStore} full file name. * <keyStorePassword>: the *KeyStore* password. If given, it is used to check the integrity of the keystore data, otherwise, if null, the integrity of the keystore is not checked. * <keyAlias>: the alias name to use to search the Key using {@link java.security.KeyStore#getKey}. The default is to look for the first and only alias in the keystore; if zero or more than one is found a {@link java.security.KeyStoreException} is thrown. * <keyAliasPassword>: the alias password. The default is to use the *KeyStore* password. At least one of the passwords must be provided. * <keyStoreType>: the type of the keystore. The default will use {@link java.security.KeyStore#getDefaultType}. * <postmasterSigns>: if *true* the message will be signed even if the sender is the Postmaster. The default is *true*. * <rebuildFrom>: If *true* will modify the "From:" header. The default is *true*. * <signerName>: the name of the signer to be shown in the explanation text. The default is to use the "CN=" property of the signing certificate. * <explanationText>. There is a default explanation string template in English, displaying also all the headers of the original message. ===================================================== == File: docs/modules/servers/partials/SubjectStartsWith.adoc ===================================================== === SubjectIs Matches mail where the subject starts with a given phrase. ===================================================== == File: docs/modules/servers/partials/SenderDomainIs.adoc ===================================================== === SenderDomainIs SenderDomainIs will look at the envelope sender's domain. If equal to configured value, then all recipients will be returned. Otherwise an empty list will be returned. Sample configuration: .... <mailet match="SenderDomainIs=<domain.com>" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/IsRemoteDeliveryTemporaryError.adoc ===================================================== === IsRemoteDeliveryPermanentError Checks if the mail has a temporary remote delivery failure attribute set to false (meaning it's a temporary error) Example: .... <mailet match="IsRemoteDeliveryTemporaryError" class="<any-class>"/> .... ===================================================== == File: docs/modules/servers/partials/SentByMailet.adoc ===================================================== === SentByMailet This matcher matches email sent automatically by mailets. .... <mailet match="SentByMailetAny" class="<any-class>"/> .... This matcher allows you, for instance, to enable/disable routing automatically generated emails out of your server. ===================================================== == File: docs/modules/servers/partials/DLP.adoc ===================================================== === DLP Enable evaluation of incoming emails against DLP rules (Data Leak Prevention) attached to the sender domains. Example: ---- <mailet match="DLP" class="ToRepository"> <repositoryPath>/var/mail/quarantine</repositoryPath> </mailet> ---- Rules can be administered via xref:distributed/operate/webadmin.adoc#_administrating_dlp_configuration[webAdmin]. Only available on top of Memory and Cassandra storages. Additionally a cache can be added to reduce queries done to the underlying database. Example: ---- <mailet match="DLP=cache:60s" class="ToRepository"> <repositoryPath>/var/mail/quarantine</repositoryPath> </mailet> ---- Will query the DLP rules for a given domain only every 60 seconds. Please note that querying DLP rules on top of Cassandra relies on Event sourcing, involves reading a potentially large event stream and involves some SERIAL reads (LightWeight transactions) for each processed emails. Efficiency of the cache can be tracked with the following metrics: - `dlp.cache.hitRate` - `dlp.cache.missCount` - `dlp.cache.hitCount` - `dlp.cache.size` ===================================================== == File: docs/modules/servers/partials/SenderIsLocal.adoc ===================================================== === SenderIsLocal Matches mail where the sender is local. ===================================================== == File: docs/modules/servers/partials/RecipientIs.adoc ===================================================== === RecipientIs This matcher matches a specific recipient (in the envelope of the mail), passed as a condition to this matcher. The example below will match only the recipient user@domain .... <mailet match="RecipientIs=user@domain" class="<any-class>"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/FromRepository.adoc ===================================================== === FromRepository Re-spools Mail found in the specified Repository. .... <mailet match="RecipientIs=respool@localhost" class="FromRepository"> <repositoryPath> *repository path* </repositoryPath> <processor> *target processor* </repositoryPath> <delete&t; [true|<b>false</b>] </delete> </mailet> .... ===================================================== == File: docs/modules/servers/partials/InSpammerBlacklist.adoc ===================================================== === InSpammerBlacklist Checks the network IP address of the sending server against a blacklist of spammers. There are 3 lists that support this... * *blackholes.mail-abuse.org*: Rejected - see http://www.mail-abuse.org/rbl/ * *dialups.mail-abuse.org*: Dialup - see http://www.mail-abuse.org/dul/ * *relays.mail-abuse.org*: Open spam relay - see http://www.mail-abuse.org/rss/ Example: .... <mailet match="InSpammerBlacklist=blackholes.mail-abuse.org." class="ToProcessor"> <processor>spam</processor> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SenderHostIs.adoc ===================================================== === SenderHostIs Checks the sender's displayed domain name against a supplied list. Sample configuration: .... <mailet match="SenderHostIs=domain.com" class="ToProcessor"> <processor> spam </processor> </mailet> .... ===================================================== == File: docs/modules/servers/partials/IsMarkedAsSpam.adoc ===================================================== === IsMarkedAsSpam Matches mails having a *org.apache.james.spamassassin.status* per recipient header with a *Yes* value. As an example, here is a part of a mailet pipeline which can be used in your LocalDelivery processor: .... <!-- SpamAssassing mailets pipeline --> <mailet match="RecipientIsLocal" class="SpamAssassin"> <spamdHost>spamassassin</spamdHost> <spamdPort>783</spamdPort> </mailet> <mailet match="IsMarkedAsSpam" class="WithStorageDirective"> <targetFolderName>Spam</targetFolderName> </mailet> <!-- End of SpamAssassing mailets pipeline --> .... In order to use this with `rspamd`, we need to declare a condition for the matcher and drop the Rspamd jar (*third-party/rspamd*) in the James extensions-jars folder. Eg: With the recipient header for Rspamd being *org.apache.james.rspamd.status*, then the configuration would be: .... <!-- Rspamd mailets pipeline --> <mailet match="IsMarkedAsSpam=org.apache.james.rspamd.status" class="WithStorageDirective"> <targetFolderName>Spam</targetFolderName> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SMTPAuthSuccessful.adoc ===================================================== === SMTPAuthSuccessful Matches mails that are sent by an SMTP authenticated user. If the sender was not authenticated it will not match. .... <mailet match="SMTPAuthSuccessful" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/HasHeader.adoc ===================================================== === HasHeader use: .... <mailet match="HasHeader={<header>[=value]}+" class="..." /> .... This matcher checks if the header is present in the message (global) and per recipient (specific). It complements the AddHeader mailet. ===================================================== == File: docs/modules/servers/partials/HasMimeType.adoc ===================================================== === HasMimeType This matcher checks if the content type matches. This matcher does not walk down the mime tree and stops at the top level mime part. use: .... <mailet match="HasMimeType=text/plain,text/html" class="..." /> .... ===================================================== == File: docs/modules/servers/partials/OnlyText.adoc ===================================================== === OnlyText Keep only the text part of a message. If the message is text only then it doesn't touch it, if it is a multipart it transform it a in plain text message with the first text part found. * text/plain * text/html => with a conversion to text only * text/* as is. ===================================================== == File: docs/modules/servers/partials/UseHeaderRecipients.adoc ===================================================== === UseHeaderRecipients Mailet designed to process the recipients from the mail headers rather than the recipients specified in the SMTP message header. This can be useful if your mail is redirected on-route by a mail server that substitutes a fixed recipient address for the original. To use this, match against the redirection address using the *RecipientIs* matcher and set the mailet 'class' to *UseHeaderRecipients*. This will cause the email to be re-injected into the root process with the recipient substituted by all the recipients in the Mail-For, To and Cc headers of the message. e.g. .... <mailet match="RecipientIs=forwarded@myhost" class="UseHeaderRecipients"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/SentByJmap.adoc ===================================================== === SentByJmap Matches mails sent via the JMAP protocol. ===================================================== == File: docs/modules/servers/partials/ICSSanitizer.adoc ===================================================== === ICSSanitizer Some senders embed 'text/calendar' content as part of Mime bodypart headers with an empty body. This mailet duplicate the 'text/calendar' content to the Mime body part. Example configuration: .... <mailet match="All" class="ICSSanitizer"/> .... ===================================================== == File: docs/modules/servers/partials/SenderIsRegex.adoc ===================================================== === SenderIsRegex Matches mails that are sent by a sender whose address matches a regular expression. Is equivalent to the RecipientIsRegex matcher but matching on the sender. Configuration string: a regular expression. .... <mailet match="SenderIsRegex=<regular-expression>" class="<any-class>"> .... The example below will match any sender in the format user@log.anything .... <mailet match="SenderIsRegex=(.*)@log\.(.*)" class="<any-class>"> </mailet> .... Another example below will match any sender having some variations of the string *mp3* inside the username part. .... <mailet match="SenderIsRegex=(.*)(mp3|emmepitre)(.*)@" class="<any-class>"> </mailet> .... ===================================================== == File: docs/modules/servers/partials/configure/forProtocolsPartial.adoc ===================================================== == For protocols By omitting these files, the underlying protocols will be disabled. ** xref:{xref-base}/imap.adoc[*imapserver.xml*] allows configuration for the IMAP protocol link:{sample-configuration-prefix-url}imapserver.xml[example] ** xref:{xref-base}/jmap.adoc[*jmap.properties*] allows to configure the JMAP protocol link:{sample-configuration-prefix-url}jmap.properties[example] ** xref:{xref-base}/jmx.adoc[*jmx.properties*] allows configuration of JMX being used by the Command Line Interface link:{sample-configuration-prefix-url}jmx.properties[example] ** xref:{xref-base}/smtp.adoc#_lmtp_configuration[*lmtpserver.xml*] allows configuring the LMTP protocol link:{sample-configuration-prefix-url}lmtpserver.xml[example] ** *managesieveserver.xml* allows configuration for ManagedSieve (unsupported) link:{sample-configuration-prefix-url}managesieveserver.xml[example] ** xref:{xref-base}/pop3.adoc[*pop3server.xml*] allows configuration for the POP3 protocol (experimental) link:{sample-configuration-prefix-url}pop3server.xml[example] ** xref:{xref-base}/smtp.adoc[*smtpserver.xml*] allows configuration for the SMTP protocol link:{sample-configuration-prefix-url}smtpserver.xml[example] *** xref:{xref-base}/smtp-hooks.adoc[This page] list SMTP hooks that can be used out of the box with the {server-name}. ** xref:{xref-base}/webadmin.adoc[*webadmin.properties*] enables configuration for the WebAdmin protocol link:{sample-configuration-prefix-url}webadmin.properties[example] ** xref:{xref-base}/ssl.adoc[This page] details SSL & TLS configuration. ** xref:{xref-base}/sieve.adoc[This page] details Sieve setup and how to enable ManageSieve. ===================================================== == File: docs/modules/servers/partials/configure/collecting-events.adoc ===================================================== == Motivation Calendar applications typically add event invitations received via email directly to a user’s calendar. This behavior requires the calendar application to recognize and process ICalendar-related emails. == Design The idea is to write a portion of mailet pipeline extracting Icalendar attachments and to hold them as attachments that can later be sent to other applications over AMQP to be treated in an asynchronous, decoupled fashion. == Configuration We can achieve this goal by combining simple mailets building blocks. Here is a sample pipeline achieving aforementioned objectives : [source,xml] .... <!-- ICAL pipeline --> <mailet match="All" class="StripAttachment"> <mimeType>text/calendar</mimeType> <attribute>rawIcalendar</attribute> </mailet> <mailet match="All" class="MimeDecodingMailet"> <attribute>rawIcalendar</attribute> </mailet> <mailet match="All" class="ICalendarParser"> <sourceAttribute>rawIcalendar</sourceAttribute> <destinationAttribute>icalendar</destinationAttribute> </mailet> <mailet match="All" class="ICALToHeader"> <attribute>icalendar</attribute> </mailet> <mailet match="All" class="ICALToJsonAttribute"> <source>icalendar</source> <destination>icalendarAsJson</destination> <rawSource>rawIcalendar</rawSource> </mailet> <mailet match="All" class="AmqpForwardAttribute"> <uri>amqp://${env:JAMES_AMQP_USERNAME}:${env:JAMES_AMQP_PASSWORD}@${env:JAMES_AMQP_HOST}:${env:JAMES_AMQP_PORT}</uri> <exchange>james:events</exchange> <attribute>icalendarAsJson</attribute> </mailet> <!-- End of ICAL pipeline --> .... The input of this pipeline is an ICS (ICalendar) file attached to an email. The pipeline processes the calendar attachment by decoding and parsing it, then transforming it into JSON format. This JSON data is added to the email object as an attribute named icalendarAsJson. Finally, it is published via AMQP for further processing by the Calendar app. The `icalendarAsJson` attribute will look like the following: ===================================================== == File: docs/modules/servers/partials/configure/matchers.adoc ===================================================== This documentation page lists and documents Matchers that can be used within the {server-name} MailetContainer in order to write your own mail processing logic with out-of-the-box components. == Supported matchers include::partial$All.adoc[] include::partial$AtLeastPriority.adoc[] include::partial$AtMost.adoc[] include::partial$AtMostPriority.adoc[] include::partial$DLP.adoc[] include::partial$FetchedFrom.adoc[] include::partial$HasAttachment.adoc[] include::partial$HasException.adoc[] include::partial$HasHeader.adoc[] include::partial$HasHeaderWithPrefix.adoc[] include::partial$HasMailAttribute.adoc[] include::partial$HasMailAttributeWithValue.adoc[] include::partial$HasMailAttributeWithValueRegex.adoc[] include::partial$HasMimeType.adoc[] include::partial$HasMimeTypeParameter.adoc[] include::partial$HasPriority.adoc[] include::partial$HostIs.adoc[] include::partial$HostIsLocal.adoc[] include::partial$IsMarkedAsSpam.adoc[] include::partial$IsOverQuota.adoc[] include::partial$IsRemoteDeliveryPermanentError.adoc[] include::partial$IsRemoteDeliveryTemporaryError.adoc[] include::partial$IsSenderInRRTLoop.adoc[] ===================================================== == File: docs/modules/servers/partials/configure/mailets.adoc ===================================================== This documentation page lists and documents Mailet that can be used within the {server-name} MailetContainer in order to write your own mail processing logic with out-of-the-box components. == Supported mailets include::partial$AddDeliveredToHeader.adoc[] include::partial$AddFooter.adoc[] include::partial$AddSubjectPrefix.adoc[] include::partial$AmqpForwardAttribute.adoc[] include::partial$Bounce.adoc[] include::partial$ContactExtractor.adoc[] include::partial$ConvertTo7Bit.adoc[] include::partial$DKIMSign.adoc[] include::partial$DKIMVerify.adoc[] include::partial$DSNBounce.adoc[] include::partial$Expires.adoc[] include::partial$ExtractMDNOriginalJMAPMessageId.adoc[] include::partial$Forward.adoc[] include::partial$ICalendarParser.adoc[] include::partial$ICALToHeader.adoc[] include::partial$ICALToJsonAttribute.adoc[] include::partial$ICSSanitizer.adoc[] include::partial$LocalDelivery.adoc[] include::partial$LogMessage.adoc[] include::partial$MailAttributesListToMimeHeaders.adoc[] include::partial$MailAttributesToMimeHeaders.adoc[] include::partial$MailToAllUsers.adoc[] include::partial$MetricsMailet.adoc[] ===================================================== == File: docs/modules/servers/partials/configure/batchsizes.adoc ===================================================== This files allow to define the amount of data that should be fetched 'at once' when interacting with the mailbox. This is needed as IMAP can generate some potentially large requests. Increasing these values tend to fasten individual requests, at the cost of enabling potential higher load. Consult this link:{sample-configuration-prefix-url}/batchsizes.properties[example] to get some examples and hints. .batchsizes.properties content |=== | Property name | explanation | fetch.metadata | Optional, defaults to 200. How many messages should be read in a batch when using FetchType.MetaData | fetch.headers | Optional, defaults to 200. How many messages should be read in a batch when using FetchType.Header | fetch.body | Optional, defaults to 100. How many messages should be read in a batch when using FetchType.Body | fetch.full | Optional, defaults to 50. How many messages should be read in a batch when using FetchType.Full | copy | Optional, defaults to 200. How many messages should be copied in a batch. | move | Optional, defaults to 200. How many messages should be moved in a batch. |=== ===================================================== == File: docs/modules/servers/partials/configure/forStorageDependenciesPartial.adoc ===================================================== == For storage dependencies Except specific documented cases, these files are required, at least to establish a connection with the storage components. ** xref:{xref-base}/blobstore.adoc[*blobstore.properties*] allows to configure the BlobStore link:{sample-configuration-prefix-url}/sample-configuration/blob.properties[example] ** xref:{xref-base}/opensearch.adoc[*opensearch.properties*] allows to configure OpenSearch driver link:{sample-configuration-prefix-url}/sample-configuration/opensearch.properties[example] ** xref:{xref-base}/rabbitmq.adoc[*rabbitmq.properties*] allows configuration for the RabbitMQ driver link:{sample-configuration-prefix-url}/sample-configuration/rabbitmq.properties[example] ** xref:{xref-base}/redis.adoc[*redis.properties*] allows configuration for the Redis driver link:https://github.com/apache/james-project/blob/fabfdf4874da3aebb04e6fe4a7277322a395536a/server/mailet/rate-limiter-redis/redis.properties[example], that is used by optional distributed rate limiting component. ** xref:{xref-base}/tika.adoc[*tika.properties*] allows configuring Tika as a backend for text extraction link:{sample-configuration-prefix-url}/sample-configuration/tika.properties[example] ===================================================== == File: docs/modules/servers/partials/configure/smtp-hooks.adoc ===================================================== This documentation page lists and documents SMTP hooks that can be used within the {server-name} SMTP protocol stack in order to customize the way your SMTP server behaves without of the box components. == DNSRBLHandler This command handler check against https://www.wikiwand.com/en/Domain_Name_System-based_Blackhole_List[RBL-Lists] (Real-time Blackhole List). If getDetail is set to true it try to retrieve information from TXT Record why the ip was blocked. Default to false. before you enable out the DNS RBL handler documented as an example below, please take a moment to review each block in the list. We have included some that various JAMES committers use, but you must decide which, if any, are appropriate for your environment. The mail servers hosting @apache.org mailing lists, for example, use a slightly different list than we have included below. And it is likely that most JAMES committers also have slightly different sets of lists. The SpamAssassin user's list would be one good place to discuss the measured quality of various block lists. NOTA BENE: the domain names, below, are terminated with '.' to ensure that they are absolute names in DNS lookups. Under some circumstances, names that are not explicitly absolute could be treated as relative names, leading to incorrect results. This has been observed on *nix and MS-Windows platforms by users of multiple mail servers, and is not JAMES specific. If you are unsure what this means for you, please speak with your local system/network admins. This handler should be considered experimental. Example configuration: [source,xml] .... <handlerchain> <!-- ... --> <handler class="org.apache.james.smtpserver.fastfail.DNSRBLHandler"> <getDetail>false</getDetail> <rblservers> <whitelist>query.bondedsender.org.</whitelist> <blacklist>sbl-xbl.spamhaus.org.</blacklist> ===================================================== == File: docs/modules/servers/partials/configure/domainlist.adoc ===================================================== Consult this link:{sample-configuration-prefix-url}/domainlist.xml[example] to get some examples and hints. This configuration block is defined by the *domainlist* tag. .domainlist.xml content |=== | Property name | explanation | domainnames | Domainnames identifies the DNS namespace served by this instance of James. These domainnames are used for both matcher/mailet processing and SMTP auth to determine when a mail is intended for local delivery - Only applicable for XMLDomainList. The entries mentionned here will be created upon start. |autodetect |true or false - If autodetect is true, James wil attempt to discover its own host name AND use any explicitly specified servernames. If autodetect is false, James will use only the specified domainnames. Defaults to false. |autodetectIP |true or false - If autodetectIP is not false, James will also allow add the IP address for each servername. The automatic IP detection is to support RFC 2821, Sec 4.1.3, address literals. Defaults to false. |defaultDomain |Set the default domain which will be used if an email is send to a recipient without a domain part. If no defaultdomain is set the first domain of the DomainList gets used. If the default is not yet contained by the Domain List, the domain will be created upon start. |read.cache.enable |Experimental. Boolean, defaults to false. Whether or not to cache domainlist.contains calls. Enable a faster execution however writes will take time to propagate. |read.cache.expiracy |Experimental. String (duration), defaults to 10 seconds (10s). Supported units are ms, s, m, h, d, w, month, y. Expiracy of the cache. Longer means less reads are performed to the backend but writes will take longer to propagate. Low values (a few seconds) are advised. |=== To override autodetected domainnames simply add explicit domainname elements. In most cases this will be necessary. By default, the domainname 'localhost' is specified. This can be removed, if required. ===================================================== == File: docs/modules/servers/partials/configure/queue.adoc ===================================================== This configuration helps you configure mail queue you want to select. == Queue Configuration .queue.properties content |=== | Property name | explanation | mail.queue.choice | Mail queue can be implemented by many type of message brokers: Pulsar, RabbitMQ,... This property will choose which mail queue you want, defaulting to RABBITMQ |=== `mail.queue.choice` supports the following options: * You can specify the `RABBITMQ` if you want to choose RabbitMQ mail queue * You can specify the `PULSAR` if you want to choose Pulsar mail queue ===================================================== == File: docs/modules/servers/partials/configure/dsn.adoc ===================================================== DSN introduced in link:https://tools.ietf.org/html/rfc3461[RFC-3461] allows a SMTP sender to demand status messages, defined in link:https://tools.ietf.org/html/rfc3464[RFC-3464] to be sent back to the `Return-Path` upon delivery progress. DSN support is not enabled by default, as it needs specific configuration of the xref:{pages-path}/configure/mailetcontainer.adoc[mailetcontainer.xml] to be specification compliant. To enable it you need to: - Add DSN SMTP hooks as part of the SMTP server stack - Configure xref:{pages-path}/configure/mailetcontainer.adoc[mailetcontainer.xml] to generate DSN bounces when needed == Enabling DSN in SMTP server stack For this simply add the `DSN hooks` in the handler chain in `smtpserver.xml` : [source,xml] .... <smtpserver enabled="true"> <...> <!-- The rest of your SMTP configuration, unchanged --> <handlerchain> <handler class="org.apache.james.smtpserver.dsn.DSNEhloHook"/> <handler class="org.apache.james.smtpserver.dsn.DSNMailParameterHook"/> <handler class="org.apache.james.smtpserver.dsn.DSNRcptParameterHook"/> <handler class="org.apache.james.smtpserver.dsn.DSNMessageHook"/> <...> <!-- other handlers, like: --> <handler class="org.apache.james.smtpserver.CoreCmdHandlerLoader"/> <!-- for instance --> </handlerchain> </smtpserver> .... == Enabling DSN generation as part of mail processing For the below conditions to be matched we assume you follow xref:{pages-path}/configure/remote-delivery-error-handling.adoc[RemoteDelivery error handling for MXs], which is a requirement for detailed RemoteDelivery error and delay handling on top of the {server-name}. Here is a sample xref:{pages-path}/configure/mailetcontainer.adoc[mailetcontainer.xml] achieving the following DSN generation: - Generate a generic `delivered` notification if LocalDelivery succeeded, if requested - Generate a generic `failed` notification in case of local errors, if requested - Generate a specific `failed` notification in case of a non existing local user, if requested - Generate a specific `failed` notification in case of an address rewriting loop, if requested - Generate a `failed` notification in case of remote permanent errors, if requested. We blame the remote server... - Generate a `delayed` notification in case of temporary remote errors we are about to retry, if requested. We blame the remote server... - Generate a `failed` notification in case of temporary remote errors we are not going to retry (failed too many time), if requested. We blame the remote server... [subs=attributes+,xml] ---- <mailetcontainer enableJmx="true"> ===================================================== == File: docs/modules/servers/partials/configure/jmx.adoc ===================================================== == Disclaimer JMX poses several security concerns and had been leveraged to conduct arbitrary code execution. This threat is mitigated by not allowing remote connections to JMX, setting up authentication and pre-authentication filters. However, we recommend to either run James in isolation (docker / own virtual machine) or disable JMX altogether.<br/> James JMX endpoint provides command line utilities and exposes a few metrics, also available on the metric endpoint.</p> == Configuration This is used to configure the JMX MBean server via which all management is achieved. Consult this link:{sample-configuration-prefix-url}/jmx.properties[example] in GIT to get some examples and hints. .jmx.properties content |=== | Property name | explanation | jmx.enabled | Boolean. Should the JMX server be enabled? Defaults to `true`. | jmx.address |The IP address (host name) the MBean Server will bind/listen to. | jmx.port | The port number the MBean Server will bind/listen to. |=== To access from a remote location, it has been reported that `-Dcom.sun.management.jmxremote.ssl=false` is needed as a JVM argument. == JMX Security In order to set up JMX authentication, we need to put `jmxremote.password` and `jmxremote.access` file to `/conf` directory. - `jmxremote.password`: define the username and password, that will be used by the client (here is james-cli) File's content example: ``` james-admin pass1 ``` - `jmxremote.access`: define the pair of username and access permission File's content example: ``` james-admin readwrite ``` ===================================================== == File: docs/modules/servers/partials/configure/tika.adoc ===================================================== When using OpenSearch, you can configure an external Tika server for extracting and indexing text from attachments. Thus you can significantly improve user experience upon text searches. Note: You can launch a tika server using this command line: .... docker run --name tika linagora/docker-tikaserver:1.24 .... Here are the different properties: .tika.properties content |=== | Property name | explanation | tika.enabled | Should Tika text extractor be used? If true, the TikaTextExtractor will be used behind a cache. If false, the DefaultTextExtractor will be used (naive implementation only supporting text). Defaults to false. | tika.host | IP or domain name of your Tika server. The default value is 127.0.0.1 | tika.port | Port of your tika server. The default value is 9998 | tika.timeoutInMillis | Timeout when issuing request to the tika server. The default value is 30 seconds. | tika.cache.eviction.period | A cache is used to avoid, when possible, query Tika multiple time for the same attachments. This entry determines how long after the last read an entry vanishes. Please note that units are supported (ms - millisecond, s - second, m - minute, h - hour, d - day). Default unit is seconds. Default value is *1 day* | tika.cache.enabled | Should the cache be used? False by default | tika.cache.weight.max | Maximum weight of the cache. A value of *0* disables the cache Please note that units are supported (K for KB, M for MB, G for GB). Defaults is no units, so in bytes. Default value is *100 MB*. | tika.contentType.blacklist | Blacklist of content type is known-to-be-failing with Tika. Specify the list with comma separator. |=== ===================================================== == File: docs/modules/servers/partials/configure/jvm.adoc ===================================================== This file may contain any additional system properties for tweaking JVM execution. When you normally would add a command line option `-Dmy.property=whatever`, you can put it in this file as `my.property=whatever` instead. These properties will be added as system properties on server start. Note that in some rare cases this might not work, when a property affects very early JVM start behaviour. For testing purposes, you may specify a different file path via the command line option `-Dextra.props=/some/other/jvm.properties`. == Adjusting the Mailbox folder delimiter The delimiter used to separate parent/child folders. WARNING: This value should only be changed when setting up a new deployment. Changing the parameter for an existing deployments will likely lead to failure of some system components, as occurrences of old the delimiter will still be present in the database/data store. Optional. String. Defaults to 'dot' Ex in `jvm.properties` ---- james.mailbox.folder.delimiter=dot ---- Allowed values are: dot (will use '.' as delimiter), slash (will use '/' as delimiter), pipe ('|'), comma (','), colon (':'), semicolon (';'). == Control the threshold memory This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. In `jvm.properties` ---- james.message.memory.threshold=12K ---- (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. == Enable the copy of message in memory Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold be copied to temporary files? ---- james.message.usememorycopy=true ---- Optional. Boolean. Defaults to false. Recommended value is false. == Running resource leak detection It is used to detect a resource not be disposed of before it's garbage-collected. In `jvm.properties` ---- james.lifecycle.leak.detection.mode=advanced ---- ===================================================== == File: docs/modules/servers/partials/configure/jmap.adoc ===================================================== https://jmap.io/[JMAP] is intended to be a new standard for email clients to connect to mail stores. It therefore intends to primarily replace IMAP + SMTP submission. It is also designed to be more generic. It does not replace MTA-to-MTA SMTP transmission. Consult this link:{sample-configuration-prefix-url}/jmap.properties[example] to get some examples and hints. .jmap.properties content |=== | Property name | explanation | enabled | true/false. Governs whether JMAP should be enabled | jmap.port | Optional. Defaults to 80. The port this server will be listening on. This value must be a valid port, ranging between 1 and 65535 (inclusive) | tls.keystoreURL | Keystore to be used for generating authentication tokens for password authentication mechanism. This should not be the same keystore than the ones used by TLS based protocols. | tls.secret | Password used to read the keystore | jwt.publickeypem.url | Optional. Coma separated list of RSA public keys URLs to validate JWT tokens allowing requests to bypass authentication. Defaults to an empty list. | url.prefix | Optional. Configuration urlPrefix for JMAP routes. Default value: http://localhost. | websocket.url.prefix | Optional. URL for JMAP WebSocket route. Default value: ws://localhost | websocket.ping.interval | Optional. Configure the duration of the interval between consecutive ping messages (as specified in RFC6455) sent by the server to the client over a WebSocket connection. The supported unit is seconds (e.g: `3s` for a 3-second interval). Default is empty, this feature is disabled. | email.send.max.size | Optional. Configuration max size for message created in RFC-8621. Default value: None. Supported units are B (bytes) K (KB) M (MB) G (GB). | max.size.attachments.per.mail | Optional. Defaults to 20MB. RFC-8621 `maxSizeAttachmentsPerEmail` advertised to JMAP client as part of the `urn:ietf:params:jmap:mail` capability. This needs to be at least 33% lower than `email.send.max.size` property (in order to account for text body, headers, base64 encoding and MIME structures). JMAP clients would use this property in order not to create too big emails. Default value: None. Supported units are B (bytes) K (KB) M (MB) G (GB). ===================================================== == File: docs/modules/servers/partials/configure/mailrepositorystore.adoc ===================================================== A `mail repository` allows storage of a mail as part of its processing. Standard configuration relies on the following mail repository. A mail repository is identified by its *url*, constituted of a *protocol* and a *path*. For instance in the url `{mailet-repository-path-prefix}://var/mail/error/` `{mail-repository-protocol}` is the protocol and `var/mail/error` the path. The *mailrepositorystore.xml* file allows registration of available protocols, and their binding to actual MailRepository implementation. Note that extension developers can write their own MailRepository implementations, load them via the `extensions-jars` mechanism as documented in xref:customization:index.adoc['writing your own extensions'], and finally associated to a protocol in *mailrepositorystore.xml* for a usage in *mailetcontainer.xml*. == Configuration Consult this link:{sample-configuration-prefix-url}/mailrepositorystore.xml[example] to get some examples and hints. [subs=attributes+,xml] ---- <mailrepositorystore> <defaultProtocol>{mail-repository-protocol}</defaultProtocol> <mailrepositories> <mailrepository class="{mail-repository-class}"> <protocols> <protocol>{mail-repository-protocol}</protocol> </protocols> </mailrepository> </mailrepositories> </mailrepositorystore> ---- Only the *{mail-repository-class}* is available by default for the {server-name}. Mails metadata are stored in {mail-repository-protocol} while the headers and bodies are stored within the xref:{pages-path}/architecture/index.adoc#_blobstore[BlobStore]. ===================================================== == File: docs/modules/servers/partials/configure/collecting-contacts.adoc ===================================================== == Motivation Many modern applications combines email and contacts. We want recipients of emails sent by a user to automatically be added to this user contacts, for convenience. This should even be performed when a user sends emails via SMTP for example using thunderbird. == Design The idea is to send AMQP messages holding information about mail envelope for a traitment via a tierce application. == Configuration We can achieve this goal by combining simple mailets building blocks. Here is a sample pipeline achieving aforementioned objectives : [source,xml] .... <mailet match="SenderIsLocal" class="ContactExtractor"> <attribute>extractedContacts</attribute> </mailet> <mailet match="All" class="AmqpForwardAttribute"> <uri>amqp://${env:JAMES_AMQP_USERNAME}:${env:JAMES_AMQP_PASSWORD}@${env:JAMES_AMQP_HOST}:${env:JAMES_AMQP_PORT}</uri> <exchange>collector:email</exchange> <attribute>extractedContacts</attribute> </mailet> .... A sample message looks like: .... { "userEmail": "sender@james.org", "emails": ["to@james.org"] } .... ===================================================== == File: docs/modules/servers/partials/configure/droplists.adoc ===================================================== The DropList, also known as the mail blacklist, is a collection of domains and email addresses that are denied from sending emails within the system. It is disabled by default. To enable it, modify the `droplists.properties` file and include the `IsInDropList` matcher in the `mailetcontainer.xml`. To disable it, adjust the `droplists.properties` file and remove the `IsInDropList` matcher from the `mailetcontainer.xml`. .droplists.properties content |=== | Property name | explanation | enabled | Boolean. Governs whether DropLists should be enabled. Defaults to `false`. |=== == Enabling Matcher Plug the `IsInDropList` matcher within `mailetcontainer.xml` : [source,xml] .... <mailet match="org.apache.james.transport.matchers.IsInDropList" class="ToProcessor"> <processor>transport</processor> </mailet> .... == DropList management DropList management, including adding and deleting entries, is performed through the WebAdmin REST API or CLI. See xref:{pages-path}/operate/webadmin.adoc#_administrating_droplists[WebAdmin DropLists]. See xref:distributed/operate/cli.adoc#_manage_droplist[CLI DropLists]. ===================================================== == File: docs/modules/servers/partials/configure/search.adoc ===================================================== This configuration helps you configure the components used to back search. .search.properties content |=== | Property name | explanation | implementation | The implementation to be used for search. Should be one of: - *opensearch* : Index and search mails into OpenSearch. - *scanning* : Do not index documents and perform scanning search, scrolling mailbox for matching contents. This implementation can have a prohibitive cost. - *opensearch-disabled* : Saves events to index into event dead letter. Make searches fails. This is useful to start James without OpenSearch while still tracking messages to index for later recovery. This can be used in order to ease delays for disaster recovery action plans. |=== ===================================================== == File: docs/modules/servers/partials/configure/blobstore.adoc ===================================================== === Encryption choice Data can be optionally encrypted with a symmetric key using AES before being stored in the blobStore. As many user relies on third party for object storage, a compromised third party will not escalate to a data disclosure. Of course, a performance price have to be paid, as encryption takes resources. *encryption.aes.enable* : Optional boolean, defaults to false. If AES encryption is enabled, then the following properties MUST be present: - *encryption.aes.password* : String - *encryption.aes.salt* : Hexadecimal string The following properties CAN be supplied: - *encryption.aes.private.key.algorithm* : String, defaulting to PBKDF2WithHmacSHA512. Previously was PBKDF2WithHmacSHA1. WARNING: Once chosen this choice can not be reverted, all the data is either clear or encrypted. Mixed encryption is not supported. Here is an example of how you can generate the above values (be mindful to customize the byte lengths in order to add enough entropy. .... # Password generation openssl rand -base64 64 # Salt generation generate salt with : openssl rand -hex 16 .... AES blob store supports the following system properties that could be configured in `jvm.properties`: .... # Threshold from which we should buffer the blob to a file upon encrypting # Unit supported: K, M, G, default to no unit james.blob.aes.file.threshold.encrypt=100K # Threshold from which we should buffer the blob to a file upon decrypting # Unit supported: K, M, G, default to no unit james.blob.aes.file.threshold.decrypt=256K # Maximum size of a blob. Larger blobs will be rejected. # Unit supported: K, M, G, default to no unit james.blob.aes.blob.max.size=100M .... === Object storage configuration ===================================================== == File: docs/modules/servers/partials/configure/forCoreComponentsPartial.adoc ===================================================== == For core components By omitting these files, sane default values are used. ** xref:{xref-base}/batchsizes.adoc[*batchsizes.properties*] allows to configure mailbox read batch sizes link:{sample-configuration-prefix-url}/sample-configuration/batchsizes.properties[example] ** xref:{xref-base}/dns.adoc[*dnsservice.xml*] allows to configure DNS resolution link:{sample-configuration-prefix-url}/sample-configuration/dnsservice.xml[example] ** xref:{xref-base}/domainlist.adoc[*domainlist.xml*] allows to configure Domain storage link:{sample-configuration-prefix-url}/sample-configuration/domainlist.xml[example] ** xref:{xref-base}/healthcheck.adoc[*healthcheck.properties*] allows to configure periodical healthchecks link:{sample-configuration-prefix-url}/sample-configuration/healthcheck.properties[example] ** xref:{xref-base}/mailetcontainer.adoc[*mailetcontainer.xml*] allows configuring mail processing link:{sample-configuration-prefix-url}/sample-configuration/mailetcontainer.xml[example] *** xref:{xref-base}/mailets.adoc[This page] list matchers that can be used out of the box with the {server-name}. *** xref:{xref-base}/matchers.adoc[This page] list matchers that can be used out of the box with the {server-name}. ** xref:{xref-base}/mailrepositorystore.adoc[*mailrepositorystore.xml*] enables registration of allowed MailRepository protcols and link them to MailRepository implementations link:{sample-configuration-prefix-url}/sample-configuration/mailrepositorystore.xml[example] ** xref:{xref-base}/recipientrewritetable.adoc[*recipientrewritetable.xml*] enables advanced configuration for the Recipient Rewrite Table component link:{sample-configuration-prefix-url}/sample-configuration/recipientrewritetable.xml[example] *** xref:{xref-base}/matchers.adoc[This page] allows choosing the indexing technology. ** xref:{xref-base}/usersrepository.adoc[*usersrepository.xml*] allows configuration of user storage link:{sample-configuration-prefix-url}/sample-configuration/usersrepository.xml[example] ===================================================== == File: docs/modules/servers/partials/configure/extensions.adoc ===================================================== This files enables an operator to define additional bindings used to instantiate others extensions *guice.extension.module*: come separated list of fully qualified class name. These classes need to implement Guice modules. Here is an example of such a class : [source,java] .... public class MyServiceModule extends AbstractModule { @Override protected void configure() { bind(MyServiceImpl.class).in(Scopes.SINGLETON); bind(MyService.class).to(MyServiceImpl.class); } } .... Recording it in extensions.properties : .... guice.extension.module=com.project.MyServiceModule .... Enables to inject MyService into your extensions. *guice.extension.tasks*: come separated list of fully qualified class name. The extension can rely on the Task manager to supervise long-running task execution (progress, await, cancellation, scheduling...). These extensions need to implement Task extension modules. Here is an example of such a class : [source,java] .... public class RspamdTaskExtensionModule implements TaskExtensionModule { @Inject public RspamdTaskExtensionModule() { } @Override public Set<TaskDTOModule<? extends Task, ? extends TaskDTO>> taskDTOModules() { return Set.of(...); } @Override public Set<AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends AdditionalInformationDTO>> taskAdditionalInformationDTOModules() { return Set.of(...); } ===================================================== == File: docs/modules/servers/partials/configure/sieve.adoc ===================================================== James servers are able to evaluate and execute Sieve scripts. Sieve is an extensible mail filtering language. It's limited expressiveness (no loops or variables, no tests with side effects) allows user created scripts to be run safely on email servers. Sieve is targeted at the final delivery phase (where an incoming email is transferred to a user's mailbox). The following Sieve capabilities are supported by Apache James: - link:https://www.ietf.org/rfc/rfc2234.txt[RFC 2234 ABNF] - link:https://www.ietf.org/rfc/rfc2244.txt[RFC 2244 ACAP] - link:https://www.ietf.org/rfc/rfc2298.txt[RFC 2298 MDN] - link:https://tools.ietf.org/html/rfc5228[RFC 5228 Sieve] - link:https://tools.ietf.org/html/rfc4790[RFC 4790 IAPCR] - link:https://tools.ietf.org/html/rfc5173[RFC 5173 Body Extension] - link:https://datatracker.ietf.org/doc/html/rfc5230[RFC 5230 Vacations] To be correctly executed, please note that the *Sieve* mailet is required to be positioned prior the *LocalDelivery* mailet. == Managing Sieve scripts A user willing to manage his Sieve scripts on the server can do so via several means: He can ask an admin to upload his script via the xref:{pages-path}/operate/cli.adoc[CLI] As James supports ManageSieve (link:https://datatracker.ietf.org/doc/html/rfc5804[RFC-5804]) a user can thus use compatible software to manage his Sieve scripts.</p> == ManageSieve protocol *WARNING*: ManageSieve protocol should be considered experimental. Consult link:{sample-configuration-prefix-url}/managesieveserver.xml[managesieveserver.xml] in GIT to get some examples and hints. The service is controlled by a configuration block in the managesieveserver.xml. The managesieveserver tag defines the boundaries of the configuration block. It encloses all the relevant configuration for the ManageSieve server. The behavior of the ManageSieve service is controlled by the attributes and children of this tag. This tag has an optional boolean attribute - *enabled* - that defines whether the service is active or not. The value defaults to "false" if not present. The standard children of the managesieveserver tag are: .managesieveserver.xml content |=== ===================================================== == File: docs/modules/servers/partials/configure/listeners.adoc ===================================================== {server-name} relies on an event bus system to enrich mailbox capabilities. Each operation performed on the mailbox will trigger related events, that can be processed asynchronously by potentially any James node on a distributed system. Mailbox listeners can register themselves on this event bus system to be called when an event is fired, allowing to do different kind of extra operations on the system. {server-name} allows the user to register potentially user defined additional mailbox listeners. Consult this link:{sample-configuration-prefix-url}/listener.xml[example] to get some examples and hints. == Configuration The <executeGroupListeners> controls whether to launch group mailbox listener consumption. Defaults to true. Use with caution: never disable on standalone james servers, and ensure at least some instances do consume group mailbox listeners within a clustered topology. Mailbox listener configuration is under the XML element <listener>. Some MailboxListener allows you to specify if you want to run them synchronously or asynchronously. To do so, for MailboxListener that supports this, you can use the *async* attribute (optional, per mailet default) to govern the execution mode. If *true* the execution will be scheduled in a reactor elastic scheduler. If *false*, the execution is synchronous. Already provided additional listeners are documented below. === SpamAssassinListener Provides per user real-time HAM/SPAM feedback to a SpamAssassin server depending on user actions. This mailet is asynchronous by default, but this behaviour can be overridden by the *async* configuration property. This MailboxListener is supported. Example: [source,xml] .... <listeners> <!-- ... --> <listener> <class>org.apache.james.mailbox.spamassassin.SpamAssassinListener</class> </listener> </listeners> .... Please note that a `spamassassin.properties` file is needed. Read also ===================================================== == File: docs/modules/servers/partials/configure/vault.adoc ===================================================== Deleted Messages Vault is the component in charge of retaining messages before they are going to be deleted. Messages stored in the Deleted Messages Vault could be deleted after exceeding their retentionPeriod (explained below). It also supports to restore or export messages matching with defined criteria in xref:{pages-path}/operate/webadmin.adoc#_deleted_messages_vault[WebAdmin deleted messages vault document] by using xref:{pages-path}/operate/webadmin.adoc#_deleted_messages_vault[WebAdmin endpoints]. == Deleted Messages Vault Configuration Once the vault is active, James will start moving deleted messages to it asynchronously. The Deleted Messages Vault also stores and manages deleted messages into a BlobStore. The BlobStore can be either based on an object storage or on {backend-name}. For configuring the BlobStore the vault will use, you can look at xref:{pages-path}/configure/blobstore.adoc[*blobstore.properties*] BlobStore Configuration section. == deletedMessageVault.properties Consult this link:{sample-configuration-prefix-url}/deletedMessageVault.properties[example] to get some examples and hints. .deletedMessageVault.properties content |=== | Property name | explanation | enabled | Allows to enable or disable usage of the Deleted Message Vault. Default to false. | workQueueEnabled | Enable work queue to be used with deleted message vault. Default to false. | retentionPeriod | Deleted messages stored in the Deleted Messages Vault are expired after this period (default: 1 year). It can be expressed in *y* years, *d* days, *h* hours, ... | restoreLocation | Messages restored from the Deleted Messages Vault are placed in a mailbox with this name (default: ``Restored-Messages``). The mailbox will be created if it does not exist yet. |=== ===================================================== == File: docs/modules/servers/partials/configure/imap.adoc ===================================================== Consult this link:{sample-configuration-prefix-url}/imapserver.xml[example] to get some examples and hints. The IMAP4 service is controlled by a configuration block in the imap4server.xml. The imap4server tag defines the boundaries of the configuration block. It encloses all the relevant configuration for the IMAP4 server. The behavior of the IMAP4 service is controlled by the attributes and children of this tag. This tag has an optional boolean attribute - *enabled* - that defines whether the service is active or not. The value defaults to "true" if not present. The standard children of the imapserver tag are: .imapserver.xml content |=== | Property name | explanation | bind | Configure this to bind to a specific inetaddress. This is an optional integer value. This value is the port on which this IMAP4 server is configured to listen. If the tag or value is absent then the service will bind to all network interfaces for the machine If the tag or value is omitted, the value will default to the standard IMAP4 port port 143 is the well-known/IANA registered port for IMAP port 993 is the well-known/IANA registered port for IMAPS ie over SSL/TLS | connectionBacklog | Number of connection backlog of the server (maximum number of queued connection requests) | compress | true or false - Use or don't use COMPRESS extension. Defaults to false. | maxLineLength | Maximal allowed line-length before a BAD response will get returned to the client This should be set with caution as a to high value can make the server a target for DOS (Denial of Service)! | inMemorySizeLimit | Optional. Size limit before we will start to stream to a temporary file. Defaults to 10MB. Must be a positive integer, optionally with a unit: B, K, M, G. | literalSizeLimit | Optional. Maximum size of a literal (IMAP APPEND). Defaults to 0 (unlimited). Must be a positive integer, optionally with a unit: B, K, M, G. | plainAuthDisallowed | Deprecated. Should use `auth.plainAuthEnabled`, `auth.requireSSL` instead. Whether to enable Authentication PLAIN if the connection is not encrypted via SSL or STARTTLS. Defaults to `true`. | auth.plainAuthEnabled | Whether to enable Authentication PLAIN/ LOGIN command. Defaults to `true`. | auth.requireSSL ===================================================== == File: docs/modules/servers/partials/configure/ssl.adoc ===================================================== This document explains how to enable James 3.0 servers to use Transport Layer Security (TLS) for encrypted client-server communication. == Configure a Server to Use SSL/TLS Each of the servers xref:{pages-path}/configure/smtp.adoc[SMTP - LMTP], xref:{pages-path}/configure/pop3.adoc[POP3] and xref:{pages-path}/configure/imap.adoc[IMAP] supports use of SSL/TLS. TLS (Transport Layer Security) and SSL (Secure Sockets Layer) are protocols that provide data encryption and authentication between applications in scenarios where that data is being sent across an insecure network, such as checking your email (How does the Secure Socket Layer work?). The terms SSL and TLS are often used interchangeably or in conjunction with each other (TLS/SSL), but one is in fact the predecessor of the other — SSL 3.0 served as the basis for TLS 1.0 which, as a result, is sometimes referred to as SSL 3.1. You need to add a block in the corresponding configuration file (smtpserver.xml, pop3server.xml, imapserver.xml,..) [source,xml] .... <tls socketTLS="false" startTLS="true"> <keystore>file://conf/keystore</keystore> <keystoreType>PKCS12</keystoreType> <secret>yoursecret</secret> <provider>org.bouncycastle.jce.provider.BouncyCastleProvider</provider> </tls> .... Alternatively TLS keys can be supplied via PEM files: [source,xml] .... <tls socketTLS="true" startTLS="false"> <privateKey>file://conf/private.key</privateKey> <certificates>file://conf/certs.self-signed.csr</certificates> </tls> .... An optional secret might be specified for the private key: [source,xml] .... <tls socketTLS="true" startTLS="false"> <privateKey>file://conf/private.key</privateKey> <certificates>file://conf/certs.self-signed.csr</certificates> <secret>yoursecret</secret> </tls> .... ===================================================== == File: docs/modules/servers/partials/configure/systemPropertiesPartial.adoc ===================================================== == System properties Some tuning can be done via system properties. This includes: .System properties |=== | Property name | explanation | james.message.memory.threshold | (Optional). String (size, integer + size units, example: `12 KIB`, supported units are bytes KIB MIB GIB TIB). Defaults to 100KIB. This governs the threshold MimeMessageInputStreamSource relies on for storing MimeMessage content on disk. Below, data is stored in memory. Above data is stored on disk. Lower values will lead to longer processing time but will minimize heap memory usage. Modern SSD hardware should however support a high throughput. Higher values will lead to faster single mail processing at the cost of higher heap usage. | james.message.usememorycopy |Optional. Boolean. Defaults to false. Recommended value is false. Should MimeMessageWrapper use a copy of the message in memory? Or should bigger message exceeding james.message.memory.threshold be copied to temporary files? |=== ===================================================== == File: docs/modules/servers/partials/configure/smtp.adoc ===================================================== == Incoming SMTP Consult this link:{sample-configuration-prefix-url}/smtpserver.xml[example] to get some examples and hints. The SMTP service is controlled by a configuration block in the smptserver.xml. The smtpserver tag defines the boundaries of the configuration block. It encloses all the relevant configuration for the SMTP server. The behavior of the SMTP service is controlled by the attributes and children of this tag. This tag has an optional boolean attribute - *enabled* - that defines whether the service is active or not. The value defaults to "true" if not present. The standard children of the smtpserver tag are: .smtpserver.xml content |=== | Property name | explanation | bind | A list of address:port separed by comma - This is an optional value. If present, this value is a string describing the IP address to which this service should be bound. If the tag or value is absent then the service will bind to all network interfaces for the machine on port 25. Port 25 is the well-known/IANA registered port for SMTP. Port 465 is the well-known/IANA registered port for SMTP over TLS. | connectBacklog |The IP address (host name) the MBean Server will bind/listen to. | tls | Set to true to support STARTTLS or SSL for the Socket. To use this you need to copy sunjce_provider.jar to /path/james/lib directory. To create a new keystore execute: `keytool -genkey -alias james -keyalg RSA -storetype PKCS12 -keystore /path/to/james/conf/keystore`. The algorithm is optional and only needs to be specified when using something other than the Sun JCE provider - You could use IbmX509 with IBM Java runtime. Please note that each SMTP/LMTP server exposed on different port can specify its own keystore, independently from any other TLS based protocols. | helloName | This is a required tag with an optional body that defines the server name used in the initial service greeting. The tag may have an optional attribute - *autodetect*. If the autodetect attribute is present and true, the service will use the local hostname returned by the Java libraries. If autodetect is absent or false, the body of the tag will be used. In this case, if nobody is present, the value "localhost" will be used. | connectionTimeout | This is an optional tag with a non-negative integer body. Connection timeout in seconds. | connectionLimit | Set the maximum simultaneous incoming connections for this service. ===================================================== == File: docs/modules/servers/partials/configure/mailetcontainer.adoc ===================================================== This documents explains how to configure Mail processing. Mails pass through the MailetContainer. The MailetContainer is a Matchers (condition for executing a mailet) and Mailets (execution units that perform actions based on incoming mail) pipeline arranged into processors (List of mailet/matcher pairs allowing better logical organisation). You can read more about these concepts on xref:{pages-path}/architecture/index.adoc#_mail_processing[the mailet container feature description]. Apache James Server includes a number of xref:{pages-path}/configure/mailets.adoc[Packaged Mailets] and xref:{pages-path}/configure/matchers.adoc[Packaged Matchers]. Furthermore, you can write and use with James xref:customization:mail-processing.adoc[your own mailet and matchers]. Consult this link:{sample-configuration-prefix-url}/mailetcontainer.xml[example] to get some examples and hints. .mailetcontainer.xml content |=== | Property name | explanation | context.postmaster | The body of this element is the address that the server will consider its postmaster address. This address will be listed as the sender address of all error messages that originate from James. Also, all messages addressed to postmaster@<servername>, where <servername> is one of the domain names whose mail is being handled by James, will be redirected to this email address. Set this to the appropriate email address for error reports If this is set to a non-local email address, the mail server will still function, but will generate a warning on startup. | spooler.threads | Number of simultaneous threads used to spool the mails. Set to zero, it disables mail processing - use with caution. | spooler.errorRepository | Mail repository to store email in after several unrecoverable errors. Mails failing processing, for which the Mailet Container could not handle Error, will be stored there after their processing had been attempted 5 times. Note that if standard java Exception occurs, *Error handling* section below will be applied instead. |=== == The Mailet Tag The mailet tag has two required attributes, condition tag and *class* tag. The condition tag need to be one of these tag: - The *match* attribute is set to the value of the specific Matcher class to be instantiated with a an optional argument. If present, the argument is separated from the Matcher class name by an '='. Semantic interpretation of the argument is left to the particular mailet. Example: ===================================================== == File: docs/modules/servers/partials/configure/webadmin.adoc ===================================================== The web administration supports for now the CRUD operations on: - The domains - The users - Their mailboxes - Their quotas - Managing mail repositories - Performing cassandra migrations [small]*_(only for Distributed James Server that uses cassandra as backend)_* - And much more, as described in the following sections. *WARNING*: This API allows authentication only via the use of JWT. If not configured with JWT, an administrator should ensure an attacker can not use this API. By the way, some endpoints are not filtered by authentication. Those endpoints are not related to data stored in James, for example: Swagger documentation & James health checks. == Configuration Consult this link:{sample-configuration-prefix-url}/webadmin.properties[example] to get some examples and hints. .webadmin.properties content |=== | Property name | explanation | enabled | Define if WebAdmin is launched (default: false) | port | Define WebAdmin's port (default: 8080) | host | Define WebAdmin's host (default: localhost, use 0.0.0.0 to listen on all addresses) | cors.enable | Allow the Cross-origin resource sharing (default: false) | cors.origin | Specify ths CORS origin (default: null) | jwt.enable | Allow JSON Web Token as an authentication mechanism (default: false) | https.enable | Use https (default: false) | https.keystore | Specify a keystore file for https (default: null) ===================================================== == File: docs/modules/servers/partials/configure/recipientrewritetable.adoc ===================================================== Here are explanations on the different kinds about xref:{pages-path}/architecture/index.adoc#_recipient_rewrite_tables[recipient rewriting]. Consult this link:{sample-configuration-prefix-url}/recipientrewritetable.xml[example] to get some examples and hints. .recipientrewritetable.xml |=== | Property name | explanation | recursiveMapping | If set to false only the first mapping will get processed - Default true. | mappingLimit |By setting the mappingLimit you can specify how much mapping will get processed before a bounce will send. This avoids infinity loops. Default 10. |=== ===================================================== == File: docs/modules/servers/partials/configure/rabbitmq.adoc ===================================================== This configuration helps you configure components using RabbitMQ. Consult this link:{sample-configuration-prefix-url}/rabbitmq.properties[example] to get some examples and hints. == RabbitMQ Configuration .rabbitmq.properties content |=== | Property name | explanation | uri | the amqp URI pointing to RabbitMQ server. If you use a vhost, specify it as well at the end of the URI. Details about amqp URI format is in https://www.rabbitmq.com/uri-spec.html[RabbitMQ URI Specification] | management.uri | the URI pointing to RabbitMQ Management Service. James need to retrieve some information about listing queues from this service in runtime. Details about URI format is in https://www.rabbitmq.com/management.html#usage-ui[RabbitMQ Management URI] | management.user | username used to access management service | management.password | password used to access management service | connection.pool.retries | Configure retries count to retrieve a connection. Exponential backoff is performed between each retries. Optional integer, defaults to 10 | connection.pool.min.delay.ms | Configure initial duration (in ms) between two connection retries. Exponential backoff is performed between each retries. Optional integer, defaults to 100 | channel.pool.retries | Configure retries count to retrieve a channel. Exponential backoff is performed between each retries. Optional integer, defaults to 3 | channel.pool.max.delay.ms | Configure timeout duration (in ms) to obtain a rabbitmq channel. Defaults to 30 seconds. Optional integer, defaults to 30 seconds. | channel.pool.size | Configure the size of the channel pool. Optional integer, defaults to 3 | driver.network.recovery.interval | Optional, non-negative integer, default to 100ms. The interval (in ms) that RabbitMQ driver will automatic recovery wait before attempting to reconnect. See https://www.rabbitmq.com/client-libraries/java-api-guide#connection-recovery | ssl.enabled ===================================================== == File: docs/modules/servers/partials/configure/spam.adoc ===================================================== Anti-Spam system can be configured via two main different mechanisms: * SMTP Hooks; * Mailets; == AntiSpam SMTP Hooks "FastFail" SMTP Hooks acts to reject before spooling on the SMTP level. The Spam detector hook can be used as a fastfail hook, therefore Spam filtering system must run as a server on the same machine as the Apache James Server. SMTP Hooks for non-existent users, DSN filter, domains with invalid MX record, can also be configured. *SpamAssassinHandler* (experimental) also enables to classify the messages as spam or not with a configurable score threshold (`0.0`, non-configurable). Only a global database is supported. Per user spam detection is not supported by this hook. == AntiSpam Mailets James' repository provide two AntiSpam mailets: SpamAssassin and RspamdScanner. We can select one in them for filtering spam mail. * *SpamAssassin and RspamdScanner* Mailet is designed to classify the messages as spam or not with a configurable score threshold. Usually a message will only be considered as spam if it matches multiple criteria; matching just a single test will not usually be enough to reach the threshold. Note that this mailet is executed on a per-user basis. === Rspamd The Rspamd extension (optional) requires an extra configuration file `rspamd.properties` to configure RSpamd connection .rspamd.properties content |=== | Property name | explanation | rSpamdUrl | URL defining the Rspamd's server. Eg: http://rspamd:11334 | rSpamdPassword | Password for pass authentication when request to Rspamd's server. Eg: admin | rspamdTimeout | Integer. Timeout for http requests to Rspamd. Default to 15 seconds. | perUserBayes | Boolean. Whether to scan/learn mails using per-user Bayes. Default to false. |=== `RspamdScanner` supports the following options: ===================================================== == File: docs/modules/servers/partials/configure/remote-delivery-error-handling.adoc ===================================================== The advanced server mailQueue implemented by combining RabbitMQ for messaging and {mailet-repository-path-prefix} for administrative operation does not support delays. Delays are an important feature for Mail Exchange servers, allowing to defer in time the retries, potentially letting the time for the remote server to recover. Furthermore, they enable implementation of advanced features like throttling and rate limiting of emails sent to a given domain. As such, the use of the distributed server as a Mail Exchange server is currently discouraged. However, for operators willing to inter-operate with a limited set of well-identified, trusted remote mail servers, such limitation can be reconsidered. The main concern then become error handling for remote mail server failures. The following document will present a well tested strategy for Remote Delivery error handling leveraging standards Mail Processing components and mechanisms. == Expectations Such a solution should: - Attempt delivery a single time - Store transient and permanent failure in different mail repositories - After a given number of tries, transient failures should be considered permanent == Design image::remote-delivery-error-handling.png[Schema detailing the proposed solution] - Remote Delivery is configured for performing a single retry. - Remote Delivery attaches the error code and if the failure is permanent/temporary when transferring failed emails to the bounce processor. - The specified bounce processor will categorise the failure, and store temporary and permanent failures in different mail repositories. - A reprocessing of the temporary delivery errors mailRepository needs to be scheduled in a recurring basis. For instance via a CRON job calling the right webadmin endpoint. - A counter ensures that a configured number of delivery tries is not exceeded. === Limitation MailRepositories are not meant for transient data storage, and thus are prone to tombstone issues. This might be acceptable if you need to send mail to well-known peers. For instance handling your mail gateway failures. However a Mail Exchange server doing relay on the internet would quickly hit this limitation. Also note that external triggering of the retry process is needed. == Operation Here is an example of configuration achieving the proposed solution: [subs=attributes+,xml] ---- ===================================================== == File: docs/modules/servers/partials/configure/forExtensionsPartial.adoc ===================================================== == For extensions By omitting these files, no extra behaviour is added. ** xref:{xref-base}/vault.adoc[*deletedMessageVault.properties*] allows to configure the DeletedMessageVault link:{sample-configuration-prefix-url}/sample-configuration/deletedMessageVault.properties[example] ** xref:{xref-base}/listeners.adoc[*listeners.xml*] enables configuration of Mailbox Listeners link:{sample-configuration-prefix-url}/sample-configuration/listeners.xml[example] ** xref:{xref-base}/extensions.adoc[*extensions.properties*] allows to extend James behaviour by loading your extensions in it link:{sample-configuration-prefix-url}/sample-configuration/extensions.properties[example] ** xref:{xref-base}/jvm.adoc[*jvm.properties*] lets you specify additional system properties without cluttering your command line ** xref:{xref-base}/spam.adoc[This page] documents Anti-Spam setup with SpamAssassin, Rspamd. ** xref:{xref-base}/remote-delivery-error-handling.adoc[This page] proposes a simple strategy for RemoteDelivery error handling. ** xref:{xref-base}/collecting-contacts.adoc[This page] documents contact collection ** xref:{xref-base}/collecting-events.adoc[This page] documents event collection ** xref:{xref-base}/dsn.adoc[This page] specified how to support SMTP Delivery Submission Notification (link:https://tools.ietf.org/html/rfc3461[RFC-3461]) ** xref:{xref-base}/droplists.adoc[This page] allows configuring drop lists. ===================================================== == File: docs/modules/servers/partials/configure/dns.adoc ===================================================== Consult this link:{sample-configuration-prefix-url}/dnsservice.xml[example] to get some examples and hints. Specifies DNS Server information for use by various components inside Apache James Server. DNS Transport services are controlled by a configuration block in the dnsservice.xml. This block affects SMTP remote delivery. The dnsservice tag defines the boundaries of the configuration block. It encloses all the relevant configuration for the DNS server. The behavior of the DNS service is controlled by the attributes and children of this tag. .dnsservice.xml content |=== | Property name | explanation | servers | Information includes a list of DNS Servers to be used by James. These are specified by the server elements, each of which is a child element of the servers element. Each server element is the IP address of a single DNS server. The server elements can have multiple server children. Enter ip address of your DNS server, one IP address per server element. If no DNS servers are found and you have not specified any below, 127.0.0.1 will be used | autodiscover | true or false - If you use autodiscover and add DNS servers manually a combination of all the DNS servers will be used. If autodiscover is true, James will attempt to autodiscover the DNS servers configured on your underlying system. Currently, this works if the OS has a unix-like /etc/resolv.xml, or the system is Windows based with ipconfig or winipcfg. Change autodiscover to false if you would like to turn off autodiscovery and set the DNS servers manually in the servers section | authoritative | *true/false* - This tag specifies whether or not to require authoritative (non-cached) DNS records; to only accept DNS responses that are authoritative for the domain. It is primarily useful in an intranet/extranet environment. This should always be *false* unless you understand the implications. | maxcachesize | Maximum number of entries to maintain in the DNS cache (typically 50000) | negativeCacheTTL | Sets the maximum length of time that negative records will be stored in the DNS negative cache in seconds (a negative record means the name has not been found in the DNS). Values for this cache can be positive meaning the time in seconds before retrying to resolve the name, zero meaning no cache or a negative value meaning infinite caching. | singleIPperMX | true or false (default) - Specifies if Apache James Server must try a single server for each multihomed mx host | verbose ===================================================== == File: docs/modules/servers/partials/configure/redis.adoc ===================================================== This configuration helps you configure components using Redis. This so far only includes optional rate limiting component. Consult this link:https://github.com/apache/james-project/blob/fabfdf4874da3aebb04e6fe4a7277322a395536a/server/mailet/rate-limiter-redis/redis.properties[example] to get some examples and hints. == Redis Configuration .redis.properties content |=== | Property name | explanation | redisURL | the Redis URI pointing to Redis server. Compulsory. The value must fit redis.topology Reference: https://github.com/redis/lettuce/wiki/Redis-URI-and-connection-details | redis.topology | Redis server topology. Defaults to standalone. Possible values: standalone, cluster, master-replica, sentinel | redis.readFrom | The property to determine how Lettuce routes read operations to Redis server with topologies other than standalone. Defaults to master. Possible values: master, masterPreferred, replica, replicaPreferred, any Reference: https://github.com/redis/lettuce/wiki/ReadFrom-Settings | redis.sentinelPassword | Redis sentinel password. If not specified, the redis driver will not set password for sentinel. | redis.ssl.enabled | To enable ssl connection. Defaults to false. Read TLS/SSL for more details. | redis.ioThreads | IO threads to be using for the underlying Netty networking resources. If unspecified driver defaults applies. | redis.workerThreads | Worker threads to be using for the underlying driver. If unspecified driver defaults applies. |=== == Enabling Multithreading in Redis Redis 6 and later versions support multithreading, but by default, Redis operates as a single-threaded process. On a virtual machine with multiple CPU cores, you can enhance Redis performance by enabling multithreading. This can significantly improve I/O operations, particularly for workloads with high concurrency or large data volumes. See link:https://redis.io/docs/latest/operate/oss_and_stack/management/config-file/[THREADED I/O section]. Example if you have a 4 cores CPU, you can enable the following lines in the `redis.conf` file: .... io-threads 3 io-threads-do-reads yes .... ===================================================== == File: docs/modules/servers/partials/configure/healthcheck.adoc ===================================================== Consult this link:{sample-configuration-prefix-url}/healthcheck.properties[example] to get some examples and hints. Use this configuration to define the initial delay and period for the PeriodicalHealthChecks. It is only applicable with Guice products. .healthcheck.properties content |=== | Property name | explanation | healthcheck.period | Define the period between two periodical health checks (default: 60s). Units supported are (ms - millisecond, s - second, m - minute, h - hour, d - day). Default unit is millisecond. | reception.check.user | User to be using for running the "mail reception" health check. The user must exist. If not specified, the mail reception check is a noop. | reception.check.timeout | Period after which mail reception is considered faulty. Defaults to one minute. | additional.healthchecks | List of fully qualified HealthCheck class names in addition to James' default healthchecks. Default to empty list. |=== ===================================================== == File: docs/modules/servers/partials/configure/usersrepository.adoc ===================================================== User repositories are required to store James user information and authentication data. Consult this link:{sample-configuration-prefix-url}/usersrepository.xml[example] to get some examples and hints. == The user data model A user has two attributes: username and password. A valid user should satisfy these criteria: * username and password cannot be null or empty * username should not be longer than 255 characters * username can not contain '/' * username can not contain multiple domain delimiter('@') * A username can have only a local part when virtualHosting is disabled. E.g.'myUser' * When virtualHosting is enabled, a username should have a domain part, and the domain part should be concatenated after a domain delimiter('@'). E.g. 'myuser@james.org' A user is always considered as lower cased, so 'myUser' and 'myuser' are the same user, and can be used as well as recipient local part than as login for different protocols. == Configuration .usersrepository.xml content |=== | Property name | explanation | enableVirtualHosting | true or false. Add domain support for users (default: false, except for Cassandra Users Repository) | administratorId |user's name. Allow a user to access to the https://tools.ietf.org/html/rfc4616#section-2[impersonation command], acting on the behalf of any user. | administratorIds | List of usernames. Allows multiple administrators to access the https://tools.ietf.org/html/rfc4616#section-2[impersonation command], acting on behalf of any user by specifying multiple `<administratorId>` entries inside the `<administratorIds>` block. Notes: Only one of the above `<administratorId>` property or this `<administratorIds>` block should be used to specify the administrator(s). | verifyFailureDelay | Delay after a failed authentication attempt with an invalid user name or password. Duration string defaulting to seconds, e.g. `2`, `2s`, `2000ms`. Default `0s` (disabled). | algorithm | use a specific hash algorithm to compute passwords, with optional mode `plain` (default) or `salted`; e.g. `SHA-512`, `SHA-512/plain`, `SHA-512/salted`, `PBKDF2`, `PBKDF2-SHA512` (default). Note: When using `PBKDF2` or `PBKDF2-SHA512` one can specify the iteration count and the key size in bytes. You can specify it as part of the algorithm. EG: `PBKDF2-SHA512-2000-512` will use 2000 iterations with a key size of 512 bytes. | hashingMode ===================================================== == File: docs/modules/servers/partials/configure/opensearch.adoc ===================================================== == Search overrides *Search overrides* allow resolution of predefined search queries against alternative sources of data and allow bypassing OpenSearch. This is useful to handle most resynchronisation queries that are simple enough to be resolved against {package-tag}. Possible values are: - `org.apache.james.mailbox.{package-tag}.search.AllSearchOverride` Some IMAP clients uses SEARCH ALL to fully list messages in a mailbox and detect deletions. This is typically done by clients not supporting QRESYNC and from an IMAP perspective is considered an optimisation as less data is transmitted compared to a FETCH command. Resolving such requests against Cassandra is enabled by this search override and likely desirable. - `org.apache.james.mailbox.{package-tag}.search.UidSearchOverride`. Same as above but restricted by ranges. - `org.apache.james.mailbox.{package-tag}.search.DeletedSearchOverride`. Find deleted messages by looking up in the relevant Cassandra table. - `org.apache.james.mailbox.{package-tag}.search.DeletedWithRangeSearchOverride`. Same as above but limited by ranges. - `org.apache.james.mailbox.{package-tag}.search.NotDeletedWithRangeSearchOverride`. List non deleted messages in a given range. Lists all messages and filters out deleted message thus this is based on the following heuristic: most messages are not marked as deleted. - `org.apache.james.mailbox.{package-tag}.search.UnseenSearchOverride`. List unseen messages in the corresponding cassandra projection. Please note that custom overrides can be defined here. `opensearch.search.overrides` allow specifying search overrides and is a coma separated list of search override FQDNs. Default to none. EG: [subs=attributes+] ---- opensearch.search.overrides=org.apache.james.mailbox.{package-tag}.search.AllSearchOverride,org.apache.james.mailbox.{package-tag}.search.DeletedSearchOverride, org.apache.james.mailbox.{package-tag}.search.DeletedWithRangeSearchOverride,org.apache.james.mailbox.{package-tag}.search.NotDeletedWithRangeSearchOverride,org.apache.james.mailbox.{package-tag}.search.UidSearchOverride,org.apache.james.mailbox.{package-tag}.search.UnseenSearchOverride ---- Consult this link:{sample-configuration-prefix-url}/opensearch.properties[example] to get some examples and hints. If you want more explanation about OpenSearch configuration, you should visit the dedicated https://opensearch.org/[documentation]. == OpenSearch Configuration This file section is used to configure the connection tp an OpenSearch cluster. Here are the properties allowing to do so : .opensearch.properties content |=== | Property name | explanation | opensearch.clusterName | Is the name of the cluster used by James. | opensearch.nb.shards | Number of shards for index provisionned by James ===================================================== == File: docs/modules/servers/partials/configure/pop3.adoc ===================================================== Consult this link:{sample-configuration-prefix-url}/pop3server.xml[example] to get some examples and hints. The POP3 service is controlled by a configuration block in the pop3server.xml. The pop3server tag defines the boundaries of the configuration block. It encloses all the relevant configuration for the POP3 server. The behavior of the POP service is controlled by the attributes and children of this tag. This tag has an optional boolean attribute - *enabled* - that defines whether the service is active or not. The value defaults to "true" if not present. The standard children of the pop3server tag are: .jmx.properties content |=== | Property name | explanation | bind | Configure this to bind to a specific inetaddress. This is an optional integer value. This value is the port on which this POP3 server is configured to listen. If the tag or value is absent then the service will bind to all network interfaces for the machine If the tag or value is omitted, the value will default to the standard POP3 port, 11 port 995 is the well-known/IANA registered port for POP3S ie over SSL/TLS port 110 is the well-known/IANA registered port for Standard POP3 | connectionBacklog | | tls | Set to true to support STARTTLS or SSL for the Socket. To create a new keystore execute: `keytool -genkey -alias james -keyalg RSA -storetype PKCS12 -keystore /path/to/james/conf/keystore` Please note that each POP3 server exposed on different port can specify its own keystore, independently from any other TLS based protocols. Read xref:{pages-path}/configure/ssl.adoc[SSL configuration page] for more information. | handler.helloName | This is the name used by the server to identify itself in the POP3 protocol. If autodetect is TRUE, the server will discover its own host name and use that in the protocol. If discovery fails, the value of 'localhost' is used. If autodetect is FALSE, James will use the specified value. | handler.connectiontimeout | Connection timeout in seconds | handler.connectionLimit | Set the maximum simultaneous incoming connections for this service | handler.connectionLimitPerIP ===================================================== == File: docs/modules/servers/partials/MetricsMailet.adoc ===================================================== === MetricsMailet This Metrics mailet increments a counter on every incoming emails. This counter is accessible via JMX, or grafana. Read xref:distributed/operate/metrics.adoc[more about metrics]. Example : .... <mailet match="all" class="MetricsMailet"> <metricName>relayDenied</metricName> </mailet> .... Will increment a counter relayDenied ===================================================== == File: docs/modules/servers/partials/PartHasContentType.adoc ===================================================== === PartHasContentType Checks if at least one attachment has a content type header which matches any element of a comma-separated or space-separated list of content type masks. Syntax: *match="PartHasContentType=[-d] masks"* The match is case-insensitive. Multiple content types name masks can be specified, e.g.: 'application/json,image/png'. If '*-d*' is coded, some debug info will be logged. ===================================================== == File: docs/modules/servers/partials/SMTPAuthUserIs.adoc ===================================================== === SMTPAuthUserIs Matches mails that are sent by an SMTP authenticated user present in a supplied list. If the sender was not authenticated it will not match. Configuration string: a comma, tab or space separated list of James users. .... <mailet match="SMTPAuthUserIs=<list-of-user-names>" class="<any-class>"> .... ===================================================== == File: docs/modules/servers/partials/AddDeliveredToHeader.adoc ===================================================== === AddDeliveredToHeader This mailet adds the de-facto standard QMail Delivered-To header. Upon processing by LocalDelivery, a Delivered-To header matching the recipient mail address will be added before storage. Example .... <mailet match="All" class="AddDeliveredToHeader"> .... ===================================================== == File: docs/modules/servers/partials/SMIMEDecrypt.adoc ===================================================== === SMIMEDecrypt This mailet decrypts a s/mime encrypted message. It takes as input an encrypted message and it tries to dechiper it using the key specified in its configuration. If the decryption is successful the mail will be changed and it will contain the decrypted message. The mail attribute *org.apache.james.SMIMEDecrypt* will contain the public certificate of the key used in the process. The configuration parameters of this mailet are summarized below. The firsts define the keystore where the key that will be used to decrypt messages is saved. * keyStoreType (default: system dependent): defines the type of the store. Usually jks, pkcs12 or pkcs7 * keyStoreFileName (mandatory): private key store path. * keyStorePassword (default: ""): private key store password The other parameters define which private key have to be used. (if the store contains more than one key). * keyAlias: private key alias. * keyPass: private key password ===================================================== == File: docs/modules/servers/partials/SizeGreaterThan.adoc ===================================================== === SizeGreaterThan Checks whether the message (entire message, not just content) is greater than a certain number of bytes. You can use 'k' and 'm' as optional postfixes. In other words, "1m" is the same as writing "1024k", which is the same as "1048576". ===================================================== == File: docs/modules/servers/assets/images/storage_james_postgres.svg ===================================================== <svg version="1.1" viewBox="0.0 0.0 960.0 720.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="p.0"><path d="m0 0l960.0 0l0 720.0l-960.0 0l0 -720.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 720.0l-960.0 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m191.9685 138.49081l0 0c0 -12.428581 27.624374 -22.503937 61.70079 -22.503937l0 0c34.0764 0 61.70079 10.075356 61.70079 22.503937l0 0c0 12.428574 -27.62439 22.503937 -61.70079 22.503937l0 0c-34.076416 0 -61.70079 -10.075363 -61.70079 -22.503937z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m191.9685 138.49081l0 0c0 -12.428581 27.624374 -22.503937 61.70079 -22.503937l0 0c34.0764 0 61.70079 10.075356 61.70079 22.503937l0 0c0 12.428574 -27.62439 22.503937 -61.70079 22.503937l0 0c-34.076416 0 -61.70079 -10.075363 -61.70079 -22.503937z" fill-rule="evenodd"/><path fill="#000000" d="m222.79604 142.16081l1.359375 -0.1875q0.0625 1.3125 0.5 1.796875q0.4375 0.484375 1.203125 0.484375q0.578125 0 0.984375 -0.265625q0.421875 -0.265625 0.578125 -0.703125q0.15625 -0.453125 0.15625 -1.4375l0 -7.890625l1.515625 0l0 7.796875q0 1.4375 -0.359375 2.234375q-0.34375 0.78125 -1.09375 1.203125q-0.75 0.421875 -1.765625 0.421875q-1.515625 0 -2.3125 -0.875q-0.796875 -0.875 -0.765625 -2.578125zm14.0 2.21875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm18.999985 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.8281097 0 -2.8906097 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.7968597 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1874847 0q0.078125 1.375 0.765625 2.109375q0.70310974 0.71875 1.7343597 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.6093597 -2.28125l4.6249847 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.6406097 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734222 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" d="m281.5887 145.41081l-1.640625 0l0 -10.453125q-0.59375 0.5625 -1.5625 1.140625q-0.953125 0.5625 -1.71875 0.84375l0 -1.59375q1.375 -0.640625 2.40625 -1.5625q1.03125 -0.921875 1.453125 -1.78125l1.0625 0l0 13.40625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m191.9685 200.93964l0 0c0 -12.428589 27.624374 -22.503937 61.70079 -22.503937l0 0c34.0764 0 61.70079 10.075348 61.70079 22.503937l0 0c0 12.428574 -27.62439 22.503937 -61.70079 22.503937l0 0c-34.076416 0 -61.70079 -10.075363 -61.70079 -22.503937z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m191.9685 200.93964l0 0c0 -12.428589 27.624374 -22.503937 61.70079 -22.503937l0 0c34.0764 0 61.70079 10.075348 61.70079 22.503937l0 0c0 12.428574 -27.62439 22.503937 -61.70079 22.503937l0 0c-34.076416 0 -61.70079 -10.075363 -61.70079 -22.503937z" fill-rule="evenodd"/><path fill="#000000" d="m222.79604 204.60963l1.359375 -0.1875q0.0625 1.3125 0.5 1.796875q0.4375 0.484375 1.203125 0.484375q0.578125 0 0.984375 -0.265625q0.421875 -0.265625 0.578125 -0.703125q0.15625 -0.453125 0.15625 -1.4375l0 -7.890625l1.515625 0l0 7.796875q0 1.4375 -0.359375 2.234375q-0.34375 0.78125 -1.09375 1.203125q-0.75 0.421875 -1.765625 0.421875q-1.515625 0 -2.3125 -0.875q-0.796875 -0.875 -0.765625 -2.578125zm14.0 2.21875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm18.999985 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.8281097 0 -2.8906097 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.7968597 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1874847 0q0.078125 1.375 0.765625 2.109375q0.70310974 0.71875 1.7343597 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.6093597 -2.28125l4.6249847 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.6406097 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734222 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" d="m284.0262 206.28151l0 1.578125l-8.828125 0q-0.015625 -0.59375 0.1875 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m194.93439 263.38846l0 0c0 -12.428589 27.624374 -22.503937 61.700775 -22.503937l0 0c34.076416 0 61.700806 10.075348 61.700806 22.503937l0 0c0 12.428589 -27.62439 22.503937 -61.700806 22.503937l0 0c-34.0764 0 -61.700775 -10.075348 -61.700775 -22.503937z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m194.93439 263.38846l0 0c0 -12.428589 27.624374 -22.503937 61.700775 -22.503937l0 0c34.076416 0 61.700806 10.075348 61.700806 22.503937l0 0c0 12.428589 -27.62439 22.503937 -61.700806 22.503937l0 0c-34.0764 0 -61.700775 -10.075348 -61.700775 -22.503937z" fill-rule="evenodd"/><path fill="#000000" d="m225.7619 267.05844l1.359375 -0.1875q0.0625 1.3125 0.5 1.796875q0.4375 0.484375 1.203125 0.484375q0.578125 0 0.984375 -0.265625q0.421875 -0.265625 0.578125 -0.703125q0.15625 -0.453125 0.15625 -1.4375l0 -7.890625l1.515625 0l0 7.796875q0 1.4375 -0.359375 2.234375q-0.34375 0.78125 -1.09375 1.203125q-0.75 0.421875 -1.765625 0.421875q-1.515625 0 -2.3125 -0.875q-0.796875 -0.875 -0.765625 -2.578125zm14.0 2.21875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 4.171875l0 -8.296875l1.25 0l0 1.15625q0.390625 -0.609375 1.03125 -0.96875q0.65625 -0.375 1.484375 -0.375q0.921875 0 1.515625 0.390625q0.59375 0.375 0.828125 1.0625q0.984375 -1.453125 2.5625 -1.453125q1.234375 0 1.890625 0.6875q0.671875 0.671875 0.671875 2.09375l0 5.703125l-1.390625 0l0 -5.234375q0 -0.84375 -0.140625 -1.203125q-0.140625 -0.375 -0.5 -0.59375q-0.359375 -0.234375 -0.84375 -0.234375q-0.875 0 -1.453125 0.578125q-0.578125 0.578125 -0.578125 1.859375l0 4.828125l-1.40625 0l0 -5.390625q0 -0.9375 -0.34375 -1.40625q-0.34375 -0.46875 -1.125 -0.46875q-0.59375 0 -1.09375 0.3125q-0.5 0.3125 -0.734375 0.921875q-0.21875 0.59375 -0.21875 1.71875l0 4.3125l-1.40625 0zm19.0 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.2734375 2.46875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" d="m278.38272 266.7772l1.640625 -0.21875q0.28125 1.40625 0.953125 2.015625q0.6875 0.609375 1.65625 0.609375q1.15625 0 1.953125 -0.796875q0.796875 -0.796875 0.796875 -1.984375q0 -1.125 -0.734375 -1.859375q-0.734375 -0.734375 -1.875 -0.734375q-0.46875 0 -1.15625 0.171875l0.1875 -1.4375q0.15625 0.015625 0.265625 0.015625q1.046875 0 1.875 -0.546875q0.84375 -0.546875 0.84375 -1.671875q0 -0.90625 -0.609375 -1.5q-0.609375 -0.59375 -1.578125 -0.59375q-0.953125 0 -1.59375 0.609375q-0.640625 0.59375 -0.8125 1.796875l-1.640625 -0.296875q0.296875 -1.640625 1.359375 -2.546875q1.0625 -0.90625 2.65625 -0.90625q1.09375 0 2.0 0.46875q0.921875 0.46875 1.40625 1.28125q0.5 0.8125 0.5 1.71875q0 0.859375 -0.46875 1.578125q-0.46875 0.703125 -1.375 1.125q1.1875 0.28125 1.84375 1.140625q0.65625 0.859375 0.65625 2.15625q0 1.734375 -1.28125 2.953125q-1.265625 1.21875 -3.21875 1.21875q-1.765625 0 -2.921875 -1.046875q-1.15625 -1.046875 -1.328125 -2.71875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m154.29921 77.191605l212.59843 0l0 247.49605l-212.59843 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0,1.0,3.0" d="m154.29921 77.191605l212.59843 0l0 247.49605l-212.59843 0z" fill-rule="evenodd"/><path fill="#fff2cc" d="m117.20998 178.4357l68.220474 0l0 45.007874l-68.220474 0z" fill-rule="evenodd"/><path stroke="#fff2cc" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0,1.0,3.0" d="m117.20998 178.4357l68.220474 0l0 45.007874l-68.220474 0z" fill-rule="evenodd"/><path fill="#000000" d="m141.93422 198.17963l0 -7.625l0.9375 0l0 7.625l-0.9375 0zm2.0393524 -2.765625q0 -1.53125 0.84375 -2.265625q0.71875 -0.625 1.734375 -0.625q1.140625 0 1.859375 0.75q0.734375 0.75 0.734375 2.0625q0 1.0625 -0.328125 1.6875q-0.3125 0.609375 -0.921875 0.953125q-0.609375 0.328125 -1.34375 0.328125q-1.15625 0 -1.875 -0.734375q-0.703125 -0.75 -0.703125 -2.15625zm0.953125 0q0 1.0625 0.46875 1.59375q0.46875 0.53125 1.15625 0.53125q0.703125 0 1.15625 -0.53125q0.46875 -0.53125 0.46875 -1.625q0 -1.015625 -0.46875 -1.546875q-0.453125 -0.53125 -1.15625 -0.53125q-0.6875 0 -1.15625 0.53125q-0.46875 0.515625 -0.46875 1.578125zm8.926498 2.078125q-0.53125 0.453125 -1.015625 0.640625q-0.46875 0.171875 -1.015625 0.171875q-0.921875 0 -1.40625 -0.4375q-0.484375 -0.453125 -0.484375 -1.140625q0 -0.40625 0.171875 -0.734375q0.1875 -0.34375 0.484375 -0.546875q0.3125 -0.203125 0.6875 -0.3125q0.265625 -0.0625 0.828125 -0.140625q1.125 -0.125 1.671875 -0.3125q0 -0.203125 0 -0.25q0 -0.578125 -0.265625 -0.8125q-0.359375 -0.3125 -1.0625 -0.3125q-0.65625 0 -0.984375 0.234375q-0.3125 0.234375 -0.453125 0.8125l-0.921875 -0.125q0.125 -0.578125 0.40625 -0.9375q0.296875 -0.375 0.828125 -0.5625q0.546875 -0.203125 1.25 -0.203125q0.71875 0 1.15625 0.171875q0.4375 0.171875 0.640625 0.421875q0.21875 0.25 0.296875 0.640625q0.046875 0.234375 0.046875 0.859375l0 1.25q0 1.296875 0.0625 1.65625q0.0625 0.34375 0.234375 0.65625l-0.96875 0q-0.15625 -0.296875 -0.1875 -0.6875zm-0.078125 -2.078125q-0.515625 0.203125 -1.53125 0.34375q-0.578125 0.078125 -0.828125 0.1875q-0.234375 0.109375 -0.359375 0.3125q-0.125 0.1875 -0.125 0.4375q0 0.375 0.28125 0.625q0.28125 0.25 0.828125 0.25q0.53125 0 0.953125 -0.234375q0.421875 -0.234375 0.625 -0.65625q0.15625 -0.3125 0.15625 -0.9375l0 -0.328125zm5.9733734 2.765625l0 -0.703125q-0.515625 0.828125 -1.546875 0.828125q-0.65625 0 -1.21875 -0.359375q-0.546875 -0.375 -0.859375 -1.015625q-0.296875 -0.65625 -0.296875 -1.5q0 -0.828125 0.28125 -1.5q0.28125 -0.6875 0.828125 -1.046875q0.546875 -0.359375 1.234375 -0.359375q0.5 0 0.890625 0.21875q0.390625 0.203125 0.625 0.546875l0 -2.734375l0.9375 0l0 7.625l-0.875 0zm-2.953125 -2.75q0 1.046875 0.4375 1.578125q0.453125 0.53125 1.0625 0.53125q0.609375 0 1.03125 -0.5q0.4375 -0.515625 0.4375 -1.53125q0 -1.140625 -0.4375 -1.671875q-0.4375 -0.53125 -1.078125 -0.53125q-0.609375 0 -1.03125 0.515625q-0.421875 0.5 -0.421875 1.609375z" fill-rule="nonzero"/><path fill="#000000" d="m132.44435 211.17963l-0.859375 0l0 -7.625l0.9375 0l0 2.71875q0.59375 -0.75 1.5 -0.75q0.515625 0 0.96875 0.21875q0.453125 0.203125 0.75 0.578125q0.296875 0.359375 0.453125 0.890625q0.171875 0.53125 0.171875 1.125q0 1.421875 -0.703125 2.203125q-0.703125 0.765625 -1.6875 0.765625q-0.96875 0 -1.53125 -0.8125l0 0.6875zm0 -2.796875q0 0.984375 0.265625 1.421875q0.4375 0.734375 1.1875 0.734375q0.625 0 1.0625 -0.53125q0.453125 -0.546875 0.453125 -1.59375q0 -1.078125 -0.4375 -1.59375q-0.421875 -0.515625 -1.03125 -0.515625q-0.609375 0 -1.0625 0.53125q-0.4375 0.53125 -0.4375 1.546875zm8.676498 2.109375q-0.53125 0.453125 -1.015625 0.640625q-0.46875 0.171875 -1.015625 0.171875q-0.921875 0 -1.40625 -0.4375q-0.484375 -0.453125 -0.484375 -1.140625q0 -0.40625 0.171875 -0.734375q0.1875 -0.34375 0.484375 -0.546875q0.3125 -0.203125 0.6875 -0.3125q0.265625 -0.0625 0.828125 -0.140625q1.125 -0.125 1.671875 -0.3125q0 -0.203125 0 -0.25q0 -0.578125 -0.265625 -0.8125q-0.359375 -0.3125 -1.0625 -0.3125q-0.65625 0 -0.984375 0.234375q-0.3125 0.234375 -0.453125 0.8125l-0.921875 -0.125q0.125 -0.578125 0.40625 -0.9375q0.296875 -0.375 0.828125 -0.5625q0.546875 -0.203125 1.25 -0.203125q0.71875 0 1.15625 0.171875q0.4375 0.171875 0.640625 0.421875q0.21875 0.25 0.296875 0.640625q0.046875 0.234375 0.046875 0.859375l0 1.25q0 1.296875 0.0625 1.65625q0.0625 0.34375 0.234375 0.65625l-0.96875 0q-0.15625 -0.296875 -0.1875 -0.6875zm-0.078125 -2.078125q-0.515625 0.203125 -1.53125 0.34375q-0.578125 0.078125 -0.828125 0.1875q-0.234375 0.109375 -0.359375 0.3125q-0.125 0.1875 -0.125 0.4375q0 0.375 0.28125 0.625q0.28125 0.25 0.828125 0.25q0.53125 0 0.953125 -0.234375q0.421875 -0.234375 0.625 -0.65625q0.15625 -0.3125 0.15625 -0.9375l0 -0.328125zm2.3796234 2.765625l0 -7.625l0.9375 0l0 7.625l-0.9375 0zm5.9924774 -0.6875q-0.53125 0.453125 -1.015625 0.640625q-0.46875 0.171875 -1.015625 0.171875q-0.921875 0 -1.40625 -0.4375q-0.484375 -0.453125 -0.484375 -1.140625q0 -0.40625 0.171875 -0.734375q0.1875 -0.34375 0.484375 -0.546875q0.3125 -0.203125 0.6875 -0.3125q0.265625 -0.0625 0.828125 -0.140625q1.125 -0.125 1.671875 -0.3125q0 -0.203125 0 -0.25q0 -0.578125 -0.265625 -0.8125q-0.359375 -0.3125 -1.0625 -0.3125q-0.65625 0 -0.984375 0.234375q-0.3125 0.234375 -0.453125 0.8125l-0.921875 -0.125q0.125 -0.578125 0.40625 -0.9375q0.296875 -0.375 0.828125 -0.5625q0.546875 -0.203125 1.25 -0.203125q0.71875 0 1.15625 0.171875q0.4375 0.171875 0.640625 0.421875q0.21875 0.25 0.296875 0.640625q0.046875 0.234375 0.046875 0.859375l0 1.25q0 1.296875 0.0625 1.65625q0.0625 0.34375 0.234375 0.65625l-0.96875 0q-0.15625 -0.296875 -0.1875 -0.6875zm-0.078125 -2.078125q-0.515625 0.203125 -1.53125 0.34375q-0.578125 0.078125 -0.828125 0.1875q-0.234375 0.109375 -0.359375 0.3125q-0.125 0.1875 -0.125 0.4375q0 0.375 0.28125 0.625q0.28125 0.25 0.828125 0.25q0.53125 0 0.953125 -0.234375q0.421875 -0.234375 0.625 -0.65625q0.15625 -0.3125 0.15625 -0.9375l0 -0.328125zm2.3952484 2.765625l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm9.535873 -2.03125l0.921875 0.125q-0.15625 0.953125 -0.78125 1.5q-0.625 0.53125 -1.53125 0.53125q-1.125 0 -1.8125 -0.734375q-0.6875 -0.75 -0.6875 -2.125q0 -0.90625 0.296875 -1.578125q0.296875 -0.671875 0.890625 -1.0q0.609375 -0.34375 1.328125 -0.34375q0.890625 0 1.46875 0.46875q0.578125 0.453125 0.734375 1.28125l-0.90625 0.140625q-0.140625 -0.546875 -0.46875 -0.828125q-0.328125 -0.28125 -0.796875 -0.28125q-0.703125 0 -1.15625 0.515625q-0.4375 0.5 -0.4375 1.59375q0 1.109375 0.421875 1.625q0.4375 0.5 1.125 0.5q0.546875 0 0.90625 -0.34375q0.375 -0.34375 0.484375 -1.046875zm5.5 0.25l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm5.2077484 3.296875l0 -5.53125l0.84375 0l0 0.84375q0.328125 -0.59375 0.59375 -0.78125q0.28125 -0.1875 0.609375 -0.1875q0.46875 0 0.953125 0.3125l-0.3125 0.859375q-0.34375 -0.203125 -0.6875 -0.203125q-0.3125 0 -0.5625 0.1875q-0.234375 0.1875 -0.34375 0.515625q-0.15625 0.5 -0.15625 1.09375l0 2.890625l-0.9375 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m15.532808 200.91077l14.6608925 -27.585312l43.982674 0l14.660896 27.585312l-14.660896 27.585297l-43.982674 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m15.532808 200.91077l14.6608925 -27.585312l43.982674 0l14.660896 27.585312l-14.660896 27.585297l-43.982674 0z" fill-rule="evenodd"/><path fill="#000000" d="m45.444805 193.59076l0 -5.734375l1.140625 0l1.359375 4.0625q0.1875 0.5625 0.265625 0.84375q0.109375 -0.3125 0.3125 -0.921875l1.375 -3.984375l1.015625 0l0 5.734375l-0.734375 0l0 -4.796875l-1.65625 4.796875l-0.6875 0l-1.65625 -4.875l0 4.875l-0.734375 0zm9.3046875 -0.515625q-0.390625 0.328125 -0.75 0.46875q-0.359375 0.140625 -0.78125 0.140625q-0.671875 0 -1.046875 -0.328125q-0.359375 -0.34375 -0.359375 -0.859375q0 -0.3125 0.125 -0.5625q0.140625 -0.25 0.359375 -0.390625q0.234375 -0.15625 0.515625 -0.234375q0.203125 -0.0625 0.625 -0.109375q0.859375 -0.109375 1.25 -0.25q0.015625 -0.140625 0.015625 -0.171875q0 -0.4375 -0.203125 -0.609375q-0.265625 -0.234375 -0.796875 -0.234375q-0.5 0 -0.734375 0.171875q-0.234375 0.171875 -0.359375 0.609375l-0.6875 -0.09375q0.09375 -0.4375 0.3125 -0.703125q0.21875 -0.28125 0.625 -0.421875q0.40625 -0.15625 0.9375 -0.15625q0.53125 0 0.859375 0.125q0.34375 0.125 0.5 0.328125q0.15625 0.1875 0.21875 0.46875q0.03125 0.1875 0.03125 0.65625l0 0.9375q0 0.96875 0.046875 1.234375q0.046875 0.265625 0.171875 0.5l-0.734375 0q-0.109375 -0.21875 -0.140625 -0.515625zm-0.0625 -1.5625q-0.375 0.15625 -1.140625 0.265625q-0.4375 0.0625 -0.625 0.140625q-0.171875 0.078125 -0.265625 0.234375q-0.09375 0.140625 -0.09375 0.328125q0 0.28125 0.203125 0.46875q0.21875 0.1875 0.625 0.1875q0.40625 0 0.71875 -0.171875q0.328125 -0.1875 0.46875 -0.5q0.109375 -0.234375 0.109375 -0.703125l0 -0.25zm1.8085938 -2.84375l0 -0.8125l0.703125 0l0 0.8125l-0.703125 0zm0 4.921875l0 -4.15625l0.703125 0l0 4.15625l-0.703125 0zm1.7617188 0l0 -5.734375l0.703125 0l0 5.734375l-0.703125 0z" fill-rule="nonzero"/><path fill="#000000" d="m48.114727 197.85638l0.765625 0l0 3.3125q0 0.859375 -0.203125 1.375q-0.1875 0.5 -0.703125 0.828125q-0.515625 0.3125 -1.34375 0.3125q-0.796875 0 -1.3125 -0.265625q-0.515625 -0.28125 -0.734375 -0.8125q-0.21875 -0.53125 -0.21875 -1.4375l0 -3.3125l0.765625 0l0 3.3125q0 0.75 0.140625 1.109375q0.140625 0.34375 0.46875 0.53125q0.34375 0.1875 0.828125 0.1875q0.84375 0 1.1875 -0.375q0.359375 -0.375 0.359375 -1.453125l0 -3.3125zm1.6523438 4.5l0.6875 -0.109375q0.0625 0.40625 0.328125 0.640625q0.265625 0.21875 0.75 0.21875q0.484375 0 0.71875 -0.1875q0.234375 -0.203125 0.234375 -0.46875q0 -0.25 -0.203125 -0.375q-0.140625 -0.09375 -0.71875 -0.25q-0.78125 -0.1875 -1.078125 -0.328125q-0.296875 -0.140625 -0.453125 -0.390625q-0.15625 -0.265625 -0.15625 -0.5625q0 -0.28125 0.125 -0.515625q0.140625 -0.234375 0.359375 -0.390625q0.15625 -0.125 0.4375 -0.203125q0.28125 -0.09375 0.609375 -0.09375q0.484375 0 0.859375 0.140625q0.375 0.140625 0.546875 0.390625q0.171875 0.234375 0.234375 0.640625l-0.6875 0.09375q-0.046875 -0.328125 -0.265625 -0.5q-0.21875 -0.1875 -0.640625 -0.1875q-0.484375 0 -0.6875 0.171875q-0.203125 0.15625 -0.203125 0.375q0 0.125 0.078125 0.234375q0.09375 0.125 0.28125 0.1875q0.09375 0.046875 0.609375 0.1875q0.75 0.203125 1.046875 0.328125q0.296875 0.125 0.453125 0.375q0.171875 0.234375 0.171875 0.59375q0 0.34375 -0.203125 0.65625q-0.203125 0.3125 -0.59375 0.484375q-0.375 0.171875 -0.875 0.171875q-0.796875 0 -1.234375 -0.328125q-0.421875 -0.34375 -0.53125 -1.0zm7.125 -0.109375l0.71875 0.09375q-0.171875 0.640625 -0.640625 1.0q-0.453125 0.34375 -1.1875 0.34375q-0.90625 0 -1.4375 -0.5625q-0.53125 -0.5625 -0.53125 -1.578125q0 -1.046875 0.53125 -1.625q0.546875 -0.578125 1.40625 -0.578125q0.828125 0 1.359375 0.578125q0.53125 0.5625 0.53125 1.59375q0 0.0625 -0.015625 0.1875l-3.09375 0q0.046875 0.671875 0.390625 1.046875q0.34375 0.359375 0.875 0.359375q0.375 0 0.640625 -0.203125q0.28125 -0.203125 0.453125 -0.65625zm-2.3125 -1.125l2.3125 0q-0.046875 -0.53125 -0.265625 -0.796875q-0.328125 -0.40625 -0.875 -0.40625q-0.484375 0 -0.8125 0.328125q-0.328125 0.328125 -0.359375 0.875zm3.9023438 2.46875l0 -4.15625l0.640625 0l0 0.640625q0.234375 -0.453125 0.4375 -0.59375q0.21875 -0.140625 0.453125 -0.140625q0.359375 0 0.734375 0.234375l-0.25 0.65625q-0.25 -0.15625 -0.515625 -0.15625q-0.234375 0 -0.421875 0.140625q-0.171875 0.140625 -0.25 0.375q-0.125 0.375 -0.125 0.828125l0 2.171875l-0.703125 0z" fill-rule="nonzero"/><path fill="#000000" d="m41.71629 213.59076l2.203125 -5.734375l0.8125 0l2.34375 5.734375l-0.859375 0l-0.671875 -1.734375l-2.390625 0l-0.625 1.734375l-0.8125 0zm1.65625 -2.359375l1.9375 0l-0.59375 -1.578125q-0.265625 -0.71875 -0.40625 -1.1875q-0.109375 0.546875 -0.3125 1.09375l-0.625 1.671875zm4.1015625 2.703125l0.671875 0.109375q0.046875 0.3125 0.25 0.453125q0.25 0.203125 0.703125 0.203125q0.5 0 0.765625 -0.203125q0.265625 -0.1875 0.359375 -0.546875q0.046875 -0.21875 0.046875 -0.90625q-0.46875 0.546875 -1.15625 0.546875q-0.84375 0 -1.3125 -0.609375q-0.46875 -0.625 -0.46875 -1.484375q0 -0.59375 0.203125 -1.09375q0.21875 -0.515625 0.625 -0.78125q0.40625 -0.28125 0.96875 -0.28125q0.734375 0 1.203125 0.59375l0 -0.5l0.65625 0l0 3.59375q0 0.96875 -0.203125 1.375q-0.203125 0.40625 -0.625 0.640625q-0.421875 0.234375 -1.046875 0.234375q-0.75 0 -1.203125 -0.34375q-0.453125 -0.328125 -0.4375 -1.0zm0.578125 -2.5q0 0.828125 0.3125 1.203125q0.328125 0.375 0.828125 0.375q0.484375 0 0.8125 -0.375q0.328125 -0.375 0.328125 -1.171875q0 -0.765625 -0.34375 -1.140625q-0.34375 -0.390625 -0.8125 -0.390625q-0.46875 0 -0.796875 0.375q-0.328125 0.375 -0.328125 1.125zm6.8398438 0.8125l0.71875 0.09375q-0.171875 0.640625 -0.640625 1.0q-0.453125 0.34375 -1.1875 0.34375q-0.90625 0 -1.4375 -0.5625q-0.53125 -0.5625 -0.53125 -1.578125q0 -1.046875 0.53125 -1.625q0.546875 -0.578125 1.40625 -0.578125q0.828125 0 1.359375 0.578125q0.53125 0.5625 0.53125 1.59375q0 0.0625 -0.015625 0.1875l-3.09375 0q0.046875 0.671875 0.390625 1.046875q0.34375 0.359375 0.875 0.359375q0.375 0 0.640625 -0.203125q0.28125 -0.203125 0.453125 -0.65625zm-2.3125 -1.125l2.3125 0q-0.046875 -0.53125 -0.265625 -0.796875q-0.328125 -0.40625 -0.875 -0.40625q-0.484375 0 -0.8125 0.328125q-0.328125 0.328125 -0.359375 0.875zm3.9179688 2.46875l0 -4.15625l0.625 0l0 0.59375q0.46875 -0.6875 1.328125 -0.6875q0.375 0 0.6875 0.140625q0.3125 0.140625 0.46875 0.359375q0.15625 0.21875 0.21875 0.515625q0.046875 0.1875 0.046875 0.6875l0 2.546875l-0.703125 0l0 -2.53125q0 -0.421875 -0.09375 -0.625q-0.078125 -0.21875 -0.296875 -0.34375q-0.203125 -0.140625 -0.484375 -0.140625q-0.4375 0 -0.765625 0.296875q-0.328125 0.28125 -0.328125 1.078125l0 2.265625l-0.703125 0zm5.9804688 -0.625l0.109375 0.609375q-0.296875 0.078125 -0.53125 0.078125q-0.390625 0 -0.609375 -0.125q-0.203125 -0.125 -0.296875 -0.3125q-0.078125 -0.203125 -0.078125 -0.84375l0 -2.390625l-0.515625 0l0 -0.546875l0.515625 0l0 -1.015625l0.703125 -0.421875l0 1.4375l0.703125 0l0 0.546875l-0.703125 0l0 2.4375q0 0.296875 0.03125 0.390625q0.046875 0.078125 0.125 0.125q0.078125 0.046875 0.234375 0.046875q0.125 0 0.3125 -0.015625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m88.83727 200.91077l28.377953 0.03149414" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m88.83727 200.91077l22.377953 0.02482605" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m111.213394 202.58733l4.5399246 -1.646698l-4.536255 -1.6567688z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m261.58005 479.979l0 0c0 -13.828857 21.448029 -25.039368 47.905518 -25.039368l0 0c26.457489 0 47.905518 11.21051 47.905518 25.039368l0 0c0 13.828857 -21.448029 25.039368 -47.905518 25.039368l0 0c-26.457489 0 -47.905518 -11.21051 -47.905518 -25.039368z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m261.58005 479.979l0 0c0 -13.828857 21.448029 -25.039368 47.905518 -25.039368l0 0c26.457489 0 47.905518 11.21051 47.905518 25.039368l0 0c0 13.828857 -21.448029 25.039368 -47.905518 25.039368l0 0c-26.457489 0 -47.905518 -11.21051 -47.905518 -25.039368z" fill-rule="evenodd"/><path fill="#000000" d="m288.76877 482.659l0 -5.734375l2.546875 0q0.765625 0 1.15625 0.15625q0.40625 0.15625 0.640625 0.546875q0.234375 0.390625 0.234375 0.859375q0 0.609375 -0.390625 1.03125q-0.390625 0.421875 -1.21875 0.53125q0.296875 0.140625 0.453125 0.28125q0.34375 0.3125 0.640625 0.765625l0.984375 1.5625l-0.953125 0l-0.75 -1.1875q-0.328125 -0.515625 -0.546875 -0.78125q-0.21875 -0.28125 -0.390625 -0.390625q-0.171875 -0.109375 -0.34375 -0.15625q-0.125 -0.03125 -0.421875 -0.03125l-0.875 0l0 2.546875l-0.765625 0zm0.765625 -3.203125l1.625 0q0.515625 0 0.8125 -0.109375q0.296875 -0.109375 0.4375 -0.34375q0.15625 -0.234375 0.15625 -0.515625q0 -0.40625 -0.296875 -0.65625q-0.28125 -0.265625 -0.921875 -0.265625l-1.8125 0l0 1.890625zm7.6210938 2.6875q-0.390625 0.328125 -0.75 0.46875q-0.359375 0.140625 -0.78125 0.140625q-0.671875 0 -1.046875 -0.328125q-0.359375 -0.34375 -0.359375 -0.859375q0 -0.3125 0.125 -0.5625q0.140625 -0.25 0.359375 -0.390625q0.234375 -0.15625 0.515625 -0.234375q0.203125 -0.0625 0.625 -0.109375q0.859375 -0.109375 1.25 -0.25q0.015625 -0.140625 0.015625 -0.171875q0 -0.4375 -0.203125 -0.609375q-0.265625 -0.234375 -0.796875 -0.234375q-0.5 0 -0.734375 0.171875q-0.234375 0.171875 -0.359375 0.609375l-0.6875 -0.09375q0.09375 -0.4375 0.3125 -0.703125q0.21875 -0.28125 0.625 -0.421875q0.40625 -0.15625 0.9375 -0.15625q0.53125 0 0.859375 0.125q0.34375 0.125 0.5 0.328125q0.15625 0.1875 0.21875 0.46875q0.03125 0.1875 0.03125 0.65625l0 0.9375q0 0.96875 0.046875 1.234375q0.046875 0.265625 0.171875 0.5l-0.734375 0q-0.109375 -0.21875 -0.140625 -0.515625zm-0.0625 -1.5625q-0.375 0.15625 -1.140625 0.265625q-0.4375 0.0625 -0.625 0.140625q-0.171875 0.078125 -0.265625 0.234375q-0.09375 0.140625 -0.09375 0.328125q0 0.28125 0.203125 0.46875q0.21875 0.1875 0.625 0.1875q0.40625 0 0.71875 -0.171875q0.328125 -0.1875 0.46875 -0.5q0.109375 -0.234375 0.109375 -0.703125l0 -0.25zm2.4492188 2.078125l-0.640625 0l0 -5.734375l0.703125 0l0 2.046875q0.4375 -0.5625 1.125 -0.5625q0.390625 0 0.734375 0.15625q0.34375 0.15625 0.5625 0.4375q0.21875 0.28125 0.34375 0.671875q0.125 0.390625 0.125 0.84375q0 1.0625 -0.53125 1.65625q-0.53125 0.578125 -1.265625 0.578125q-0.734375 0 -1.15625 -0.609375l0 0.515625zm0 -2.109375q0 0.75 0.203125 1.078125q0.328125 0.546875 0.890625 0.546875q0.46875 0 0.796875 -0.390625q0.34375 -0.40625 0.34375 -1.203125q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.390625 -0.78125 -0.390625q-0.453125 0 -0.796875 0.40625q-0.328125 0.40625 -0.328125 1.15625zm4.4492188 2.109375l-0.640625 0l0 -5.734375l0.703125 0l0 2.046875q0.4375 -0.5625 1.125 -0.5625q0.390625 0 0.734375 0.15625q0.34375 0.15625 0.5625 0.4375q0.21875 0.28125 0.34375 0.671875q0.125 0.390625 0.125 0.84375q0 1.0625 -0.53125 1.65625q-0.53125 0.578125 -1.265625 0.578125q-0.734375 0 -1.15625 -0.609375l0 0.515625zm0 -2.109375q0 0.75 0.203125 1.078125q0.328125 0.546875 0.890625 0.546875q0.46875 0 0.796875 -0.390625q0.34375 -0.40625 0.34375 -1.203125q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.390625 -0.78125 -0.390625q-0.453125 0 -0.796875 0.40625q-0.328125 0.40625 -0.328125 1.15625zm3.8085938 -2.8125l0 -0.8125l0.703125 0l0 0.8125l-0.703125 0zm0 4.921875l0 -4.15625l0.703125 0l0 4.15625l-0.703125 0zm3.3085938 -0.625l0.109375 0.609375q-0.296875 0.078125 -0.53125 0.078125q-0.390625 0 -0.609375 -0.125q-0.203125 -0.125 -0.296875 -0.3125q-0.078125 -0.203125 -0.078125 -0.84375l0 -2.390625l-0.515625 0l0 -0.546875l0.515625 0l0 -1.015625l0.703125 -0.421875l0 1.4375l0.703125 0l0 0.546875l-0.703125 0l0 2.4375q0 0.296875 0.03125 0.390625q0.046875 0.078125 0.125 0.125q0.078125 0.046875 0.234375 0.046875q0.125 0 0.3125 -0.015625zm0.75390625 0.625l0 -5.734375l1.140625 0l1.359375 4.0625q0.1875 0.5625 0.265625 0.84375q0.109375 -0.3125 0.3125 -0.921875l1.375 -3.984375l1.015625 0l0 5.734375l-0.734375 0l0 -4.796875l-1.65625 4.796875l-0.6875 0l-1.65625 -4.875l0 4.875l-0.734375 0zm11.0234375 -0.609375q0.53125 0.359375 0.984375 0.53125l-0.234375 0.53125q-0.609375 -0.234375 -1.21875 -0.71875q-0.640625 0.359375 -1.40625 0.359375q-0.78125 0 -1.421875 -0.375q-0.625 -0.375 -0.96875 -1.046875q-0.34375 -0.6875 -0.34375 -1.53125q0 -0.859375 0.34375 -1.546875q0.34375 -0.703125 0.96875 -1.0625q0.640625 -0.359375 1.4375 -0.359375q0.78125 0 1.421875 0.375q0.640625 0.375 0.96875 1.0625q0.34375 0.671875 0.34375 1.515625q0 0.71875 -0.21875 1.28125q-0.21875 0.5625 -0.65625 0.984375zm-1.65625 -0.96875q0.65625 0.171875 1.078125 0.546875q0.671875 -0.609375 0.671875 -1.84375q0 -0.6875 -0.25 -1.203125q-0.234375 -0.53125 -0.6875 -0.8125q-0.453125 -0.28125 -1.015625 -0.28125q-0.84375 0 -1.40625 0.578125q-0.5625 0.578125 -0.5625 1.734375q0 1.109375 0.546875 1.71875q0.5625 0.59375 1.421875 0.59375q0.40625 0 0.765625 -0.15625q-0.359375 -0.234375 -0.75 -0.328125l0.1875 -0.546875zm8.1328125 1.578125l-0.703125 0l0 -4.484375q-0.25 0.25 -0.671875 0.5q-0.40625 0.234375 -0.734375 0.34375l0 -0.671875q0.59375 -0.28125 1.03125 -0.671875q0.4375 -0.390625 0.625 -0.765625l0.453125 0l0 5.75z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m374.11285 479.979l0 0c0 -13.828857 21.448029 -25.039368 47.905518 -25.039368l0 0c26.457489 0 47.905518 11.21051 47.905518 25.039368l0 0c0 13.828857 -21.448029 25.039368 -47.905518 25.039368l0 0c-26.457489 0 -47.905518 -11.21051 -47.905518 -25.039368z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m374.11285 479.979l0 0c0 -13.828857 21.448029 -25.039368 47.905518 -25.039368l0 0c26.457489 0 47.905518 11.21051 47.905518 25.039368l0 0c0 13.828857 -21.448029 25.039368 -47.905518 25.039368l0 0c-26.457489 0 -47.905518 -11.21051 -47.905518 -25.039368z" fill-rule="evenodd"/><path fill="#000000" d="m401.30157 482.659l0 -5.734375l2.546875 0q0.765625 0 1.15625 0.15625q0.40625 0.15625 0.640625 0.546875q0.234375 0.390625 0.234375 0.859375q0 0.609375 -0.390625 1.03125q-0.390625 0.421875 -1.21875 0.53125q0.296875 0.140625 0.453125 0.28125q0.34375 0.3125 0.640625 0.765625l0.984375 1.5625l-0.953125 0l-0.75 -1.1875q-0.328125 -0.515625 -0.546875 -0.78125q-0.21875 -0.28125 -0.390625 -0.390625q-0.171875 -0.109375 -0.34375 -0.15625q-0.125 -0.03125 -0.421875 -0.03125l-0.875 0l0 2.546875l-0.765625 0zm0.765625 -3.203125l1.625 0q0.515625 0 0.8125 -0.109375q0.296875 -0.109375 0.4375 -0.34375q0.15625 -0.234375 0.15625 -0.515625q0 -0.40625 -0.296875 -0.65625q-0.28125 -0.265625 -0.921875 -0.265625l-1.8125 0l0 1.890625zm7.6210938 2.6875q-0.390625 0.328125 -0.75 0.46875q-0.359375 0.140625 -0.78125 0.140625q-0.671875 0 -1.046875 -0.328125q-0.359375 -0.34375 -0.359375 -0.859375q0 -0.3125 0.125 -0.5625q0.140625 -0.25 0.359375 -0.390625q0.234375 -0.15625 0.515625 -0.234375q0.203125 -0.0625 0.625 -0.109375q0.859375 -0.109375 1.25 -0.25q0.015625 -0.140625 0.015625 -0.171875q0 -0.4375 -0.203125 -0.609375q-0.265625 -0.234375 -0.796875 -0.234375q-0.5 0 -0.734375 0.171875q-0.234375 0.171875 -0.359375 0.609375l-0.6875 -0.09375q0.09375 -0.4375 0.3125 -0.703125q0.21875 -0.28125 0.625 -0.421875q0.40625 -0.15625 0.9375 -0.15625q0.53125 0 0.859375 0.125q0.34375 0.125 0.5 0.328125q0.15625 0.1875 0.21875 0.46875q0.03125 0.1875 0.03125 0.65625l0 0.9375q0 0.96875 0.046875 1.234375q0.046875 0.265625 0.171875 0.5l-0.734375 0q-0.109375 -0.21875 -0.140625 -0.515625zm-0.0625 -1.5625q-0.375 0.15625 -1.140625 0.265625q-0.4375 0.0625 -0.625 0.140625q-0.171875 0.078125 -0.265625 0.234375q-0.09375 0.140625 -0.09375 0.328125q0 0.28125 0.203125 0.46875q0.21875 0.1875 0.625 0.1875q0.40625 0 0.71875 -0.171875q0.328125 -0.1875 0.46875 -0.5q0.109375 -0.234375 0.109375 -0.703125l0 -0.25zm2.4492188 2.078125l-0.640625 0l0 -5.734375l0.703125 0l0 2.046875q0.4375 -0.5625 1.125 -0.5625q0.390625 0 0.734375 0.15625q0.34375 0.15625 0.5625 0.4375q0.21875 0.28125 0.34375 0.671875q0.125 0.390625 0.125 0.84375q0 1.0625 -0.53125 1.65625q-0.53125 0.578125 -1.265625 0.578125q-0.734375 0 -1.15625 -0.609375l0 0.515625zm0 -2.109375q0 0.75 0.203125 1.078125q0.328125 0.546875 0.890625 0.546875q0.46875 0 0.796875 -0.390625q0.34375 -0.40625 0.34375 -1.203125q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.390625 -0.78125 -0.390625q-0.453125 0 -0.796875 0.40625q-0.328125 0.40625 -0.328125 1.15625zm4.4492188 2.109375l-0.640625 0l0 -5.734375l0.703125 0l0 2.046875q0.4375 -0.5625 1.125 -0.5625q0.390625 0 0.734375 0.15625q0.34375 0.15625 0.5625 0.4375q0.21875 0.28125 0.34375 0.671875q0.125 0.390625 0.125 0.84375q0 1.0625 -0.53125 1.65625q-0.53125 0.578125 -1.265625 0.578125q-0.734375 0 -1.15625 -0.609375l0 0.515625zm0 -2.109375q0 0.75 0.203125 1.078125q0.328125 0.546875 0.890625 0.546875q0.46875 0 0.796875 -0.390625q0.34375 -0.40625 0.34375 -1.203125q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.390625 -0.78125 -0.390625q-0.453125 0 -0.796875 0.40625q-0.328125 0.40625 -0.328125 1.15625zm3.8085938 -2.8125l0 -0.8125l0.703125 0l0 0.8125l-0.703125 0zm0 4.921875l0 -4.15625l0.703125 0l0 4.15625l-0.703125 0zm3.3085938 -0.625l0.109375 0.609375q-0.296875 0.078125 -0.53125 0.078125q-0.390625 0 -0.609375 -0.125q-0.203125 -0.125 -0.296875 -0.3125q-0.078125 -0.203125 -0.078125 -0.84375l0 -2.390625l-0.515625 0l0 -0.546875l0.515625 0l0 -1.015625l0.703125 -0.421875l0 1.4375l0.703125 0l0 0.546875l-0.703125 0l0 2.4375q0 0.296875 0.03125 0.390625q0.046875 0.078125 0.125 0.125q0.078125 0.046875 0.234375 0.046875q0.125 0 0.3125 -0.015625zm0.75390625 0.625l0 -5.734375l1.140625 0l1.359375 4.0625q0.1875 0.5625 0.265625 0.84375q0.109375 -0.3125 0.3125 -0.921875l1.375 -3.984375l1.015625 0l0 5.734375l-0.734375 0l0 -4.796875l-1.65625 4.796875l-0.6875 0l-1.65625 -4.875l0 4.875l-0.734375 0zm11.0234375 -0.609375q0.53125 0.359375 0.984375 0.53125l-0.234375 0.53125q-0.609375 -0.234375 -1.21875 -0.71875q-0.640625 0.359375 -1.40625 0.359375q-0.78125 0 -1.421875 -0.375q-0.625 -0.375 -0.96875 -1.046875q-0.34375 -0.6875 -0.34375 -1.53125q0 -0.859375 0.34375 -1.546875q0.34375 -0.703125 0.96875 -1.0625q0.640625 -0.359375 1.4375 -0.359375q0.78125 0 1.421875 0.375q0.640625 0.375 0.96875 1.0625q0.34375 0.671875 0.34375 1.515625q0 0.71875 -0.21875 1.28125q-0.21875 0.5625 -0.65625 0.984375zm-1.65625 -0.96875q0.65625 0.171875 1.078125 0.546875q0.671875 -0.609375 0.671875 -1.84375q0 -0.6875 -0.25 -1.203125q-0.234375 -0.53125 -0.6875 -0.8125q-0.453125 -0.28125 -1.015625 -0.28125q-0.84375 0 -1.40625 0.578125q-0.5625 0.578125 -0.5625 1.734375q0 1.109375 0.546875 1.71875q0.5625 0.59375 1.421875 0.59375q0.40625 0 0.765625 -0.15625q-0.359375 -0.234375 -0.75 -0.328125l0.1875 -0.546875zm9.1796875 0.90625l0 0.671875l-3.78125 0q-0.015625 -0.25 0.078125 -0.484375q0.140625 -0.390625 0.453125 -0.765625q0.328125 -0.375 0.921875 -0.875q0.9375 -0.765625 1.265625 -1.203125q0.328125 -0.453125 0.328125 -0.84375q0 -0.421875 -0.296875 -0.703125q-0.296875 -0.296875 -0.78125 -0.296875q-0.5 0 -0.8125 0.3125q-0.296875 0.296875 -0.3125 0.84375l-0.71875 -0.078125q0.078125 -0.8125 0.5625 -1.234375q0.484375 -0.421875 1.296875 -0.421875q0.828125 0 1.296875 0.453125q0.484375 0.453125 0.484375 1.140625q0 0.34375 -0.140625 0.671875q-0.140625 0.328125 -0.46875 0.703125q-0.3125 0.359375 -1.078125 1.0q-0.625 0.53125 -0.8125 0.71875q-0.171875 0.1875 -0.296875 0.390625l2.8125 0z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m318.33597 537.34906l0 0c0 -13.828857 21.448029 -25.039368 47.905487 -25.039368l0 0c26.457489 0 47.905518 11.21051 47.905518 25.039368l0 0c0 13.828857 -21.448029 25.039368 -47.905518 25.039368l0 0c-26.457458 0 -47.905487 -11.21051 -47.905487 -25.039368z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m318.33597 537.34906l0 0c0 -13.828857 21.448029 -25.039368 47.905487 -25.039368l0 0c26.457489 0 47.905518 11.21051 47.905518 25.039368l0 0c0 13.828857 -21.448029 25.039368 -47.905518 25.039368l0 0c-26.457458 0 -47.905487 -11.21051 -47.905487 -25.039368z" fill-rule="evenodd"/><path fill="#000000" d="m345.52466 540.02905l0 -5.734375l2.546875 0q0.765625 0 1.15625 0.15625q0.40625 0.15625 0.640625 0.546875q0.234375 0.390625 0.234375 0.859375q0 0.609375 -0.390625 1.03125q-0.390625 0.421875 -1.21875 0.53125q0.296875 0.140625 0.453125 0.28125q0.34375 0.3125 0.640625 0.765625l0.984375 1.5625l-0.953125 0l-0.75 -1.1875q-0.328125 -0.515625 -0.546875 -0.78125q-0.21875 -0.28125 -0.390625 -0.390625q-0.171875 -0.109375 -0.34375 -0.15625q-0.125 -0.03125 -0.421875 -0.03125l-0.875 0l0 2.546875l-0.765625 0zm0.765625 -3.203125l1.625 0q0.515625 0 0.8125 -0.109375q0.296875 -0.109375 0.4375 -0.34375q0.15625 -0.234375 0.15625 -0.515625q0 -0.40625 -0.296875 -0.65625q-0.28125 -0.265625 -0.921875 -0.265625l-1.8125 0l0 1.890625zm7.6210938 2.6875q-0.390625 0.328125 -0.75 0.46875q-0.359375 0.140625 -0.78125 0.140625q-0.671875 0 -1.046875 -0.328125q-0.359375 -0.34375 -0.359375 -0.859375q0 -0.3125 0.125 -0.5625q0.140625 -0.25 0.359375 -0.390625q0.234375 -0.15625 0.515625 -0.234375q0.203125 -0.0625 0.625 -0.109375q0.859375 -0.109375 1.25 -0.25q0.015625 -0.140625 0.015625 -0.171875q0 -0.4375 -0.203125 -0.609375q-0.265625 -0.234375 -0.796875 -0.234375q-0.5 0 -0.734375 0.171875q-0.234375 0.171875 -0.359375 0.609375l-0.6875 -0.09375q0.09375 -0.4375 0.3125 -0.703125q0.21875 -0.28125 0.625 -0.421875q0.40625 -0.15625 0.9375 -0.15625q0.53125 0 0.859375 0.125q0.34375 0.125 0.5 0.328125q0.15625 0.1875 0.21875 0.46875q0.03125 0.1875 0.03125 0.65625l0 0.9375q0 0.96875 0.046875 1.234375q0.046875 0.265625 0.171875 0.5l-0.734375 0q-0.109375 -0.21875 -0.140625 -0.515625zm-0.0625 -1.5625q-0.375 0.15625 -1.140625 0.265625q-0.4375 0.0625 -0.625 0.140625q-0.171875 0.078125 -0.265625 0.234375q-0.09375 0.140625 -0.09375 0.328125q0 0.28125 0.203125 0.46875q0.21875 0.1875 0.625 0.1875q0.40625 0 0.71875 -0.171875q0.328125 -0.1875 0.46875 -0.5q0.109375 -0.234375 0.109375 -0.703125l0 -0.25zm2.4492188 2.078125l-0.640625 0l0 -5.734375l0.703125 0l0 2.046875q0.4375 -0.5625 1.125 -0.5625q0.390625 0 0.734375 0.15625q0.34375 0.15625 0.5625 0.4375q0.21875 0.28125 0.34375 0.671875q0.125 0.390625 0.125 0.84375q0 1.0625 -0.53125 1.65625q-0.53125 0.578125 -1.265625 0.578125q-0.734375 0 -1.15625 -0.609375l0 0.515625zm0 -2.109375q0 0.75 0.203125 1.078125q0.328125 0.546875 0.890625 0.546875q0.46875 0 0.796875 -0.390625q0.34375 -0.40625 0.34375 -1.203125q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.390625 -0.78125 -0.390625q-0.453125 0 -0.796875 0.40625q-0.328125 0.40625 -0.328125 1.15625zm4.4492188 2.109375l-0.640625 0l0 -5.734375l0.703125 0l0 2.046875q0.4375 -0.5625 1.125 -0.5625q0.390625 0 0.734375 0.15625q0.34375 0.15625 0.5625 0.4375q0.21875 0.28125 0.34375 0.671875q0.125 0.390625 0.125 0.84375q0 1.0625 -0.53125 1.65625q-0.53125 0.578125 -1.265625 0.578125q-0.734375 0 -1.15625 -0.609375l0 0.515625zm0 -2.109375q0 0.75 0.203125 1.078125q0.328125 0.546875 0.890625 0.546875q0.46875 0 0.796875 -0.390625q0.34375 -0.40625 0.34375 -1.203125q0 -0.8125 -0.328125 -1.203125q-0.3125 -0.390625 -0.78125 -0.390625q-0.453125 0 -0.796875 0.40625q-0.328125 0.40625 -0.328125 1.15625zm3.8086243 -2.8125l0 -0.8125l0.703125 0l0 0.8125l-0.703125 0zm0 4.921875l0 -4.15625l0.703125 0l0 4.15625l-0.703125 0zm3.3085938 -0.625l0.109375 0.609375q-0.296875 0.078125 -0.53125 0.078125q-0.390625 0 -0.609375 -0.125q-0.203125 -0.125 -0.296875 -0.3125q-0.078125 -0.203125 -0.078125 -0.84375l0 -2.390625l-0.515625 0l0 -0.546875l0.515625 0l0 -1.015625l0.703125 -0.421875l0 1.4375l0.703125 0l0 0.546875l-0.703125 0l0 2.4375q0 0.296875 0.03125 0.390625q0.046875 0.078125 0.125 0.125q0.078125 0.046875 0.234375 0.046875q0.125 0 0.3125 -0.015625zm0.75390625 0.625l0 -5.734375l1.140625 0l1.359375 4.0625q0.1875 0.5625 0.265625 0.84375q0.109375 -0.3125 0.3125 -0.921875l1.375 -3.984375l1.015625 0l0 5.734375l-0.734375 0l0 -4.796875l-1.65625 4.796875l-0.6875 0l-1.65625 -4.875l0 4.875l-0.734375 0zm11.0234375 -0.609375q0.53125 0.359375 0.984375 0.53125l-0.234375 0.53125q-0.609375 -0.234375 -1.21875 -0.71875q-0.640625 0.359375 -1.40625 0.359375q-0.78125 0 -1.421875 -0.375q-0.625 -0.375 -0.96875 -1.046875q-0.34375 -0.6875 -0.34375 -1.53125q0 -0.859375 0.34375 -1.546875q0.34375 -0.703125 0.96875 -1.0625q0.640625 -0.359375 1.4375 -0.359375q0.78125 0 1.421875 0.375q0.640625 0.375 0.96875 1.0625q0.34375 0.671875 0.34375 1.515625q0 0.71875 -0.21875 1.28125q-0.21875 0.5625 -0.65625 0.984375zm-1.65625 -0.96875q0.65625 0.171875 1.078125 0.546875q0.671875 -0.609375 0.671875 -1.84375q0 -0.6875 -0.25 -1.203125q-0.234375 -0.53125 -0.6875 -0.8125q-0.453125 -0.28125 -1.015625 -0.28125q-0.84375 0 -1.40625 0.578125q-0.5625 0.578125 -0.5625 1.734375q0 1.109375 0.546875 1.71875q0.5625 0.59375 1.421875 0.59375q0.40625 0 0.765625 -0.15625q-0.359375 -0.234375 -0.75 -0.328125l0.1875 -0.546875zm5.4921875 0.0625l0.703125 -0.09375q0.109375 0.59375 0.40625 0.859375q0.296875 0.265625 0.703125 0.265625q0.5 0 0.84375 -0.34375q0.34375 -0.34375 0.34375 -0.84375q0 -0.484375 -0.328125 -0.796875q-0.3125 -0.328125 -0.796875 -0.328125q-0.203125 0 -0.5 0.078125l0.078125 -0.609375q0.078125 0 0.125 0q0.4375 0 0.796875 -0.234375q0.359375 -0.234375 0.359375 -0.71875q0 -0.390625 -0.265625 -0.640625q-0.25 -0.25 -0.671875 -0.25q-0.40625 0 -0.6875 0.265625q-0.265625 0.25 -0.34375 0.765625l-0.703125 -0.125q0.125 -0.703125 0.578125 -1.09375q0.46875 -0.390625 1.140625 -0.390625q0.46875 0 0.859375 0.203125q0.40625 0.203125 0.609375 0.546875q0.21875 0.34375 0.21875 0.734375q0 0.375 -0.203125 0.6875q-0.203125 0.296875 -0.59375 0.46875q0.515625 0.125 0.796875 0.5q0.28125 0.359375 0.28125 0.921875q0 0.75 -0.546875 1.28125q-0.546875 0.515625 -1.390625 0.515625q-0.75 0 -1.25 -0.453125q-0.5 -0.453125 -0.5625 -1.171875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m238.35432 422.27823l264.18896 0l0 187.24411l-264.18896 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0" d="m238.35432 422.27823l264.18896 0l0 187.24411l-264.18896 0z" fill-rule="evenodd"/><path fill="#c9daf8" d="m590.33856 405.8819l0 0c0 -13.828857 31.361267 -25.039368 70.04724 -25.039368l0 0c38.686035 0 70.04724 11.21051 70.04724 25.039368l0 0c0 13.828857 -31.361206 25.039368 -70.04724 25.039368l0 0c-38.685974 0 -70.04724 -11.21051 -70.04724 -25.039368z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0" d="m590.33856 405.8819l0 0c0 -13.828857 31.361267 -25.039368 70.04724 -25.039368l0 0c38.686035 0 70.04724 11.21051 70.04724 25.039368l0 0c0 13.828857 -31.361206 25.039368 -70.04724 25.039368l0 0c-38.685974 0 -70.04724 -11.21051 -70.04724 -25.039368z" fill-rule="evenodd"/><path fill="#000000" d="m627.4316 405.90314q0 -1.890625 1.015625 -2.96875q1.03125 -1.078125 2.640625 -1.078125q1.046875 0 1.890625 0.515625q0.859375 0.5 1.296875 1.40625q0.453125 0.890625 0.453125 2.046875q0 1.15625 -0.46875 2.078125q-0.46875 0.90625 -1.328125 1.375q-0.859375 0.46875 -1.859375 0.46875q-1.078125 0 -1.921875 -0.515625q-0.84375 -0.515625 -1.28125 -1.40625q-0.4375 -0.90625 -0.4375 -1.921875zm1.046875 0.015625q0 1.375 0.734375 2.171875q0.734375 0.796875 1.859375 0.796875q1.140625 0 1.875 -0.796875q0.734375 -0.8125 0.734375 -2.28125q0 -0.921875 -0.3125 -1.609375q-0.3125 -0.703125 -0.921875 -1.078125q-0.609375 -0.390625 -1.359375 -0.390625q-1.078125 0 -1.84375 0.734375q-0.765625 0.734375 -0.765625 2.453125zm7.4293823 5.828125l0 -7.65625l0.859375 0l0 0.71875q0.296875 -0.421875 0.671875 -0.625q0.390625 -0.21875 0.921875 -0.21875q0.703125 0 1.25 0.375q0.546875 0.359375 0.8125 1.03125q0.28125 0.65625 0.28125 1.453125q0 0.84375 -0.3125 1.53125q-0.296875 0.671875 -0.875 1.03125q-0.578125 0.359375 -1.21875 0.359375q-0.46875 0 -0.84375 -0.1875q-0.375 -0.203125 -0.609375 -0.515625l0 2.703125l-0.9375 0zm0.84375 -4.859375q0 1.0625 0.4375 1.578125q0.4375 0.515625 1.046875 0.515625q0.625 0 1.0625 -0.53125q0.453125 -0.53125 0.453125 -1.640625q0 -1.046875 -0.4375 -1.578125q-0.4375 -0.53125 -1.046875 -0.53125q-0.59375 0 -1.0625 0.5625q-0.453125 0.5625 -0.453125 1.625zm8.864014 0.953125l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm5.2233276 3.296875l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5515137 -1.65625l0.921875 -0.140625q0.078125 0.5625 0.4375 0.859375q0.359375 0.296875 1.0 0.296875q0.640625 0 0.953125 -0.265625q0.3125 -0.265625 0.3125 -0.625q0 -0.3125 -0.28125 -0.5q-0.1875 -0.125 -0.953125 -0.3125q-1.03125 -0.265625 -1.4375 -0.453125q-0.390625 -0.1875 -0.59375 -0.515625q-0.203125 -0.34375 -0.203125 -0.75q0 -0.359375 0.171875 -0.671875q0.171875 -0.328125 0.453125 -0.53125q0.21875 -0.15625 0.59375 -0.265625q0.390625 -0.125 0.8125 -0.125q0.65625 0 1.140625 0.1875q0.5 0.1875 0.734375 0.515625q0.234375 0.3125 0.3125 0.859375l-0.90625 0.125q-0.0625 -0.4375 -0.375 -0.671875q-0.296875 -0.234375 -0.828125 -0.234375q-0.65625 0 -0.9375 0.21875q-0.265625 0.203125 -0.265625 0.484375q0 0.1875 0.109375 0.328125q0.125 0.15625 0.359375 0.25q0.140625 0.0625 0.828125 0.25q1.0 0.265625 1.390625 0.4375q0.390625 0.15625 0.609375 0.484375q0.234375 0.3125 0.234375 0.796875q0 0.46875 -0.28125 0.890625q-0.265625 0.40625 -0.78125 0.640625q-0.515625 0.21875 -1.171875 0.21875q-1.078125 0 -1.640625 -0.4375q-0.5625 -0.453125 -0.71875 -1.34375zm9.484375 -0.125l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.832764 2.609375q-0.53125 0.453125 -1.015625 0.640625q-0.46875 0.171875 -1.015625 0.171875q-0.921875 0 -1.40625 -0.4375q-0.484375 -0.453125 -0.484375 -1.140625q0 -0.40625 0.171875 -0.734375q0.1875 -0.34375 0.484375 -0.546875q0.3125 -0.203125 0.6875 -0.3125q0.265625 -0.0625 0.828125 -0.140625q1.125 -0.125 1.671875 -0.3125q0 -0.203125 0 -0.25q0 -0.578125 -0.265625 -0.8125q-0.359375 -0.3125 -1.0625 -0.3125q-0.65625 0 -0.984375 0.234375q-0.3125 0.234375 -0.453125 0.8125l-0.921875 -0.125q0.125 -0.578125 0.40625 -0.9375q0.296875 -0.375 0.828125 -0.5625q0.546875 -0.203125 1.25 -0.203125q0.71875 0 1.15625 0.171875q0.4375 0.171875 0.640625 0.421875q0.21875 0.25 0.296875 0.640625q0.046875 0.234375 0.046875 0.859375l0 1.25q0 1.296875 0.0625 1.65625q0.0625 0.34375 0.234375 0.65625l-0.96875 0q-0.15625 -0.296875 -0.1875 -0.6875zm-0.078125 -2.078125q-0.515625 0.203125 -1.53125 0.34375q-0.578125 0.078125 -0.828125 0.1875q-0.234375 0.109375 -0.359375 0.3125q-0.125 0.1875 -0.125 0.4375q0 0.375 0.28125 0.625q0.28125 0.25 0.828125 0.25q0.53125 0 0.953125 -0.234375q0.421875 -0.234375 0.625 -0.65625q0.15625 -0.3125 0.15625 -0.9375l0 -0.328125zm2.3796387 2.765625l0 -5.53125l0.84375 0l0 0.84375q0.328125 -0.59375 0.59375 -0.78125q0.28125 -0.1875 0.609375 -0.1875q0.46875 0 0.953125 0.3125l-0.3125 0.859375q-0.34375 -0.203125 -0.6875 -0.203125q-0.3125 0 -0.5625 0.1875q-0.234375 0.1875 -0.34375 0.515625q-0.15625 0.5 -0.15625 1.09375l0 2.890625l-0.9375 0zm7.173584 -2.03125l0.921875 0.125q-0.15625 0.953125 -0.78125 1.5q-0.625 0.53125 -1.53125 0.53125q-1.125 0 -1.8125 -0.734375q-0.6875 -0.75 -0.6875 -2.125q0 -0.90625 0.296875 -1.578125q0.296875 -0.671875 0.890625 -1.0q0.609375 -0.34375 1.328125 -0.34375q0.890625 0 1.46875 0.46875q0.578125 0.453125 0.734375 1.28125l-0.90625 0.140625q-0.140625 -0.546875 -0.46875 -0.828125q-0.328125 -0.28125 -0.796875 -0.28125q-0.703125 0 -1.15625 0.515625q-0.4375 0.5 -0.4375 1.59375q0 1.109375 0.421875 1.625q0.4375 0.5 1.125 0.5q0.546875 0 0.90625 -0.34375q0.375 -0.34375 0.484375 -1.046875zm1.71875 2.03125l0 -7.625l0.9375 0l0 2.734375q0.65625 -0.765625 1.65625 -0.765625q0.609375 0 1.0625 0.25q0.453125 0.234375 0.640625 0.671875q0.203125 0.421875 0.203125 1.234375l0 3.5l-0.9375 0l0 -3.5q0 -0.703125 -0.3125 -1.015625q-0.296875 -0.328125 -0.859375 -0.328125q-0.40625 0 -0.78125 0.21875q-0.359375 0.21875 -0.515625 0.59375q-0.15625 0.359375 -0.15625 1.015625l0 3.015625l-0.9375 0zm12.152771 0l-0.9375 0l0 -5.96875q-0.34375 0.328125 -0.890625 0.65625q-0.546875 0.3125 -0.984375 0.46875l0 -0.90625q0.796875 -0.359375 1.375 -0.890625q0.59375 -0.53125 0.828125 -1.015625l0.609375 0l0 7.65625z" fill-rule="nonzero"/><path fill="#c9daf8" d="m651.33856 463.25198l0 0c0 -13.828888 31.361267 -25.039398 70.04724 -25.039398l0 0c38.686035 0 70.04724 11.21051 70.04724 25.039398l0 0c0 13.828857 -31.361206 25.039368 -70.04724 25.039368l0 0c-38.685974 0 -70.04724 -11.21051 -70.04724 -25.039368z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0" d="m651.33856 463.25198l0 0c0 -13.828888 31.361267 -25.039398 70.04724 -25.039398l0 0c38.686035 0 70.04724 11.21051 70.04724 25.039398l0 0c0 13.828857 -31.361206 25.039368 -70.04724 25.039368l0 0c-38.685974 0 -70.04724 -11.21051 -70.04724 -25.039368z" fill-rule="evenodd"/><path fill="#000000" d="m688.4316 463.27322q0 -1.890625 1.015625 -2.96875q1.03125 -1.078125 2.640625 -1.078125q1.046875 0 1.890625 0.515625q0.859375 0.5 1.296875 1.40625q0.453125 0.890625 0.453125 2.046875q0 1.15625 -0.46875 2.078125q-0.46875 0.90625 -1.328125 1.375q-0.859375 0.46875 -1.859375 0.46875q-1.078125 0 -1.921875 -0.515625q-0.84375 -0.515625 -1.28125 -1.40625q-0.4375 -0.90625 -0.4375 -1.921875zm1.046875 0.015625q0 1.375 0.734375 2.171875q0.734375 0.796875 1.859375 0.796875q1.140625 0 1.875 -0.796875q0.734375 -0.8125 0.734375 -2.28125q0 -0.921875 -0.3125 -1.609375q-0.3125 -0.703125 -0.921875 -1.078125q-0.609375 -0.390625 -1.359375 -0.390625q-1.078125 0 -1.84375 0.734375q-0.765625 0.734375 -0.765625 2.453125zm7.4293823 5.828125l0 -7.65625l0.859375 0l0 0.71875q0.296875 -0.421875 0.671875 -0.625q0.390625 -0.21875 0.921875 -0.21875q0.703125 0 1.25 0.375q0.546875 0.359375 0.8125 1.03125q0.28125 0.65625 0.28125 1.453125q0 0.84375 -0.3125 1.53125q-0.296875 0.671875 -0.875 1.03125q-0.578125 0.359375 -1.21875 0.359375q-0.46875 0 -0.84375 -0.1875q-0.375 -0.203125 -0.609375 -0.515625l0 2.703125l-0.9375 0zm0.84375 -4.859375q0 1.0625 0.4375 1.578125q0.4375 0.515625 1.046875 0.515625q0.625 0 1.0625 -0.53125q0.453125 -0.53125 0.453125 -1.640625q0 -1.046875 -0.4375 -1.578125q-0.4375 -0.53125 -1.046875 -0.53125q-0.59375 0 -1.0625 0.5625q-0.453125 0.5625 -0.453125 1.625zm8.864014 0.953125l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm5.2233276 3.296875l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5515137 -1.65625l0.921875 -0.140625q0.078125 0.5625 0.4375 0.859375q0.359375 0.296875 1.0 0.296875q0.640625 0 0.953125 -0.265625q0.3125 -0.265625 0.3125 -0.625q0 -0.3125 -0.28125 -0.5q-0.1875 -0.125 -0.953125 -0.3125q-1.03125 -0.265625 -1.4375 -0.453125q-0.390625 -0.1875 -0.59375 -0.515625q-0.203125 -0.34375 -0.203125 -0.75q0 -0.359375 0.171875 -0.671875q0.171875 -0.328125 0.453125 -0.53125q0.21875 -0.15625 0.59375 -0.265625q0.390625 -0.125 0.8125 -0.125q0.65625 0 1.140625 0.1875q0.5 0.1875 0.734375 0.515625q0.234375 0.3125 0.3125 0.859375l-0.90625 0.125q-0.0625 -0.4375 -0.375 -0.671875q-0.296875 -0.234375 -0.828125 -0.234375q-0.65625 0 -0.9375 0.21875q-0.265625 0.203125 -0.265625 0.484375q0 0.1875 0.109375 0.328125q0.125 0.15625 0.359375 0.25q0.140625 0.0625 0.828125 0.25q1.0 0.265625 1.390625 0.4375q0.390625 0.15625 0.609375 0.484375q0.234375 0.3125 0.234375 0.796875q0 0.46875 -0.28125 0.890625q-0.265625 0.40625 -0.78125 0.640625q-0.515625 0.21875 -1.171875 0.21875q-1.078125 0 -1.640625 -0.4375q-0.5625 -0.453125 -0.71875 -1.34375zm9.484375 -0.125l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.832764 2.609375q-0.53125 0.453125 -1.015625 0.640625q-0.46875 0.171875 -1.015625 0.171875q-0.921875 0 -1.40625 -0.4375q-0.484375 -0.453125 -0.484375 -1.140625q0 -0.40625 0.171875 -0.734375q0.1875 -0.34375 0.484375 -0.546875q0.3125 -0.203125 0.6875 -0.3125q0.265625 -0.0625 0.828125 -0.140625q1.125 -0.125 1.671875 -0.3125q0 -0.203125 0 -0.25q0 -0.578125 -0.265625 -0.8125q-0.359375 -0.3125 -1.0625 -0.3125q-0.65625 0 -0.984375 0.234375q-0.3125 0.234375 -0.453125 0.8125l-0.921875 -0.125q0.125 -0.578125 0.40625 -0.9375q0.296875 -0.375 0.828125 -0.5625q0.546875 -0.203125 1.25 -0.203125q0.71875 0 1.15625 0.171875q0.4375 0.171875 0.640625 0.421875q0.21875 0.25 0.296875 0.640625q0.046875 0.234375 0.046875 0.859375l0 1.25q0 1.296875 0.0625 1.65625q0.0625 0.34375 0.234375 0.65625l-0.96875 0q-0.15625 -0.296875 -0.1875 -0.6875zm-0.078125 -2.078125q-0.515625 0.203125 -1.53125 0.34375q-0.578125 0.078125 -0.828125 0.1875q-0.234375 0.109375 -0.359375 0.3125q-0.125 0.1875 -0.125 0.4375q0 0.375 0.28125 0.625q0.28125 0.25 0.828125 0.25q0.53125 0 0.953125 -0.234375q0.421875 -0.234375 0.625 -0.65625q0.15625 -0.3125 0.15625 -0.9375l0 -0.328125zm2.3796387 2.765625l0 -5.53125l0.84375 0l0 0.84375q0.328125 -0.59375 0.59375 -0.78125q0.28125 -0.1875 0.609375 -0.1875q0.46875 0 0.953125 0.3125l-0.3125 0.859375q-0.34375 -0.203125 -0.6875 -0.203125q-0.3125 0 -0.5625 0.1875q-0.234375 0.1875 -0.34375 0.515625q-0.15625 0.5 -0.15625 1.09375l0 2.890625l-0.9375 0zm7.173584 -2.03125l0.921875 0.125q-0.15625 0.953125 -0.78125 1.5q-0.625 0.53125 -1.53125 0.53125q-1.125 0 -1.8125 -0.734375q-0.6875 -0.75 -0.6875 -2.125q0 -0.90625 0.296875 -1.578125q0.296875 -0.671875 0.890625 -1.0q0.609375 -0.34375 1.328125 -0.34375q0.890625 0 1.46875 0.46875q0.578125 0.453125 0.734375 1.28125l-0.90625 0.140625q-0.140625 -0.546875 -0.46875 -0.828125q-0.328125 -0.28125 -0.796875 -0.28125q-0.703125 0 -1.15625 0.515625q-0.4375 0.5 -0.4375 1.59375q0 1.109375 0.421875 1.625q0.4375 0.5 1.125 0.5q0.546875 0 0.90625 -0.34375q0.375 -0.34375 0.484375 -1.046875zm1.71875 2.03125l0 -7.625l0.9375 0l0 2.734375q0.65625 -0.765625 1.65625 -0.765625q0.609375 0 1.0625 0.25q0.453125 0.234375 0.640625 0.671875q0.203125 0.421875 0.203125 1.234375l0 3.5l-0.9375 0l0 -3.5q0 -0.703125 -0.3125 -1.015625q-0.296875 -0.328125 -0.859375 -0.328125q-0.40625 0 -0.78125 0.21875q-0.359375 0.21875 -0.515625 0.59375q-0.15625 0.359375 -0.15625 1.015625l0 3.015625l-0.9375 0zm8.637146 -2.015625l0.9375 -0.125q0.15625 0.796875 0.546875 1.15625q0.390625 0.34375 0.9375 0.34375q0.65625 0 1.109375 -0.453125q0.46875 -0.46875 0.46875 -1.140625q0 -0.640625 -0.421875 -1.0625q-0.421875 -0.421875 -1.078125 -0.421875q-0.265625 0 -0.65625 0.109375l0.109375 -0.828125q0.09375 0.015625 0.140625 0.015625q0.59375 0 1.078125 -0.3125q0.484375 -0.3125 0.484375 -0.96875q0 -0.515625 -0.359375 -0.84375q-0.34375 -0.34375 -0.890625 -0.34375q-0.546875 0 -0.921875 0.34375q-0.359375 0.34375 -0.453125 1.03125l-0.9375 -0.171875q0.171875 -0.9375 0.78125 -1.453125q0.609375 -0.515625 1.5 -0.515625q0.625 0 1.15625 0.265625q0.53125 0.265625 0.796875 0.734375q0.28125 0.453125 0.28125 0.984375q0 0.484375 -0.265625 0.890625q-0.265625 0.40625 -0.78125 0.65625q0.671875 0.15625 1.046875 0.65625q0.375 0.484375 0.375 1.21875q0 1.0 -0.734375 1.703125q-0.71875 0.6875 -1.828125 0.6875q-1.0 0 -1.671875 -0.59375q-0.65625 -0.609375 -0.75 -1.5625z" fill-rule="nonzero"/><path fill="#c9daf8" d="m746.43304 405.8819l0 0c0 -13.828857 31.361267 -25.039368 70.04724 -25.039368l0 0c38.686035 0 70.0473 11.21051 70.0473 25.039368l0 0c0 13.828857 -31.361267 25.039368 -70.0473 25.039368l0 0c-38.685974 0 -70.04724 -11.21051 -70.04724 -25.039368z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0" d="m746.43304 405.8819l0 0c0 -13.828857 31.361267 -25.039368 70.04724 -25.039368l0 0c38.686035 0 70.0473 11.21051 70.0473 25.039368l0 0c0 13.828857 -31.361267 25.039368 -70.0473 25.039368l0 0c-38.685974 0 -70.04724 -11.21051 -70.04724 -25.039368z" fill-rule="evenodd"/><path fill="#000000" d="m783.52606 405.90314q0 -1.890625 1.015625 -2.96875q1.03125 -1.078125 2.640625 -1.078125q1.046875 0 1.890625 0.515625q0.859375 0.5 1.296875 1.40625q0.453125 0.890625 0.453125 2.046875q0 1.15625 -0.46875 2.078125q-0.46875 0.90625 -1.328125 1.375q-0.859375 0.46875 -1.859375 0.46875q-1.078125 0 -1.921875 -0.515625q-0.84375 -0.515625 -1.28125 -1.40625q-0.4375 -0.90625 -0.4375 -1.921875zm1.046875 0.015625q0 1.375 0.734375 2.171875q0.734375 0.796875 1.859375 0.796875q1.140625 0 1.875 -0.796875q0.734375 -0.8125 0.734375 -2.28125q0 -0.921875 -0.3125 -1.609375q-0.3125 -0.703125 -0.921875 -1.078125q-0.609375 -0.390625 -1.359375 -0.390625q-1.078125 0 -1.84375 0.734375q-0.765625 0.734375 -0.765625 2.453125zm7.4293823 5.828125l0 -7.65625l0.859375 0l0 0.71875q0.296875 -0.421875 0.671875 -0.625q0.390625 -0.21875 0.921875 -0.21875q0.703125 0 1.25 0.375q0.546875 0.359375 0.8125 1.03125q0.28125 0.65625 0.28125 1.453125q0 0.84375 -0.3125 1.53125q-0.296875 0.671875 -0.875 1.03125q-0.578125 0.359375 -1.21875 0.359375q-0.46875 0 -0.84375 -0.1875q-0.375 -0.203125 -0.609375 -0.515625l0 2.703125l-0.9375 0zm0.84375 -4.859375q0 1.0625 0.4375 1.578125q0.4375 0.515625 1.046875 0.515625q0.625 0 1.0625 -0.53125q0.453125 -0.53125 0.453125 -1.640625q0 -1.046875 -0.4375 -1.578125q-0.4375 -0.53125 -1.046875 -0.53125q-0.59375 0 -1.0625 0.5625q-0.453125 0.5625 -0.453125 1.625zm8.864014 0.953125l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm5.2233887 3.296875l0 -5.53125l0.84375 0l0 0.796875q0.609375 -0.921875 1.75 -0.921875q0.5 0 0.921875 0.1875q0.421875 0.171875 0.625 0.46875q0.21875 0.296875 0.296875 0.6875q0.046875 0.265625 0.046875 0.921875l0 3.390625l-0.9375 0l0 -3.359375q0 -0.578125 -0.109375 -0.859375q-0.109375 -0.28125 -0.390625 -0.453125q-0.265625 -0.171875 -0.640625 -0.171875q-0.59375 0 -1.03125 0.390625q-0.4375 0.375 -0.4375 1.4375l0 3.015625l-0.9375 0zm5.5514526 -1.65625l0.921875 -0.140625q0.078125 0.5625 0.4375 0.859375q0.359375 0.296875 1.0 0.296875q0.640625 0 0.953125 -0.265625q0.3125 -0.265625 0.3125 -0.625q0 -0.3125 -0.28125 -0.5q-0.1875 -0.125 -0.953125 -0.3125q-1.03125 -0.265625 -1.4375 -0.453125q-0.390625 -0.1875 -0.59375 -0.515625q-0.203125 -0.34375 -0.203125 -0.75q0 -0.359375 0.171875 -0.671875q0.171875 -0.328125 0.453125 -0.53125q0.21875 -0.15625 0.59375 -0.265625q0.390625 -0.125 0.8125 -0.125q0.65625 0 1.140625 0.1875q0.5 0.1875 0.734375 0.515625q0.234375 0.3125 0.3125 0.859375l-0.90625 0.125q-0.0625 -0.4375 -0.375 -0.671875q-0.296875 -0.234375 -0.828125 -0.234375q-0.65625 0 -0.9375 0.21875q-0.265625 0.203125 -0.265625 0.484375q0 0.1875 0.109375 0.328125q0.125 0.15625 0.359375 0.25q0.140625 0.0625 0.828125 0.25q1.0 0.265625 1.390625 0.4375q0.390625 0.15625 0.609375 0.484375q0.234375 0.3125 0.234375 0.796875q0 0.46875 -0.28125 0.890625q-0.265625 0.40625 -0.78125 0.640625q-0.515625 0.21875 -1.171875 0.21875q-1.078125 0 -1.640625 -0.4375q-0.5625 -0.453125 -0.71875 -1.34375zm9.484375 -0.125l0.96875 0.125q-0.234375 0.84375 -0.859375 1.3125q-0.609375 0.46875 -1.578125 0.46875q-1.203125 0 -1.921875 -0.75q-0.703125 -0.75 -0.703125 -2.09375q0 -1.390625 0.71875 -2.15625q0.71875 -0.78125 1.859375 -0.78125q1.109375 0 1.8125 0.765625q0.703125 0.75 0.703125 2.125q0 0.078125 0 0.234375l-4.125 0q0.046875 0.921875 0.515625 1.40625q0.46875 0.484375 1.15625 0.484375q0.515625 0 0.875 -0.265625q0.359375 -0.28125 0.578125 -0.875zm-3.078125 -1.515625l3.09375 0q-0.0625 -0.6875 -0.359375 -1.046875q-0.453125 -0.53125 -1.15625 -0.53125q-0.640625 0 -1.09375 0.4375q-0.4375 0.421875 -0.484375 1.140625zm8.832764 2.609375q-0.53125 0.453125 -1.015625 0.640625q-0.46875 0.171875 -1.015625 0.171875q-0.921875 0 -1.40625 -0.4375q-0.484375 -0.453125 -0.484375 -1.140625q0 -0.40625 0.171875 -0.734375q0.1875 -0.34375 0.484375 -0.546875q0.3125 -0.203125 0.6875 -0.3125q0.265625 -0.0625 0.828125 -0.140625q1.125 -0.125 1.671875 -0.3125q0 -0.203125 0 -0.25q0 -0.578125 -0.265625 -0.8125q-0.359375 -0.3125 -1.0625 -0.3125q-0.65625 0 -0.984375 0.234375q-0.3125 0.234375 -0.453125 0.8125l-0.921875 -0.125q0.125 -0.578125 0.40625 -0.9375q0.296875 -0.375 0.828125 -0.5625q0.546875 -0.203125 1.25 -0.203125q0.71875 0 1.15625 0.171875q0.4375 0.171875 0.640625 0.421875q0.21875 0.25 0.296875 0.640625q0.046875 0.234375 0.046875 0.859375l0 1.25q0 1.296875 0.0625 1.65625q0.0625 0.34375 0.234375 0.65625l-0.96875 0q-0.15625 -0.296875 -0.1875 -0.6875zm-0.078125 -2.078125q-0.515625 0.203125 -1.53125 0.34375q-0.578125 0.078125 -0.828125 0.1875q-0.234375 0.109375 -0.359375 0.3125q-0.125 0.1875 -0.125 0.4375q0 0.375 0.28125 0.625q0.28125 0.25 0.828125 0.25q0.53125 0 0.953125 -0.234375q0.421875 -0.234375 0.625 -0.65625q0.15625 -0.3125 0.15625 -0.9375l0 -0.328125zm2.3796387 2.765625l0 -5.53125l0.84375 0l0 0.84375q0.328125 -0.59375 0.59375 -0.78125q0.28125 -0.1875 0.609375 -0.1875q0.46875 0 0.953125 0.3125l-0.3125 0.859375q-0.34375 -0.203125 -0.6875 -0.203125q-0.3125 0 -0.5625 0.1875q-0.234375 0.1875 -0.34375 0.515625q-0.15625 0.5 -0.15625 1.09375l0 2.890625l-0.9375 0zm7.173584 -2.03125l0.921875 0.125q-0.15625 0.953125 -0.78125 1.5q-0.625 0.53125 -1.53125 0.53125q-1.125 0 -1.8125 -0.734375q-0.6875 -0.75 -0.6875 -2.125q0 -0.90625 0.296875 -1.578125q0.296875 -0.671875 0.890625 -1.0q0.609375 -0.34375 1.328125 -0.34375q0.890625 0 1.46875 0.46875q0.578125 0.453125 0.734375 1.28125l-0.90625 0.140625q-0.140625 -0.546875 -0.46875 -0.828125q-0.328125 -0.28125 -0.796875 -0.28125q-0.703125 0 -1.15625 0.515625q-0.4375 0.5 -0.4375 1.59375q0 1.109375 0.421875 1.625q0.4375 0.5 1.125 0.5q0.546875 0 0.90625 -0.34375q0.375 -0.34375 0.484375 -1.046875zm1.71875 2.03125l0 -7.625l0.9375 0l0 2.734375q0.65625 -0.765625 1.65625 -0.765625q0.609375 0 1.0625 0.25q0.453125 0.234375 0.640625 0.671875q0.203125 0.421875 0.203125 1.234375l0 3.5l-0.9375 0l0 -3.5q0 -0.703125 -0.3125 -1.015625q-0.296875 -0.328125 -0.859375 -0.328125q-0.40625 0 -0.78125 0.21875q-0.359375 0.21875 -0.515625 0.59375q-0.15625 0.359375 -0.15625 1.015625l0 3.015625l-0.9375 0zm13.543396 -0.90625l0 0.90625l-5.03125 0q-0.015625 -0.34375 0.109375 -0.65625q0.1875 -0.515625 0.609375 -1.015625q0.421875 -0.5 1.234375 -1.140625q1.234375 -1.03125 1.671875 -1.625q0.4375 -0.59375 0.4375 -1.125q0 -0.5625 -0.40625 -0.9375q-0.390625 -0.390625 -1.03125 -0.390625q-0.671875 0 -1.078125 0.40625q-0.40625 0.40625 -0.40625 1.125l-0.96875 -0.09375q0.09375 -1.078125 0.734375 -1.640625q0.65625 -0.5625 1.734375 -0.5625q1.109375 0 1.75 0.609375q0.640625 0.609375 0.640625 1.5q0 0.46875 -0.1875 0.90625q-0.1875 0.4375 -0.625 0.9375q-0.4375 0.484375 -1.453125 1.328125q-0.828125 0.71875 -1.078125 0.96875q-0.234375 0.25 -0.390625 0.5l3.734375 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m585.01575 351.0971l317.51184 0l0 193.7638l-317.51184 0z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" stroke-dasharray="8.0,3.0" d="m585.01575 351.0971l317.51184 0l0 193.7638l-317.51184 0z" fill-rule="evenodd"/><path fill="#cfe2f3" d="m667.33856 134.52231l0 0c0 8.005951 25.96045 14.496063 57.984253 14.496063c32.023865 0 57.984253 -6.4901123 57.984253 -14.496063l0 125.212585c0 8.005981 -25.960388 14.496063 -57.984253 14.496063c-32.023804 0 -57.984253 -6.490082 -57.984253 -14.496063z" fill-rule="evenodd"/><path fill="#e2edf7" d="m667.33856 134.52231l0 0c0 -8.005951 25.96045 -14.496063 57.984253 -14.496063c32.023865 0 57.984253 6.4901123 57.984253 14.496063l0 0c0 8.005951 -25.960388 14.496063 -57.984253 14.496063c-32.023804 0 -57.984253 -6.4901123 -57.984253 -14.496063z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m783.30707 134.52231l0 0c0 8.005951 -25.960388 14.496063 -57.984253 14.496063c-32.023804 0 -57.984253 -6.4901123 -57.984253 -14.496063l0 0c0 -8.005951 25.96045 -14.496063 57.984253 -14.496063c32.023865 0 57.984253 6.4901123 57.984253 14.496063l0 125.212585c0 8.005981 -25.960388 14.496063 -57.984253 14.496063c-32.023804 0 -57.984253 -6.490082 -57.984253 -14.496063l0 -125.212585" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m783.30707 134.52231l0 0c0 8.005951 -25.960388 14.496063 -57.984253 14.496063c-32.023804 0 -57.984253 -6.4901123 -57.984253 -14.496063l0 0c0 -8.005951 25.96045 -14.496063 57.984253 -14.496063c32.023865 0 57.984253 6.4901123 57.984253 14.496063l0 125.212585c0 8.005981 -25.960388 14.496063 -57.984253 14.496063c-32.023804 0 -57.984253 -6.490082 -57.984253 -14.496063l0 -125.212585" fill-rule="evenodd"/><path fill="#000000" d="m699.26953 193.79665q0 -3.328125 1.78125 -5.203125q1.78125 -1.890625 4.609375 -1.890625q1.84375 0 3.328125 0.890625q1.484375 0.875 2.265625 2.46875q0.78125 1.578125 0.78125 3.578125q0 2.03125 -0.828125 3.640625q-0.8125 1.59375 -2.3125 2.421875q-1.5 0.828125 -3.25 0.828125q-1.875 0 -3.359375 -0.90625q-1.484375 -0.921875 -2.25 -2.5q-0.765625 -1.578125 -0.765625 -3.328125zm1.8125 0.015625q0 2.421875 1.296875 3.8125q1.296875 1.390625 3.265625 1.390625q2.0 0 3.28125 -1.40625q1.28125 -1.40625 1.28125 -3.984375q0 -1.625 -0.546875 -2.84375q-0.546875 -1.21875 -1.609375 -1.875q-1.0625 -0.671875 -2.375 -0.671875q-1.890625 0 -3.25 1.296875q-1.34375 1.28125 -1.34375 4.28125zm14.527039 6.484375l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.875732 -6.546875l0 -1.90625l1.640625 0l0 1.90625l-1.640625 0zm-2.078125 15.203125l0.3125 -1.390625q0.5 0.125 0.78125 0.125q0.5 0 0.734375 -0.328125q0.25 -0.328125 0.25 -1.671875l0 -10.15625l1.640625 0l0 10.203125q0 1.78125 -0.46875 2.484375q-0.59375 0.90625 -1.96875 0.90625q-0.65625 0 -1.28125 -0.171875zm12.863586 -6.859375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453796 2.21875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625z" fill-rule="nonzero"/><path fill="#000000" d="m693.49536 217.99977l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm16.412354 2.828125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5407715 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.8913574 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953857 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#cfe2f3" d="m619.0236 51.207348c0 -20.743292 47.591797 -37.559055 106.299194 -37.559055l0 0c58.70746 0 106.299255 16.815762 106.299255 37.559055l0 0c0 20.743298 -47.591797 37.559055 -106.299255 37.559055l0 0c-58.707397 0 -106.299194 -16.815758 -106.299194 -37.559055z" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m619.0236 51.207348c0 -20.743292 47.591797 -37.559055 106.299194 -37.559055l0 0c58.70746 0 106.299255 16.815762 106.299255 37.559055l0 0c0 20.743298 -47.591797 37.559055 -106.299255 37.559055l0 0c-58.707397 0 -106.299194 -16.815758 -106.299194 -37.559055z" fill-rule="evenodd"/><path fill="#000000" d="m682.6886 58.127346l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm9.8654175 2.15625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm8.641357 1.953125l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.2926636 2.265625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.313232 5.015625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.8533325 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485046 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm16.140625 6.59375l0 -4.734375q-0.375 0.546875 -1.0625 0.90625q-0.6875 0.34375 -1.46875 0.34375q-1.71875 0 -2.96875 -1.375q-1.234375 -1.375 -1.234375 -3.765625q0 -1.46875 0.5 -2.625q0.515625 -1.15625 1.46875 -1.75q0.96875 -0.59375 2.109375 -0.59375q1.796875 0 2.828125 1.515625l0 -1.296875l1.46875 0l0 13.375l-1.640625 0zm-5.046875 -8.5625q0 1.859375 0.78125 2.796875q0.78125 0.9375 1.875 0.9375q1.046875 0 1.796875 -0.890625q0.765625 -0.890625 0.765625 -2.703125q0 -1.9375 -0.796875 -2.90625q-0.796875 -0.96875 -1.875 -0.96875q-1.0625 0 -1.8125 0.90625q-0.734375 0.90625 -0.734375 2.828125zm9.219482 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m366.89764 200.93964l283.27557 -123.18111" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m366.89764 200.93964l277.77332 -120.78846" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m645.3296 81.66589l3.5029907 -3.3243942l-4.8203125 0.29496002z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m366.89764 200.93964l300.44092 -3.81102" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m366.89764 200.93964l294.4414 -3.7349396" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m661.36 198.85631l4.5167847 -1.7091522l-4.558655 -1.5940399z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m366.89764 200.93964l376.8819 150.17322" fill-rule="evenodd"/><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m366.89764 200.93964l371.30804 147.95227" fill-rule="evenodd"/><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m737.5943 350.4263l4.8271484 0.14541626l-3.604309 -3.214203z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m247.02362 609.521l232.97638 0l0 42.015747l-232.97638 0z" fill-rule="evenodd"/><path fill="#000000" d="m257.46112 636.441l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.504211 -9.890625l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.488556 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5895691 1.46875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.228302 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.644806 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm15.219482 4.90625l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.625702 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230194 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.406952 5.765625l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm14.621521 4.828125l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm22.009552 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485107 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.328125 0l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm16.296875 1.703125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.891327 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.063232 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m575.81366 545.5315l232.97638 0l0 42.015747l-232.97638 0z" fill-rule="evenodd"/><path fill="#000000" d="m586.25116 572.4515l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.504211 -9.890625l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.4885254 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5895996 1.46875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2282715 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm15.219482 4.90625l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.6256714 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230225 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.406921 5.765625l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm14.074646 0.53125l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm19.459229 1.1875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453857 4.578125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1881714 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5408325 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm3.015625 3.546875l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m799.43304 153.49081l146.5827 0l0 87.27559l-146.5827 0z" fill-rule="evenodd"/><path fill="#000000" d="m809.87054 180.41081l0 -13.359375l4.609375 0q1.546875 0 2.375 0.203125q1.140625 0.25 1.953125 0.953125q1.0625 0.890625 1.578125 2.28125q0.53125 1.390625 0.53125 3.171875q0 1.515625 -0.359375 2.703125q-0.359375 1.171875 -0.921875 1.9375q-0.546875 0.765625 -1.203125 1.21875q-0.65625 0.4375 -1.59375 0.671875q-0.9375 0.21875 -2.140625 0.21875l-4.828125 0zm1.765625 -1.578125l2.859375 0q1.3125 0 2.0625 -0.234375q0.75 -0.25 1.203125 -0.703125q0.625 -0.625 0.96875 -1.6875q0.359375 -1.0625 0.359375 -2.578125q0 -2.09375 -0.6875 -3.21875q-0.6875 -1.125 -1.671875 -1.5q-0.703125 -0.28125 -2.28125 -0.28125l-2.8125 0l0 10.203125zm11.504211 -9.890625l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm3.4885864 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.5895386 1.46875l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.2283325 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6447754 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm15.219482 4.90625l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm7.6257324 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230164 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.406982 5.765625l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125z" fill-rule="nonzero"/><path fill="#000000" d="m809.7924 202.8108l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm16.563232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.1882324 4.859375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.9157715 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953857 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#000000" d="m809.3393 218.7108q0 -3.328125 1.78125 -5.203125q1.78125 -1.890625 4.609375 -1.890625q1.84375 0 3.328125 0.890625q1.484375 0.875 2.265625 2.46875q0.78125 1.578125 0.78125 3.578125q0 2.03125 -0.828125 3.640625q-0.8125 1.59375 -2.3125 2.421875q-1.5 0.828125 -3.25 0.828125q-1.875 0 -3.359375 -0.90625q-1.484375 -0.921875 -2.25 -2.5q-0.765625 -1.578125 -0.765625 -3.328125zm1.8125 0.015625q0 2.421875 1.296875 3.8125q1.296875 1.390625 3.265625 1.390625q2.0 0 3.28125 -1.40625q1.28125 -1.40625 1.28125 -3.984375q0 -1.625 -0.546875 -2.84375q-0.546875 -1.21875 -1.609375 -1.875q-1.0625 -0.671875 -2.375 -0.671875q-1.890625 0 -3.25 1.296875q-1.34375 1.28125 -1.34375 4.28125zm14.5271 6.484375l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm8.875671 -6.546875l0 -1.90625l1.640625 0l0 1.90625l-1.640625 0zm-2.078125 15.203125l0.3125 -1.390625q0.5 0.125 0.78125 0.125q0.5 0 0.734375 -0.328125q0.25 -0.328125 0.25 -1.671875l0 -10.15625l1.640625 0l0 10.203125q0 1.78125 -0.46875 2.484375q-0.59375 0.90625 -1.96875 0.90625q-0.65625 0 -1.28125 -0.171875zm12.863586 -6.859375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453857 2.21875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm6.397827 -2.828125l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm16.412354 2.828125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.281982 4.84375l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.5407715 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.8913574 5.65625l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm15.953857 1.90625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m86.07874 13.648276l68.22047 0l0 90.96063l-68.22047 0z" fill-rule="evenodd"/><g transform="matrix(0.3032020997375328 0.0 0.0 0.3032020997375328 86.07874015748031 13.648276377952756)"><clipPath id="p.1"><path d="m0 0l225.0 0l0 300.0l-225.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#p.1)" fill="#000" width="225.0" height="300.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/></g><path fill="#000000" fill-opacity="0.0" d="m145.8084 579.92255l101.21533 0l0 101.21509l-101.21533 0z" fill-rule="evenodd"/><g transform="matrix(0.12651916010498687 0.0 0.0 0.12651889763779528 145.80839895013122 579.9225202099738)"><clipPath id="p.2"><path d="m-2.2737368E-13 0l800.0 0l0 800.0l-800.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#p.2)" fill="#000" width="800.0" height="800.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAS6i4H1GqP/SsAAAAASUVORK5CYII="/></g><path fill="#000000" fill-opacity="0.0" d="m836.0945 -1.4557372l105.136536 0l0 105.32545l-105.136536 0z" fill-rule="evenodd"/><g transform="matrix(0.1897771653543307 0.0 0.0 0.18977559055118107 836.0944881889764 -1.4557372703412073)"><clipPath id="p.3"><path d="m0 0l554.0 0l0 555.0l-554.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#p.3)" fill="#000" width="554.0" height="555.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/></g><path fill="#000000" fill-opacity="0.0" d="m746.43304 549.11176l179.66406 0l0 34.85669l-179.66406 0z" fill-rule="evenodd"/><g transform="matrix(0.23393753280839896 0.0 0.0 0.23393727034120734 746.4330708661417 549.111764304462)"><clipPath id="p.4"><path d="m4.5474735E-13 0l768.0 0l0 149.0l-768.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#p.4)" fill="#000" width="768.0" height="149.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/></g><path fill="#000000" fill-opacity="0.0" d="m831.6221 228.49606l68.22046 0l0 68.22049l-68.22046 0z" fill-rule="evenodd"/><g transform="matrix(0.08527559055118111 0.0 0.0 0.08527559055118111 831.6220472440945 228.4960650918635)"><clipPath id="p.5"><path d="m0 0l800.0 0l0 800.0l-800.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#p.5)" fill="#000" width="800.0" height="800.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAYAAADbcAZoAACAAElEQVR4XuzdCZgcVbn4/xkgISwhma5TMyEEDRoVQXDBBfUviiLuK0bcjahzIVOnqpsEcEHp64I/3NeruFwU1ztIkulzqpMAOqiIqLkqonBFEBVQ9lWWhJD5v2/1oPH0ELLM0j39/T7P55lkkkAyU9V9TnfVOV1dREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREtD3N73e7zy2vnBtV3D5xZWhRX5IfFFn3VGPrz45T92KT5S/tq+SvMJl7Q5T5N0Wpf2uUugFlrF8WZ/49hTQ/1aT5aca6j8vv+69SUjvdpO4rpcx/x9j8ew9G/jvOpLXVOyJO/Irwv7u5kvXf0b+PitLaZ+Xf9NHi75r6Dzzw95fPVR74d8m//y36b5Vff52p1F+mX4NeWz8yHsgPM0n+5FJlzYF9y2v7mWRofk//4Jyu6uDM8OtKRERERNQ6Vas7dfWfPmPhkuFZfcvX7lGy9b3mHOd75i9zpjcb6tOBrXxuwdyB/OF9SW0/Gfw+0gzkj44St38xOSi750SpTAp0gGzdO02mE4H8ZB38y4//Swb+39ZBeWT9Ghl0/8gktYti6y+JbO1y+dxf5NdvkT97h0wg7pc/s6mQbgu/JSNtIPw7B8J/7xb88+vnN8pk6Db5eGPxNU7cpfK9+q1M4n4m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"/></g></g></svg> ===================================================== == File: docs/modules/concepts/nav.adoc ===================================================== * xref:index.adoc[] ** xref:user/index.adoc[] ** xref:mail/index.adoc[] *** xref:messages/index.adoc[] **** xref:messages/imf.adoc[] **** xref:messages/mime.adoc[] ** xref:protocols/index.adoc[] *** xref:protocols/smtp.adoc[] *** xref:protocols/pop.adoc[] *** xref:protocols/imap.adoc[] *** xref:protocols/jmap.adoc[] *** xref:protocols/esmtp.adoc[] *** xref:protocols/lmtp.adoc[] ** xref:storage/index.adoc[] *** xref:storage/mailbox.adoc[] *** xref:storage/users.adoc[] ** xref:processing/index.adoc[] ** xref:configuration.adoc[] ** xref:glossary.adoc[] ===================================================== == File: docs/modules/concepts/pages/configuration.adoc ===================================================== = Configuration == Overview An important aspect to understand about James is the idea of "configuration". Sometimes "configuration" means different things to different people, so we wanted to ensure that what we mean by the concept is clear and precise, because in order operate a James server, you will necessarily need to configure it. A "*Configuration*" is a https://martinfowler.com/bliki/ValueObject.html[value object] that communicates to a James server how the xref:user/index.adoc#_operator[Operator] wishes the server to behave. It is very similar to an interface, but yet it is not quite an interface (which is why we call it something different). An "interface" provides a means for an Operator to interact with a server as part of the normal course of ongoing operations. Interfacing with the system essentially means either reading the server's current state, or updating the server's current state. A typical example would be adding a new mailbox via the xref:concepts:???.adoc[Useradmin API]. Each time the Operator interacts with the system via an interface, although the *state* of the system may change, the *behavior* of the system is not expected to change. By contrast, "configuration" of a system (also a noun, but yet not the same as the "Configuration" we mention above) is more like a switching mechanism that instructs the server how to behave given some kind of interaction via an interface. For example, if a James server is configured to allow multiple domains, then if an Operator adds "user@domain1.com" and "user@domain2.com", the server will happily accept the command. If only a single domain is permitted via configuration, then only one of those mailboxes will be allowed. In other words, given the same interaction by the Operator, given different configurations the behavior of the system is different. Some systems call these "settings", so as a user of a system you would "configure your settings". ===================================================== == File: docs/modules/concepts/pages/mail/index.adoc ===================================================== = All About Emails :navtitle: Emails The https://en.wikipedia.org/wiki/History_of_email[history of email] has resulted in a convoluted patchwork of standards and practices, which can be very difficult to understand and decipher. Fortunately, James has your back. We have built up our own view of emails that allows us to process messages in a consistent and comprehensible way. To help you understand how James approaches emails, we have divided this section up into the following parts: * xref:messages/index.adoc[] * xref:protocols/index.adoc[] ===================================================== == File: docs/modules/concepts/pages/storage/mailbox.adoc ===================================================== = Mailboxes :navtitle: Mailboxes == Overview To (over)use the analogy once again of a postal system, we think of a mailbox as a place where a letter is placed to await pickup by its recipient. Although current methods have evolved considerably, the original idea used for the development of email was exactly that. The concept <<RFC196,has been around officially>> since at least 1971. The image of a mailbox is so prevalent that, although current systems have evolved to do so much more than just hold messages for processing, the industry continues to apply the concept. The more general term is "Email Storage". It is necessary to store email for many reasons: * As a mailbox system — part of a queue to await processing * As a persistence mechanism — a place where you can go back and predictably locate a message that you may want to refer to again in the future * As an archive — a place where you may want to store "deleted" emails so that you can potentially retrieve them if you wish to change your mind later * As a temporary step in a process — perhaps you have a "todo" folder where you temporarily store an email that you intend to process soon There are numerous ways to store emails, just as there are numerous reasons for storing them: * A <<Specifications,standardized>> "mailbox" format * A relational database * A custom file-based mechanism * Etc. This section briefly describes how email storage is a core concept in an email system. == Specifications === Electronic Mail Box ==== RFC196 The concept of an "electronic mail box" was https://tools.ietf.org/html/rfc196[initially specified] way back in 1971. It is amusing to read the retro concepts in the initial description of this document: The purpose of this protocol is to provide at each site a standard mechanism to receive sequential files for immediate or ===================================================== == File: docs/modules/concepts/pages/storage/users.adoc ===================================================== = User Repository :navtitle: Users == Overview Whereas xref:storage/mailbox.adoc[mailboxes] are clearly a core component of any email system, user management is a lighter shade of gray. // "Repository" should be "Directory". See JAMES-3360. On the one hand, mailboxes ought to match up with actual xref:user/index.adoc#_user[Users], so there is a clear relationship between mailbox management and user management. Because of this relationship, it is not at all strange to include a user respository within an email system. However, on the other hand email is only one of many applications that require user management. It is therefore also completely reasonable to use some kind of centralized user directory, and ensure that mailboxes somehow synchronize with this external system. The former case is much simpler to manage, but requires duplicate and therefore unproductive work. The latter case can become quite complex from a technological perspective (and all the risks that are associated with it), but reduces the amount of unproductive work. == Common Operations // "Repository" should be "Directory". See JAMES-3360. Because the user repository is used in the context of managing mailboxes, there are some operations that are relatively common to any email system. === Domain Management A mailbox belongs to a https://en.wikipedia.org/wiki/Domain_name[domain]. For a mail system that can process multiple domains, the system will usually have operations to: * List available domains * Add a domain * Remove a domain * Update a user's password === User Management A User has at least one mail box, and will usually have a canonical mailbox that matches the user's identity in the system. For each domain that is managed by the system, it is common to be able to: * List all users for the domain * Add a user ===================================================== == File: docs/modules/concepts/pages/storage/index.adoc ===================================================== = Storage :navtitle: Storage == Overview Email is useful because any one person can send a message to any other person, anywhere in the world. The heart of email is the ability to transfer some message based on a commonly-understood message format between two different systems that may have been developed entirely independently of each other. The concept is relatively simple, but the fact that email is so ubiquitous is simply a miracle. However, there is more to email than just the transfer of messages. For starters, I want people I know to be able to send me a mail even when I happen to be out mountain climbing. I want to be able to receive the message when I'm not available, then review it afterward when I am back at my desk. For this reason, email is by design asynchronous. Time can pass between the moment a mail is sent and the moment it is read. In the meantime, it needs to be stored somewhere. Additionally, although it is possible to read a message, then discard it, never to be seen again, it is more common for people to archive a message. Some people even get creative and use their email for various other purposes, such as a kind of poor man's information archive. Many corporations use email for business purposes, which requires administration of users within the organization. Even individuals with a self-hosted email server want to ensure that their system does not get abused as an xref:concepts:glossary.adoc#open_relay[open relay]. All of these types of concerns requires that the system maintain some kind of state, whether that be the messages themselves, information about the system's users, and even in some cases user credentials. Keeping state requires a storage system. The system of storage must work intimately with the various xref:protocols/index.adoc[protocols]. In this section, we describe the two principle types of storage that James manages: * xref:storage/mailbox.adoc[Mailboxes] for email storage, and // "Repository" should be "Directory". See JAMES-3360. * xref:storage/users.adoc[User Repository] for data about Mailbox users. ===================================================== == File: docs/modules/concepts/pages/messages/mime.adoc ===================================================== = Multipurpose Internet Mail Extensions :navtitle: MIME == Overview The base format of an email message is xref:messages/imf.adoc[Internet Message Format"], but most contemporary messages use a format called https://en.wikipedia.org/wiki/MIME["Multipurpose Internet Mail Extensions"]. MIME specifies how to extend a valid IMF message, dealing with character encodings, various file formats, and many other odds and ends that make email what it is today. A user of email rarely has to be concerned with the MIME specifications. Usually the communications system should take care of all the nitty gritty, and even then MIME processing is usually at a very low level. For this reason, the blissfully simple conception of a simple "email" is usually just fine from the perspective of a user and even in most cases for a developer. == Specifications Multipurpose Internet Mail Extensions, or just MIME, functions much like an extension to IMF in order to: * Add different character sets for internationalization * Allow for processing of media types other than plain text === RFC2045 https://tools.ietf.org/html/rfc2045[RFC2045] ("Multipurpose Internet Mail Extensions Part One: Format of Internet Message Bodies") describes the message body format of an email. It is part of a serious of MIME specifications including <<RFC2046>>, <<RFC2047>>, <<RFC2048>>, and <<RFC2049>>. This particular document in the series specifies the various headers that are used to describe the structure of a MIME message. === RFC2046 https://tools.ietf.org/html/rfc2046[RFC2046] ("Multipurpose Internet Mail Extensions Part Two: Media Types") describes the various MIME media types, such as plain text, images, videos, etc. It is part of the serious of MIME specifications that includes <<RFC2045>>, <<RFC2047>>, <<RFC2048>>, and <<RFC2049>>. === RFC2047 ===================================================== == File: docs/modules/concepts/pages/messages/imf.adoc ===================================================== = Internet Message Format :navtitle: IMF == Overview What people casually call "email" actually refers more specifically to a text message written in a specified format called https://en.wikipedia.org/wiki/Email["Internet Message Format"] or "IMF". After the first IMF specification was published in 1982 there was no looking back. Email took the world by storm. Today it is arguably the most prevalent means of communicating with a distant party. IMF is very basic, and is limited to only specifying a syntax for text messages. For the transmission of images, audio, or other types of data we need to make use of the xref:mail/messages/mime.adoc[MIME] specification. Although IMF forms the base standard upon which email is based, email today is rarely used without MIME. We therefore consider for practical purposes that an email message is essentially the equivalent of a MIME message. == Specifications The specifications for Internet Message Format (IMF) form the basis of what we commonly call "email". === RFC822 https://tools.ietf.org/html/rfc822[RFC822] ("Standard for the Format of ARPA Internet Text Messages") was the original standard that defined the format of an email. It was obsoleted by <<RFC2822>>. The definition of an email under this standard was an attempt to take the lessons learned from the ARPANET and extend the use of text messaging to a broader context. Electronic mail messages are defined as having contents and an envelope. The contents consist of header fields and, optionally, a body. The body is nothing more than a (potentially empty) sequence of lines of text. Although this sounds like an extremely simple concept, to get two completely separate systems to agree and understand each other is a surprisingly complex problem that most people today take for granted. Most of RFC822 deals with the nitty-gritty of formatting and parsing this type of text message. This specification deals with the headers, additionally relating them to the sending and forwarding of messages. The body content is dealt with in <<RFC2045>> === RFC2822 ===================================================== == File: docs/modules/concepts/pages/messages/index.adoc ===================================================== = Email Messages :navtitle: Messages An email message is essentially a simple text message that is communicated from one party to another. It is no miracle that two unknown parties are able to communicate; rather we can thank a set of standards that allow any two unrelated systems to process an email even if the system owners do not know each other. The two most important standards upon which today's emails are based are: * xref:messages/imf.adoc[Internet Mail Format] (IMF) * xref:messages/mime.adoc[Multipurpose Internet Mail Extensions] (MIME) ===================================================== == File: docs/modules/concepts/pages/protocols/jmap.adoc ===================================================== = JSON Meta Application Protocol (JMAP) :navtitle: JMAP == Overview https://jmap.io/[JSON Meta Application Protocol] ("JMAP") is From <<RFC8620>>: The JSON Meta Application Protocol (JMAP) is used for synchronising data, such as mail, calendars, or contacts, between a client and a server. It is optimised for mobile and web environments and aims to provide a consistent interface to different data types. This specification is for the generic mechanism of data synchronisation. Further specifications define the data models for different data types that may be synchronised via JMAP. == Specifications === RFC8620 https://tools.ietf.org/html/rfc8620[RFC8620] ("The JSON Meta Application Protocol (JMAP)") == Related Concepts ===================================================== == File: docs/modules/concepts/pages/protocols/imap.adoc ===================================================== = Internet Message Access Protocol (IMAP) :navtitle: IMAP == Overview https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol[Internet Message Access Protocol], or IMAP, is a protocol used by email clients to retrieve xref:messages/index.adoc[email messages] from a xref:glossary.adoc#email_server[mail server]. One could say that it is effectively in competition with xref:protocols/pop.adoc[POP] because it accomplishes a function similar in nature, and most clients will force you to choose one or the other. These days, the natural choice of protocol tends to be IMAP rather than POP. The main difference between IMAP and POP is that messages are kept on the server, which keeps a kind of master reference. Instead of transferring the message to the client, only an image, or copy of the message is kept locally. When the client synchronises with the state of the server, it will tend to mimic that state. So if a new message is stored in a mailbox, it will appear on the client, or if a message is deleted from the server, it will also be deleted from the client. The user can control the state of server from the client by adding, deleting, or moving messages between folders. The user can also add folders from the client, the state of which will be stored on the server. == Specifications === IMAP Apparently, no official specification exists for the original IMAP. It became a specification with the publication of <<IMAP2>> === IMAP2 ==== RFC1064 https://tools.ietf.org/html/rfc1064[RFC1064] ("Interactive Mail Access Protocol - Version 2") was the original IMAP2 specification, published in 1988. The specification was obsoleted by <<RFC1176>>. ==== RFC1176 https://tools.ietf.org/html/rfc1176[RFC1176] ("Interactive Mail Access Protocol - Version 2") provides various, somewhat minor updates to <<RFC1064>>. This specification was superseded by the first IMAP3 specification, <<RFC1203>>. === IMAP3 ==== RFC1203 ===================================================== == File: docs/modules/concepts/pages/protocols/smtp.adoc ===================================================== = Simple Mail Transfer Protocol (SMTP) :navtitle: SMTP == Overview When the original specification for Simple Mail Transfer Protocol, or SMTP, was published almost 40 years ago together with xref:messages/imf.adoc[IMF], email as we know it today was born. == Specifications === RFC821 https://tools.ietf.org/html/rfc821[RFC821] ("Simple Mail Transfer Protocol") was the original SMTP specification published in 1982. It was obsoleted by <<RFC2821>> in 2001. === RFC2821 https://tools.ietf.org/html/rfc2821[RFC2821] ("Simple Mail Transfer Protocol") replaced <<RFC821>>. It was itself replaced by <<RFC5321>> in 2008. === RFC 5321 https://tools.ietf.org/html/rfc5321[RFC5321] is the currently used standard for "Simple Mail Transfer Protocol", or "SMTP". Published in 2008, it is "a specification of the basic protocol for Internet electronic mail transport". If you are interested in all the gory details, we recommend that you read this document. This specification has many dependencies with xref:messages/imf.adoc[IMF], xref:messages/mime.adoc[MIME], and other technical concepts, which can quickly become utterly confusing. Here, we provide a very short and simplified description of those portions of the specification that we felt were interesting enough to repeat here. As the spec mentions, "SMTP transports a mail object", a mail object being described as an object that contains both an envelope and content. An SMTP client connects to a server and communicates via a session. Both client and server provide a mail transport service, and are therefore act as "Mail Transfer Agents", or "MTAs". A mail originates and terminates with a "Mail User Agent" ("MUA"). On the originating side, a MUA may, for instance, collect mail to be transmitted by a user and hand it off to an MTA. On the terminating side, an MTA would hand a mail off to an MUA. "SMTP sessions are stateful, with both parties carefully maintaining a common view of the current state." The session is initiated by the client, which establishes a two-way channel to an SMTP server. The session must either close successful (or with a failure message), else delivery is considered to ===================================================== == File: docs/modules/concepts/pages/protocols/index.adoc ===================================================== = Transmission Protocols :navtitle: Protocols The true value of email is that any one party can communicate with any other party located virtually anywhere. All they need are a common understanding of a xref:messages/index.adoc[message format], and a means of transmitting the message. Transmitting email messages between parties requires a mutually-known protocol. It turns out that there are several standard protocols used for the transmission of email messages, each with a different purpose: ** xref:protocols/smtp.adoc[Simple Mail Transfer] ** xref:protocols/pop.adoc[Post Office] ** xref:protocols/imap.adoc[Internet Message Access] ** xref:protocols/jmap.adoc[JSON Meta Application] ** xref:protocols/lmtp.adoc[Local Mail Transfer] ===================================================== == File: docs/modules/concepts/pages/protocols/pop.adoc ===================================================== = Post Office Protocol (POP) :navtitle: POP == Overview The https://en.wikipedia.org/wiki/Post_Office_Protocol[Post Office Protocol], or POP, is described in the original specification as being "a simple method for workstations to dynamically access mail from a xref:storage/index.adoc[mailbox server]" (though interestingly "mailbox server" is never actually defined in this specification nor in later specifications. ??) POP was proposed as the first non-xref:protocols/smtp.adoc[SMTP] protocol aimed at users for the purpose of retrieving emails stored remotely for local consumption. POP was developed in pre-spam days, so was inherently a non-secure protocol. It has been updated several times to address several issues, including lack of security, so that POP3 is now the current specification. As the name suggests, the protocol is modeled after a post office. The analogy being: * The various SMTP servers along the transmission chain are like post offices * The user's mail server is the local post office that will dispatch the mail to the recipient * The postman is, ummm, well no analogy is perfect ?? * The mail gets dropped into the user's mailbox (though just to make the analogy even muddier there is an option to leave a copy on the server) Analogies aside, the protocol worked quite well for most users, and is still widely in use today. POP requires essentially two pieces, the POP Client and the POP Server. How the message gets initially delivered to the POP Server and how a message is managed once delivered to the POP Client is out of scope of the POP protocol. == Specifications === POP POP has been around since the early days of email. The original specification <<RFC918>> was published in 1984. ==== RFC918 https://tools.ietf.org/html/rfc918[RFC918] ("Post Office Protocol") was the original specification published in 1984. The RFC "suggests a simple method for workstations to dynamically access mail from a mailbox server." Like xref:protocols/smtp.adoc[SMTP] that came before it, POP is a session-based protocol with a handful of defined commands. This RFC was obsoleted shortly after its publication by <<RFC937>>. ===================================================== == File: docs/modules/concepts/pages/protocols/esmtp.adoc ===================================================== = SMTP Service Extensions (ESMTP) :navtitle: ESMTP == Overview https://en.wikipedia.org/wiki/Extended_SMTP[SMTP Service Extensions], written as "ESMTP" and characterized in the literature as "Extended SMTP" (and sometimes "Enhanced SMTP") is a framework for extending SMTP. Extensions are expected to be registered with IANA and negotiated between the client and server. Whereas SMTP mandates that a session begins with the "HELO" command, ESMTP requires the "EHLO" (extended hello) command. Note that nowadays even "standard" SMTP uses EHLO as its initial greeting, and only falls back to HELO, so in a sense every SMTP server has effectively become an ESMTP server. The ESMTP specification itself no longer actually exists independently of SMTP. We mention it here mostly for completion, historical purposes, and as a reference to a concept that is still very much in use, albeit now as a concept internal to SMTP. == Specifications === RFC1425 https://tools.ietf.org/html/rfc1425[RFC1425] ("SMTP Service Extensions") is the originally published ESMTP specification. It was obsoleted by <<RFC1651>>. === RFC1651 https://tools.ietf.org/html/rfc1651[RFC1651] ("SMTP Service Extensions") obsoletes <<RFC1425>> and was itself obsoleted by <<RFC1869>>. === RFC1869 https://tools.ietf.org/html/rfc1869[RFC1869] ("SMTP Service Extensions") obsoletes <<RFC1651>>, and is essentially the final specification in which ESMTP was defined separately from SMTP. When this spec was obsoleted by xref:protocols/smtp.adoc#RFC2821[RFC2821], it was incorporated into the SMTP specification. == Related Concepts * *xref:protocols/smtp.adoc[SMTP]*, because ESMTP defines an extension framework for SMTP * *xref:protocols/lmtp.adoc[LMTP]*, as LMTP is defined by the ESMTP framework ===================================================== == File: docs/modules/concepts/pages/protocols/lmtp.adoc ===================================================== = Local Mail Transfer Protocol (LMTP) :navtitle: LMTP == Overview https://en.wikipedia.org/wiki/Local_Mail_Transfer_Protocol[Local Mail Transfer Protocol] ("LMTP") is From <<RFC2033>>: Although LMTP is an alternative protocol to ESMTP, it uses (with a few changes) the syntax and semantics of ESMTP. This design permits LMTP to utilize the extensions defined for ESMTP. LMTP should be used only by specific prior arrangement and configuration, and it MUST NOT be used on TCP port 25. == Specifications === RFC2033 https://tools.ietf.org/html/rfc2033[RFC2033] ("Local Mail Transfer Protocol") was published in 1996, and defines a simplified protocol for local mail delivery mainly inspired by xref:protocols/esmtp.adoc[ESMTP]. It is the first, last, and only specification of its kind. == Related Concepts LMTP relates to: * *xref:protocols/esmtp.adoc[ESMTP]*, as it is a derivative thereof ===================================================== == File: docs/modules/concepts/pages/user/index.adoc ===================================================== = James User Model :navtitle: User Model For clarity, we have defined various roles for actors who interact with xref:servers:index.adoc[James servers] in one way or another. The deliverables we make available are produced with these roles in mind. Note that any given person may play more than one role, even at the same time. * <<User>> * <<Operator>> * <<Integrator>> * <<Developer>> * <<Contributor>> * <<Committer>> * <<PMC Member>> == User A **User** simply uses email without any notion of what server is providing the service. More precisely, in typical cases a User will have an email client for reading and writing email. The xref:glossary.adoc[email client] will connect to the James server via xref:protocols/smtp.adoc[SMTP], xref:protocols/pop.adoc[POP], or xref:protocols/imap.adoc[IMAP]. The User will have no indication anywhere that the server is a James server. == Operator An **Operator** installs and runs James for the benefit of Users. The Operator does not compile any Java code, and does not require any software development environment. Apache James offers Operators a range of servers for various use cases, including: * A xref:servers:basic/index.adoc[Basic Server] ideal for busy Operators who are interested in an easy-to-use self-hosting solution, but who may not have the time to gain deep expertise * An xref:server/advanced/index.adoc[Advanced Server] well-suited for Operators with advanced skills and resources who are not daunted by getting their hands dirty with configurations or using built-in extensions == Integrator An **Integrator** has some expertise with Java or a JVM-based language. Based ===================================================== == File: docs/modules/concepts/pages/processing/index.adoc ===================================================== = Mail Processing Domain Model :navtitle: Processing (TODO) ===================================================== == File: docs/modules/concepts/pages/glossary.adoc ===================================================== = Glossary [[email_client]] Email Client:: Any software application that acts as a POP Client or an IMAP Client. xref:messages/imf.adoc[IMF]:: *Internet Message Format* (IMF) is the base specification that defines the syntax of an email message. [[email_server]] Email Server (or Mail Server):: Any host that contains a software application that acts as a POP Server, an IMAP Server, or an MTA. IMAP:: IMAP Client:: One of the main actors in an email system that implements the IMAP protocol. The client acts as a slave, in that it mirrors the state of the IMAP Server. IMAP Server:: One of the main actors in an email system that implements the IMAP protocol. The server acts as the master, in that it dictates the state that will be seen on each of the IMAP Clients. JMAP:: xref:messages/mime.adoc[MIME]:: *Multipurpose Internet Mail Extension* (MIME) is a specification that extends IMF, defining most of the "advanced" features of email. [[mta]] MTA:: A *Mail Transfer Agent* (MTA) is a host that is capable of providing a mail transport service compliant with the SMTP protocol. MUA:: A *Mail User Agent* (MUA) is either an agent that hands over a message to an initial MTA on the originating side of a transmission, or receives the message from the final MTA on the terminating side of a transmission. It is in some respects similar to an MTA, but is local in scope and does not necessarily follow a known specification. xref:protocols/smtp.adoc[SMTP]:: *Simple Mail Transfer Protocol* (SMTP) is a protocol that specifies how to transmit a valid email message from one MTA to another. [[open_relay]] Open Relay:: ===================================================== == File: docs/modules/concepts/pages/index.adoc ===================================================== = Apache James Core Concepts :navtitle: Concepts The core domain of Apache James is intimately related to email communications. Therefore this section is divided into topics that deal with the various aspect of email systems. * <<emails>> * <<protocols>> * <<mailbox>> * <<processing>> [#emails] == Email Messages Electronic Mail (often written as "e-mail" or "email") is a means of exchanging messages over a data network. In our context, it is obvious that we mean "electronic mail" and not "postal mail", so we usually just write "mail". xref:mail/index.adoc[Email messages] are based on a few specifications that are not easy to digest, so we make an effort to provide a simplified model. [#protocols] == Transmission Protocols Emails are only useful because people can communicate with each other. To allow for this, obviously there must be a means of transmitting messages from one user to another. A number of different protocols have emerged to handle the various different requirements of using email in a practical manner. The most common xref:protocols/index.adoc[transmission protocols] are SMTP, POP, and IMAP. More recently JMAP is an interesting protocol that merits attention. [#mailbox] == Mailbox and Email Storage Email would not be very useful if, like in https://www.youtube.com/watch?v=0TiqXFssKMY[Mission Impossible], a message would self-destruct immediately after being read. For those of us who are not secret agents, we generally prefer to keep a record of those messages that we receive. For this reason we need a means of xref:storage/index.adoc[storing messages]. ===================================================== == File: docs/modules/ROOT/nav.adoc ===================================================== * Apache James Reference Documentation ===================================================== == File: docs/modules/ROOT/pages/index.adoc ===================================================== = Welcome Welcome to the Apache James Reference Documentation! These documents are for version {page-version} of James. Apache James is a flexible email platform that provides out-of-the-box mail servers that you can start using in production immediately. James runs on the JVM and is highly customizable. This Reference Book is divided into the following Parts: * xref:james-project:concepts:index.adoc[James Core Concepts] ** These are the core concepts that describe what James is all about. Start here if you want to learn more about what James can do and how it is designed. * xref:james-project:servers:index.adoc[James Servers] ** We provide a few out-of-the-box servers that you can choose from depending on your needs. Start here if you just want to get up and running quickly with a working production-grade mail server. * xref:james-project:customization:index.adoc[Customization] ** Shows how you can customize any James server with the functionalities that you need. Check out this section if you have special business or technical needs and are interested in a custom solution. * xref:james-project:development:index.adoc[James Developer Guide] ** A guide aimed at experienced developers, describing how you can assemble your own specialized server. * xref:james-project:community:index.adoc[James Community] ** All about the Apache James community, and how you can be part of this active and dynamic group, too! Please note that this Reference Documentation is a **living document**. It is subject to change. You are currently reading version {page-version}. If you find anything that is unclear, unfinished, or confusing, please do not hestiate to xref:james-project:community:index.adoc[lend us a hand]. ===================================================== == File: docs/modules/development/nav.adoc ===================================================== * xref:index.adoc[] ** xref:logging.adoc[] ===================================================== == File: docs/modules/development/pages/deployment-tests.adoc ===================================================== = How to run deployment Tests :navtitle: Deployment tests We wrote some MPT (James' Mail Protocols Tests subproject) deployment tests to validate a James deployment. It uses the External-James module, that uses environment variables to locate a remote IMAP server and run integration tests against it. For that, the target James Server needs to be configured with a domain `domain` and a user `imapuser` with password `password`. Read above documentation to see how you can do this. You have to run MPT tests inside docker. As you need to use maven, the simplest option is to use james/parent image, and override the entry point ( as git and maven are already configured there ) : $ export JAMES_ADDRESS=127.0.0.1 $ export JAMES_IMAP_PORT=143 $ export JAMES_SMTP_PORT=25 $ mvn -T 1C -DskipTests -pl org.apache.james:apache-james-mpt-external-james -am install $ mvn -T 1C -pl org.apache.james:apache-james-mpt-external-james test -Pintegration-tests Where : * JAMES_IP: IP address or DNS entry for your James server * JAMES_IMAP_PORT: Port allocated to James' IMAP port (should be 143). * JAMES_SMTP_PORT: Port allocated to James' SMTP port (should be 25). ===================================================== == File: docs/modules/development/pages/logging.adoc ===================================================== = Logging in Apache James NOTE: This information targets developers. Logging is very important when running a software. Most of the time people use logs for debugging and troubleshooting issues in production. In Apache James we leverage a logging facade for logging http://www.slf4j.org/[Slf4j] . Please see the documentation for exact details. In a typical application logs are stored for a specific period. This can be 1 day, 1 week, etc. Some other typical scenarios include: * Rotating logs periodically. * Shipping logs centrally. * Saving some logging messages to other files / end devices By leveraging a logging facade like Slf4j, the end user has the ability to use different logging back ends and achieve the above requirements. Logging is something we do to help the people running our code. We also help ourselves when they encounter bugs, and they need to share information with us for a fix. As developers, we should be mindful of the logging statements. We should also be mindful about the performance implications of logging and not abuse it. == Loggers used in code You can define a logger using a string or a class. For common loggers it's ok to use a string name. [source,java] -- private static final Logger LOGGER = LoggerFactory.getLogger("org.apache.james.CONFIGURATION"); private static final Logger LOGGER = LoggerFactory.getLogger(JamesServerMain.class); -- Loggers can be hierarchical. This helps when we build a logger from a class name, and we use package structure to drive the logger hierarchy. The most useful loggers should to be documented below. Please maintain this list of loggers. org.apache.james.CONFIGURATION:: It is used to log events related to configuration loading and updating. == Logging when debugging tests When investigating failing tests, increasing the log level can provide valuable insights. === Log Configuration ===================================================== == File: docs/modules/development/pages/index.adoc ===================================================== = Apache James Developer Guide :navtitle: Developer Guide This page aggregates common knowledge for contributing to Apache james servers. xref:community:contributing.adoc[Contribution guidelines] apply. xref:logging.adoc[This page] explains how *logging* should be done. Help of kind contributors is more than welcome to write guides explaining newcomers your hard-learned lessons! ===================================================== == File: docs/modules/community/nav.adoc ===================================================== * xref:index.adoc[] ** xref:mailing-lists.adoc[] ** xref:contributing.adoc[] ** xref:guidelines.adoc[] ** xref:download.adoc[] ** xref:website.adoc[] ** xref:release.adoc[] ** xref:support.adoc[] ** Apache Software Foundation *** https://www.apache.org/[ASF] *** https://www.apache.org/foundation/getinvolved.html[Get involved] *** https://www.apache.org/foundation/faq.html[FAQ] *** https://www.apache.org/licenses/[Licenses] *** https://www.apache.org/security/[Security] *** https://www.apache.org/foundation/sponsorship.html[Sponsorship] *** https://www.apache.org/foundation/thanks.html[Thanks] ===================================================== == File: docs/modules/community/pages/support.adoc ===================================================== = Professional support Here is a list of companies which can provide you some support on James. == Baechler Craftsmanship mailto:matthieu@baechler-craftsmanship.fr[*Baechler Craftsmanship*] has a very strong knowledge both on email and James. The company is run by a long-time contributor and PMC of James which contributed significant enhancements over the years. The company is committed to contribute to James and offers consultancy for companies willing to use James on their own infrastructure and/or need enhancements to fit their own needs. Free Software is a core value of the company and it can also help customers to work with James community in an efficient and positive way. == Linagora image::linagora.png[link=https://linagora.com] *Linagora* is an Open Source Software Company. Their mission is to bring digital independence to their customers. They are focused on large organizations both from private and public sector. They have set themselves the goal of helping Governments to achieve their digital sovereignty. *Linagora* can offer professional services related to James: support, feature development or project integration. ===================================================== == File: docs/modules/community/pages/website.adoc ===================================================== = Building and publishing the website The source code of website https://james.apache.org[james.apache.org] is located in src/homepage. Here are the instructions how to publish new changes to the website. 1. Install Apache Maven 3.0.2+ and make its binary 'mvn' available on your PATH. See http://maven.apache.org/download.html#Installation. 2. run "mvn clean site" 3. Test the built site in your browser from the {path}/target/site folder 4. If everything looks OK, deploy the site using "mvn clean site-deploy". 5. Wait for the changes to replicate to the Apache web server or setup 140.211.11.10:80 as a proxy to review the changes (described here: http://www.apache.org/dev/project-site.html) To deploy the technical reports use the "-Psite-reports" profile. For wagon-ssh-external configuration see http://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ssh-external.html You can alternatively use a docker container to build the website : You need to build the homepage by: $ docker build -t james/homepage src/homepage-docker $ docker run -v $PWD:/origin -v $PWD/site:/destination james/homepage master In order to test the homepage, you can use this command: $ docker run --rm -v $PWD/site:/srv/jekyll -p 4000:4000 -it jekyll/minimal:3.8.3 jekyll serve the site will be available at http://localhost:4000/ Then you build the other pages by: $ docker build -t james/site src/site-docker $ docker run -v $PWD/.m2:/root/.m2 -v $PWD:/origin -v $PWD/site:/destination james/site master If you need to update the current site, checkout the branch asf-site from Apache git: $ git clone https://git-wip-us.apache.org/repos/asf/james-site.git $ cd james-site $ git checkout origin/asf-site -b asf-site And replace in the previous commands `$PWD/site` by `<james-site-clone-directory>/content`, for example: $ docker run -v $PWD:/origin -v $PWD/../james-site/content:/destination james/homepage master $ docker run -v $PWD/.m2:/root/.m2 -v $PWD/../james-site/content:/origin -v $PWD/site:/destination james/site master Then just push the new site: $ cd ../james-site ===================================================== == File: docs/modules/community/pages/guidelines.adoc ===================================================== = Apache James Project guidelines :navtitle: Guidelines This document defines the guidelines for the Apache James Project. It includes definitions of how conflict is being resolved by voting and who is able to vote. The objective here is to avoid unnecessary conflicts over changes and continue to produce a quality system in a timely manner. Not all conflict can be avoided, but at least we can agree on the procedures for conflicts to be resolved. == People, Places, and Things === Apache James Project Management Committee The group of volunteers who are responsible for managing the Apache James Project. This includes deciding what is distributed as products of the Apache James Project, maintaining the Project's shared resources, speaking on behalf of the Project, resolving license disputes regarding Apache James products, nominating new PMC members or committers, and establishing these guidelines. Membership in the Apache James PMC is by invitation only and must be approved by consensus of the active Apache James PMC members. A PMC member is considered inactive by their own declaration or by not contributing in any form to the project for over six months. An inactive member can become active again by reversing whichever condition made them inactive (i.e., by reversing their earlier declaration or by once again contributing toward the project's work). Membership can be revoked by a unanimous vote of all the active PMC members other than the member in question. === Apache James Committers The group of volunteers who are responsible for the technical aspects of the Apache James Project. This group has write access to the appropriate source repositories and these volunteers may cast non-binding votes on any technical discussion. Membership as a Committer is by invitation only and must be approved by consensus of the active Apache James PMC members. A Committer is considered inactive by their own declaration or by not contributing in any form to the project for over six months. An inactive member can become active again by reversing whichever condition made them inactive (i.e., by reversing their earlier declaration or by once again contributing toward the project's work). Membership can be revoked by a unanimous vote of all the active PMC members (except the member in question if they are a PMC member). === Mailing list The Apache committers' primary mailing list for discussion of issues and changes related to the project (xref:mailing-lists.adoc#_server_developer_list[server-dev@james.apache.org]). Subscription to the list is open, but only subscribers can post directly to the list. === Private list The Apache James Project's private mailing list for discussion of issues that are inappropriate for public discussion, such as legal, personal, or security issues prior to a published fix. Subscription to the list is only opened to Apache James PMC members and Apache Software Foundation Members. Topics to be discussed on the private mailing list: - Discussion of board reports. PMC members need to report quarterly project activity to the Apache board of directors, ===================================================== == File: docs/modules/community/pages/download.adoc ===================================================== = Download Apache James releases :navtitle: Download releases https://james.apache.org/download[Download Apache James releases] ===================================================== == File: docs/modules/community/pages/mailing-lists.adoc ===================================================== = Mailing lists Please read the <<_guidelines>> below before subscribing to our lists and join our community. == James mailing lists Most James mailing lists are open and also archived and available online. You can read them even if you are not subscribed. You can post only if you are subscribed. === Mailing list archives and web browsing You can browse the mailing list archives online using the https://lists.apache.org/list.html?james.apache.org[Pony Mail] instance. === Server user list *Low traffic* mailto:server-user-subscribe@james.apache.org[Subscribe] mailto:server-user-unsubscribe@james.apache.org[Unsubscribe] link:++https://lists.apache.org/list.html?server-user@james.apache.org++[Archive] This is the list where users of the Apache James (Server) meet and discuss issues. Developers are also expected to be subscribed to this list to offer support to users of Apache James (Server). === Server developer list *Medium traffic* mailto:server-dev-subscribe@james.apache.org[Subscribe] mailto:server-dev-unsubscribe@james.apache.org[Unsubscribe] link:++https://lists.apache.org/list.html?server-dev@james.apache.org++[Archive] This is the list where participating developers of the Apache James Project meet and discuss issues, code changes/additions, etc. Do not send mail to this list with usage questions or configuration problems -- that's what server-user@james is for. === Mime4j *Medium traffic* mailto:mime4j-dev-subscribe@james.apache.org[Subscribe] mailto:mime4j-dev-unsubscribe@james.apache.org[Unsubscribe] link:++https://lists.apache.org/list.html?mime4j-dev@james.apache.org++[Archive] Discussions on the http://james.apache.org/mime4j[Mime4j] parser library. === James general list *Low traffic* mailto:general-subscribe@james.apache.org[Subscribe] mailto:general-unsubscribe@james.apache.org[Unsubscribe] link:++https://lists.apache.org/list.html?general@james.apache.org++[Archive] ===================================================== == File: docs/modules/community/pages/release.adoc ===================================================== = Creating an official Apache James release Read details about http://www.apache.org/dev/publishing-maven-artifacts.html[Publishing Maven releases to Maven Central Repository] In short, just follow the 'standard' process: * prepare pom for release * publish snapshot * prepare release * stage the release for a vote (don't forget to close the staging repository) * vote * release Don't forget to add your key to https://downloads.apache.org/james/KEYS $ ssh people.apache.org $ cd /www/www.apache.org/dist/james == Release cheat sheet First, discuss your intention to perform a release on server-dev mailing list, to ensure a consensus would be reached before starting this time-consuming process. Then you can prepare the release materials: * Ensure the `CHANGELOG.md` and `upgrade-instructions.md` files are up to date. * Freeze your version in it and initiate a new iteration. * Write a blog post within `/src/homepage/_post` about your release. * Update the documentation website `/docs`, `src/site`, and `README.md` to point to your new release. * Update the `/dockerfiles` Open a pull request to validate the changes. === Running a maven release Once merged, it is time for the maven release. Set up your maven configuration in `~/.m2/settings.xml` : [source,bash] ---- <settings> <servers> <server> <id>apache.snapshots.https</id> <username>apacheId</username> <password>xxxxxx</password> </server> <!-- To stage a release of some part of Maven --> <server> ===================================================== == File: docs/modules/community/pages/index.adoc ===================================================== = Apache James Community :navtitle: Community Apache James Project is an Open Source all-volunteer project obtaining its strength from its Community made of developers and users. All are welcome to the Community! == Join the community There are many ways for Users, Developers, Curious and Fans to join and be part of the James Community: * https://james.apache.org/[Apache James Website] * xref:mailing-lists.adoc[Mailing lists]: Subscribe to the appropriate Mailing Lists according to your interests and profile. * https://gitter.im/apache/james-project[Gitter chat room]: Chat in live with the community on Gitter. * https://twitter.com/ApacheJames[Twitter]: Express yourself and follow us @ApacheJames. * https://github.com/apache/james-project[GitHub]: Read and contribute to the source code of the project. * https://issues.apache.org/jira/projects/JAMES[JIRA]: Report issues or make suggestions for the project on our bug tracker. * https://builds.apache.org/job/ApacheJames/[CI]: Check the status of James builds on our Jenkins CI. * xref:download.adoc[Download releases]: Download artifacts and sources your need for the James Server and James libraries. * xref:support.adoc[Professional support]: Find a list of companies which can provide you some support on James. == Contribute James is a project that lives from the contributions of its community. *Anyone can contribute!* That's right, we always want to hear from people with contributions to the code, the documentation, the website, and bug reports. We more than welcome non-coding contributions. You can find more information on how to contribute to the James project on the xref:contributing.adoc[contributing] section. == Articles for contributors ** xref:website.adoc[] ** xref:release.adoc[] == The Apache Software Foundation James is a project belonging to the https://www.apache.org/[Apache Software Foundation [ASF\]]. Thus, the Apache Jame project is governed by a number of xref:guidelines.adoc[guidelines] directly depending on the *ASF*. If you wish to get more involved with the *ASF* community in general, those links might interest you as well: * https://www.apache.org/foundation/getinvolved.html[Get involved with the ASF] * https://www.apache.org/foundation/faq.html[Apache FAQ] * https://www.apache.org/licenses/[Apache Licenses] * https://www.apache.org/security/[The Apache security team] * https://www.apache.org/foundation/sponsorship.html[Sponsorship program] * https://www.apache.org/foundation/thanks.html[Sponsors list] ===================================================== == File: docs/modules/community/pages/contributing.adoc ===================================================== = Contributing This document defines the different ways available for contributing to the Apache James project. To keep you informed on James issues, subscribe to the relevant xref:mailing-lists.adoc[mailing lists]. == Be involved in the community An easy start is to be involved in the community. Share your experiences with James, your needs, your enhancements proposition via the xref:mailing-lists.adoc[mailing lists], on https://gitter.im/apache/james-project[Gitter], or on our https://issues.apache.org/jira/projects/JAMES/issues[Bug Tracker]. Don't hesitate to write articles and blog posts. Use your preferred media to spread the love! == Reporting bugs Many improvements come as a direct result of bug reports. To report a bug, please use the appropriate Bug Tracker JIRA link according to the project you want to address: * https://issues.apache.org/jira/browse/JAMES[Server] * https://issues.apache.org/jira/browse/MAILET[Mailet] * https://issues.apache.org/jira/browse/MAILBOX[Mailbox] * https://issues.apache.org/jira/browse/PROTOCOLS[Protocols] * https://issues.apache.org/jira/browse/MPT[MPT] * https://issues.apache.org/jira/browse/MIME4J[Mime4j] * https://issues.apache.org/jira/browse/JSIEVE[jSieve] * https://issues.apache.org/jira/browse/JSPF[jSPF] * https://issues.apache.org/jira/browse/JDKIM[jDKIM] Once you are logged on the appropriate JIRA page, click on the red Create button, then complete the different fields as accurately as possible, so that any user can reproduce the reported bug. Also, note that all your information must be readable (use markdown). Then, you have to click on Create to submit your bug. === Reporting security vulnerabilities http://www.apache.org/security/[Security vulnerabilities] should be announced to the Apache Security team. PMCs will be notified about them, and will work hard to propose fixes as fast as possible. Specific details about security in James can be found here. == Documentation Documentation is an easy way to get on board! Check out the link:https://issues.apache.org/jira/issues/?jql=project%20%3D%20JAMES%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%20documentation%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC[~documentation] label on JIRA to get some ideas. ===================================================== == File: docs/README.md ===================================================== # Building and serving documentation locally ## Executing within source code (Clone `https://github.com/apache/james-project` locally, go into `docs` folder) **Step 1**: [Install Antora](https://docs.antora.org/antora/latest/install-and-run-quickstart/) **Step 2**: Build the Antora content locally ``` antora antora-playbook-local.yml ``` **Step 3**: Open `build/site/index.html` in your browser. ## Building with Dockerfile To build the document from apache-james repository, you can use the Dockerfile provided in this folder. Build the Docker image: ``` docker build --build-arg JAMES_CHECKOUT=master -f Dockerfile -t james-site-antora . ``` Then run the Docker image: ``` docker run -p 80:80 james-site-antora ``` Go to `http://localhost` in your browser. ===================================================== == File: docs/antora-playbook-local.yml ===================================================== # # Use this configuration for local testing / docs develop. # # Note: Executing Antora can only be done from within a git repository. # When UNZIPPING the application, you will need to initialize the git repository: # # $ git init # $ git add . # $ git commit -m "First commit" # # You may want to update paths below too... site: title: Apache James Server url: https://james.apache.org/ start_page: james-project::index.adoc content: sources: # url should match the relative position for your git repository. A value for a git repo located in the docs folder would be: # - url: ./ - url: ./../ branches: HEAD # Must match the relative position of the Antora docs files within the git repository stated above. # A value for a git repo located in the docs folder would be: # start_path: ./ start_path: ./docs ui: bundle: url: https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/master/raw/build/ui-bundle.zip?job=bundle-stable supplemental_files: ./ui-overrides runtime: fetch: true ===================================================== == File: docs/antora.yml ===================================================== name: james-project title: Apache James Server version: '3.9.0' prerelease: SNAPSHOT nav: - modules/concepts/nav.adoc - modules/servers/nav.adoc - modules/customization/nav.adoc - modules/development/nav.adoc - modules/community/nav.adoc ===================================================== == File: testing/base/src/main/resources/logback-test.xml ===================================================== <?xml version="1.0" encoding="UTF-8"?> <!-- NOTE: To activate debug mode, follow Steps 1 & 2 --> <configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>target/test-run.log</file> <append>false</append> <!-- set immediateFlush to false for much higher logging throughput --> <immediateFlush>false</immediateFlush> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{35} - %msg%n%rEx</pattern> </encoder> </appender> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern> </encoder> <immediateFlush>false</immediateFlush> <!-- Step 1: Disable below block for debug logs mode--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> </appender> <!-- Step 2: Set log level to DEBUG--> <root level="WARN"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> <logger name="org.apache.james" level="DEBUG" /> <logger name="org.testcontainers" level="DEBUG"/> <logger name="org.apache.james.metrics" level="INFO"/> </configuration> ===================================================== == File: testing/base/src/main/resources/testcontainers.properties ===================================================== checks.disable = false