Document Sieve
diff --git a/content/Dockerfile b/content/Dockerfile
new file mode 100644
index 0000000..9ee311b
--- /dev/null
+++ b/content/Dockerfile
@@ -0,0 +1,25 @@
+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"]
diff --git a/content/feed.xml b/content/feed.xml
index 320b3ff..1f0cd1f 100644
--- a/content/feed.xml
+++ b/content/feed.xml
@@ -24,8 +24,8 @@
 </description>
     <link>http://james.apache.org/</link>
     <atom:link href="http://james.apache.org/feed.xml" rel="self" type="application/rss+xml"/>
-    <pubDate>Fri, 12 Nov 2021 15:20:33 +0700</pubDate>
-    <lastBuildDate>Fri, 12 Nov 2021 15:20:33 +0700</lastBuildDate>
+    <pubDate>Fri, 12 Nov 2021 15:25:03 +0700</pubDate>
+    <lastBuildDate>Fri, 12 Nov 2021 15:25:03 +0700</lastBuildDate>
     <generator>Jekyll v4.2.0</generator>
     
       <item>
@@ -80,7 +80,7 @@
 
 &lt;p&gt;Join him Tuesday, 21th of September in the &lt;em&gt;highligh&lt;/em&gt; track.&lt;/p&gt;
 
-&lt;p&gt;The link to the video of the talk will be updated when available.&lt;/p&gt;
+&lt;p&gt;This talk can be seen on &lt;a href=&quot;https://www.youtube.com/watch?v=uA775icp-kk&quot;&gt;youtube&lt;/a&gt;.&lt;/p&gt;
 
 </description>
         <pubDate>Tue, 21 Sep 2021 05:00:30 +0700</pubDate>
diff --git a/content/james/update/2021/09/21/james-joinsapachecon.html b/content/james/update/2021/09/21/james-joinsapachecon.html
index beb0972..5f14d73 100644
--- a/content/james/update/2021/09/21/james-joinsapachecon.html
+++ b/content/james/update/2021/09/21/james-joinsapachecon.html
@@ -97,7 +97,7 @@
 
 <p>Join him Tuesday, 21th of September in the <em>highligh</em> track.</p>
 
-<p>The link to the video of the talk will be updated when available.</p>
+<p>This talk can be seen on <a href="https://www.youtube.com/watch?v=uA775icp-kk">youtube</a>.</p>
 
 
 
diff --git a/content/rat-report.html b/content/rat-report.html
index 76d7ce4..495075b 100644
--- a/content/rat-report.html
+++ b/content/rat-report.html
@@ -163,20 +163,20 @@
 *****************************************************
 Summary
 -------
-Generated at: 2021-11-12T15:12:44+07:00
+Generated at: 2021-11-12T15:23:51+07:00
 
 Notes: 2703
 Binaries: 11732
 Archives: 6367
-Standards: 12841
+Standards: 12839
 
-Apache Licensed: 8338
+Apache Licensed: 8335
 Generated Documents: 0
 
 JavaDocs are generated, thus a license header is optional.
 Generated files do not require license headers.
 
-4496 Unknown Licenses
+4497 Unknown Licenses
 
 *****************************************************
 
@@ -2679,6 +2679,7 @@
   server/apps/distributed-app/docs/modules/ROOT/pages/configure/dsn.adoc
   server/apps/distributed-app/docs/modules/ROOT/pages/configure/healthcheck.adoc
   server/apps/distributed-app/docs/modules/ROOT/pages/configure/spam.adoc
+  server/apps/distributed-app/docs/modules/ROOT/pages/configure/sieve.adoc
   server/apps/distributed-app/docs/modules/ROOT/pages/configure/index.adoc
   server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc
   server/apps/distributed-app/docs/modules/ROOT/pages/configure/smtp.adoc
@@ -18897,6 +18898,7 @@
   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/starttls.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/authenticateBase64.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/unauthenticate.test
   AL    mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/noop.test
@@ -27496,6 +27498,7 @@
   AL    protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationException.java
   AL    protocols/managesieve/src/main/java/org/apache/james/managesieve/api/SyntaxException.java
   AL    protocols/managesieve/src/main/java/org/apache/james/managesieve/jsieve/Parser.java
+  AL    protocols/managesieve/src/main/java/org/apache/james/managesieve/transcode/NotEnoughDataException.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/util/ParserUtils.java
@@ -30532,14 +30535,10 @@
  !????? server/data/data-jmap/target/test-classes.155458254.timestamp
  !????? server/data/data-jmap/target/checkstyle-cachefile
  !????? server/data/data-jmap/james-server-data-jmap.iml
-  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/model/PushSubscription.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/model/Identity.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/change/TypeStateFactory.scala
-  AL    server/data/data-jmap/src/main/scala/org/apache/james/jmap/memory/identity/MemoryCustomIdentityDAO.scala
   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/access/AccessToken.java
   AL    server/data/data-jmap/src/main/java/org/apache/james/jmap/api/access/exceptions/NotAnAccessTokenException.java
@@ -30595,8 +30594,6 @@
   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/memory/change/MemoryMailboxChangeRepository.java
   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/identity/CustomIdentityDAOContract.scala
-  AL    server/data/data-jmap/src/test/scala/org/apache/james/jmap/memory/identity/MemoryCustomIdentityTest.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/access/AccessTokenTest.java
   AL    server/data/data-jmap/src/test/java/org/apache/james/jmap/api/access/AccessTokenRepositoryContract.java
@@ -34214,6 +34211,7 @@
  !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/dsn.adoc
  !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/healthcheck.adoc
  !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/spam.adoc
+ !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/sieve.adoc
  !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/index.adoc
  !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc
  !????? server/apps/distributed-app/docs/modules/ROOT/pages/configure/smtp.adoc
@@ -48737,12 +48735,13 @@
  !????? server/protocols/jmap-rfc-8621/target/checkstyle-cachefile
   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/EmailBodyValue.scala
+  AL    server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailAddress.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/Identity.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/BlobId.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/MDN.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/Email.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/EmailAddressGroup.scala
@@ -85208,10 +85207,11 @@
 
 Join him Tuesday, 21th of September in the *highligh* track.
 
-The link to the video of the talk will be updated when available.
+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/2016-02-09-jmap.markdown
@@ -117764,6 +117764,60 @@
 if not spam they then send to not.spam@thisdomain.com. BayesianAnalysisfeeder learns
 
 =====================================================
+== File: server/apps/distributed-app/docs/modules/ROOT/pages/configure/sieve.adoc
+=====================================================
+= Sieve
+:navtitle: Sieve
+
+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 positionned 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: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.&lt;/p&gt;
+
+== ManageSieve protocol
+
+*WARNING*: ManageSieve protocol should be considered experimental.
+
+Consult link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/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 &quot;false&quot; if
+not present.
+
+The standard children of the managesieveserver tag are:
+
+=====================================================
 == File: server/apps/distributed-app/docs/modules/ROOT/pages/configure/index.adoc
 =====================================================
 = Distributed James Server &amp;mdash; Configuration
@@ -117791,6 +117845,7 @@
 *** xref:configure/smtp-hooks.adoc[This page] list SMTP hooks that can be used out of the box with the Distributed Server.
 ** xref:configure/webadmin.adoc[*webadmin.properties*] enables configuration for the WebAdmin protocol link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/webadmin.properties[example]
 ** xref:configure/ssl.adoc[This page] details SSL &amp; TLS configuration.
+** xref:configure/sieve.adoc[This page] details Sieve setup and how to enable ManageSieve.
 
 == For storage dependencies
 
@@ -117815,7 +117870,6 @@
 *** xref:configure/matchers.adoc[This page] list matchers that can be used out of the box with the Distributed Server.
 ** xref:configure/mailrepositorystore.adoc[*mailrepositorystore.xml*] enables registration of allowed MailRepository protcols and link them to MailRepository implementations link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/mailrepositorystore.xml[example]
 ** xref:configure/recipientrewritetable.adoc[*recipientrewritetable.xml*] enables advanced configuration for the Recipient Rewrite Table component link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/recipientrewritetable.xml[example]
-** xref:configure/usersrepository.adoc[*usersrepository.xml*] allows configuration of user storage link:https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/usersrepository.xml[example]
 
 =====================================================
 == File: server/apps/distributed-app/docs/modules/ROOT/pages/configure/cassandra.adoc
@@ -121375,6 +121429,7 @@
 **** xref:configure/pop3.adoc[pop3server.xml]
 **** xref:configure/webadmin.adoc[webadmin.properties]
 **** xref:configure/ssl.adoc[SSL &amp; TLS]
+**** xref:configure/sieve.adoc[Sieve &amp; ManageSieve]
 *** Storage dependencies
 **** xref:configure/blobstore.adoc[blobstore.properties]
 **** xref:configure/cassandra.adoc[cassandra.properties]
@@ -121401,7 +121456,6 @@
 **** xref:configure/collecting-contacts.adoc[Contact collection]
 **** xref:configure/collecting-events.adoc[Event collection]
 **** xref:configure/dsn.adoc[ESMTP DSN support]
-** xref:operate/index.adoc[Operate]
 
 =====================================================
 == File: server/apps/distributed-app/james-server-cassandra-rabbitmq-guice.iml
@@ -150030,11 +150084,12 @@
 
 import java.nio.charset.StandardCharsets
 
+import eu.timepit.refined.auto._
 import javax.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.{PushSubscriptionCreation, PushSubscriptionCreationId, PushSubscriptionCreationParseException, PushSubscriptionCreationResponse, PushSubscriptionSetRequest, SetError}
+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}
@@ -150051,7 +150106,7 @@
   case class CreationFailure(clientId: PushSubscriptionCreationId, e: Throwable) extends CreationResult {
     def asMessageSetError: SetError = e match {
       case e: PushSubscriptionCreationParseException =&gt; e.setError
-      case e: ExpireTimeInvalidException =&gt; SetError.invalidArguments(SetErrorDescription(e.getMessage))
+      case e: ExpireTimeInvalidException =&gt; SetError.invalidArguments(SetErrorDescription(e.getMessage), Some(Properties(&quot;expires&quot;)))
       case e: DeviceClientIdInvalidException =&gt; SetError.invalidArguments(SetErrorDescription(e.getMessage))
       case e: IllegalArgumentException =&gt; SetError.invalidArguments(SetErrorDescription(e.getMessage))
       case _ =&gt; SetError.serverFail(SetErrorDescription(e.getMessage))
@@ -150075,7 +150130,6 @@
         .filter(_.nonEmpty)
     }
   }
-}
 
 =====================================================
 == File: server/protocols/protocols-imap4/target/maven-archiver/pom.properties
diff --git a/content/server/config-sieve.html b/content/server/config-sieve.html
index 422c033..7a64e1b 100644
--- a/content/server/config-sieve.html
+++ b/content/server/config-sieve.html
@@ -303,10 +303,110 @@
  
 
   <section>
-<h2><a name="Sieve_Configuration"></a>Sieve Configuration</h2>
-  
-  </section>
+<h2><a name="Sieve"></a>Sieve</h2>
+      
+<p>James servers are able to evaluate and execute Sieve scripts.</p>
 
+      
+<p>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).</p>
+
+      
+<ul>The following Sieve capabilities are supported by Apache James:
+
+          
+<li><a class="externalLink" href="https://www.ietf.org/rfc/rfc2234.txt">RFC 2234 ABNF</a></li>
+          
+<li><a class="externalLink" href="https://www.ietf.org/rfc/rfc2244.txt">RFC 2244 ACAP</a></li>
+          
+<li><a class="externalLink" href="https://www.ietf.org/rfc/rfc2298.txt">RFC 2298 MDN</a></li>
+          
+<li><a class="externalLink" href="https://tools.ietf.org/html/rfc5228">RFC 5228 Sieve</a></li>
+          
+<li><a class="externalLink" href="https://tools.ietf.org/html/rfc4790">RFC 4790 IAPCR</a></li>
+          
+<li><a class="externalLink" href="https://tools.ietf.org/html/rfc5173">RFC 5173 Body Extension</a></li>
+          
+<li><a class="externalLink" href="https://datatracker.ietf.org/doc/html/rfc5230">RFC 5230 Vacations</a></li>
+      </ul>
+
+      
+<p>To be correctly executed, please note that the <b>Sieve</b> mailet is required to be positionned prior the
+          <b>LocalDelivery</b> mailet.</p>
+  </section>
+    <section>
+<h2><a name="Managing_Sieve_scripts"></a>Managing Sieve scripts</h2>
+        
+<p>A user willing to manage his Sieve scripts on the server can do so via several means:</p>
+
+        
+<p>He can ask an admin to upload his script via the <a href="manage-cli.html">CLI</a></p>
+
+        
+<p>As James supports ManageSieve (<a class="externalLink" href="https://datatracker.ietf.org/doc/html/rfc5804">RFC-5804</a>) a user
+        can thus use compatible software to manage his Sieve scripts.</p>
+    </section>
+    <section>
+<h2><a name="ManageSieve_protocol"></a>ManageSieve protocol</h2>
+        
+<p><b>WARNING</b>: ManageSieve protocol should be considered experimental.</p>
+        
+<p>
+            Consult <a class="externalLink" href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/managesieveserver.xml">managesieveserver.xml</a>
+            in GIT to get some examples and hints.
+        </p>
+
+        
+<p>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.</p>
+
+        
+<p>This tag has an optional boolean attribute - <b>enabled</b> - that defines whether the service is active or not.  The value defaults to &quot;false&quot; if
+            not present.</p>
+
+        
+<p>The standard children of the managesieveserver tag are:</p>
+
+        
+<dl>
+            
+<dt><b>bind</b></dt>
+            
+<dd>Configure this to bind to a specific inetaddress. This is an optional integer value.  This value is the port on which this ManageSieve 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 ManageSieve port:<br />
+                port 4190 is the well-known/IANA registered port for ManageSieve.</dd>
+            
+<dt><b>connectionBacklog</b></dt>
+            
+<dd>Number of connection backlog of the server (maximum number of queued connection requests)</dd>
+            
+<dt><b>tls</b></dt>
+            
+<dd>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<br />
+                Please note that each IMAP server exposed on different port can specify its own keystore, independently from any other
+                TLS based protocols.</dd>
+            
+<dt><b>handler.connectiontimeout</b></dt>
+            
+<dd>Connection timeout in secconds</dd>
+            
+<dt><b>handler.connectionLimit</b></dt>
+            
+<dd>Set the maximum simultaneous incoming connections for this service</dd>
+            
+<dt><b>handler.connectionLimitPerIP</b></dt>
+            
+<dd>Set the maximum simultaneous incoming connections per IP for this service</dd>
+        </dl>
+    </section>