<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>sanifair.xyz</title>
    <link>https://blog.sanifair.xyz/</link>
    <description>some Blog, about any</description>
    <pubDate>Tue, 14 Apr 2026 16:59:05 +0200</pubDate>
    <item>
      <title>Bitwarden, SSH-Keys and -Agent under MacOS</title>
      <link>https://blog.sanifair.xyz/bitwarden-ssh-keys-and-agent-under-macos</link>
      <description>&lt;![CDATA[along time i was looking for a #Passwordmanager how synchronize my Passwords, Pass- and SSH-Keys.&#xA;At the begin with #Bitwarden, i was lucky that he synchronized my Passwords. Later my Pass-Keys, too.&#xA;&#xA;But since 2025.1.2 #Bitwarden can Manage SSH-Keys and provide a SSH-Agent, too.!--more--&#xA;&#xA;On MacOS it is necessary, that you configure the SSH-Agent that have to be used.&#xA;Bitwarden provides the Information within a excellent Documentation.&#xA;&#xA;Long Story short, for the Store-Version of Bitwarden:&#xA;&#xA;Add the following Line to your .xxxrc or .xxxprofile -file to link to the Bitwarden-SSH-Agent and re-open your commandline.&#xA;&#xA;export SSHAUTHSOCK=~/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock&#xA;&#xA;After them, and the enabled Function in Bitwarden, you can use Bitwardens SSH-Agent with your synchronized Keys.]]&gt;</description>
      <content:encoded><![CDATA[<p>along time i was looking for a <a href="https://blog.sanifair.xyz/tag:Passwordmanager" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Passwordmanager</span></a> how synchronize my Passwords, Pass- and SSH-Keys.
At the begin with <a href="https://blog.sanifair.xyz/tag:Bitwarden" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Bitwarden</span></a>, i was lucky that he synchronized my Passwords. Later my Pass-Keys, too.</p>

<p>But since 2025.1.2 <a href="https://blog.sanifair.xyz/tag:Bitwarden" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Bitwarden</span></a> can Manage SSH-Keys and provide a SSH-Agent, too.</p>

<p>On MacOS it is necessary, that you configure the SSH-Agent that have to be used.
Bitwarden provides the Information within a excellent <a href="https://bitwarden.com/help/ssh-agent/#configure-bitwarden-ssh-agent" rel="nofollow">Documentation</a>.</p>

<p>Long Story short, for the Store-Version of Bitwarden:</p>

<p>Add the following Line to your .xxxrc or .xxxprofile -file to link to the Bitwarden-SSH-Agent and re-open your commandline.</p>

<pre><code class="language-bash">export SSH_AUTH_SOCK=~/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock
</code></pre>

<p>After them, and the enabled Function in Bitwarden, you can use Bitwardens SSH-Agent with your synchronized Keys.</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/bitwarden-ssh-keys-and-agent-under-macos</guid>
      <pubDate>Wed, 02 Jul 2025 18:13:19 +0200</pubDate>
    </item>
    <item>
      <title>Sieve Mailfilter - filter to folder</title>
      <link>https://blog.sanifair.xyz/sieve-mailfilter-filter-to-folder</link>
      <description>&lt;![CDATA[As allready wrote, #Sieve Mailfilter and how to have fun, today i show a sniped to filter Mails from whole Domains or single-Sender to a folder. !--more--&#xA;&#xA;split the TLD from E-Mail-Address&#xA;set Domain&#xA;if envelope :domain :matches &#34;from&#34; &#34;.&#34; {&#xA;  set :lower &#34;domain&#34; &#34;${1}-${2}&#34;;&#xA;}&#xA;With this Information we are able to the Domain for later use.&#xA;&#xA;split the localuser-Part and replace dots (.) by minus (-)&#xA;set from, replace . with -&#xA;if envelope :localpart :matches &#34;from&#34; &#34;..&#34; {&#xA;  set :lower &#34;localuser&#34; &#34;${1}-${2}-${3}&#34;;&#xA;}&#xA;elsif envelope :localpart :matches &#34;from&#34; &#34;.&#34; {&#xA;  set :lower &#34;localuser&#34; &#34;${1}-${2}&#34;;&#xA;}&#xA;elsif envelope :localpart :matches &#34;from&#34; &#34;&#34; {&#xA;  set :lower &#34;localuser&#34; &#34;${1}&#34;;&#xA;}&#xA;With this we have a localuser part&#xA;&#xA;at leased we try to find the right directory for the E-Mail to send in&#xA;domain in INBOX&#xA;if mailboxexists &#34;INBOX.${domain}&#34; {&#xA;  fileinto &#34;INBOX.${domain}&#34;;&#xA;  stop;&#xA;}&#xA;E-Mail in INBOX&#xA;if mailboxexists &#34;INBOX.${localuser}+${domain}&#34; {&#xA;  fileinto &#34;INBOX.${localuser}+${domain}&#34;;&#xA;  stop;&#xA;}&#xA;Notice: a Plus-Sign (+) will be used at At-Sign (@) in the folder-structure.&#xA;&#xA;In this example will all incoming mails sorted in Folder if there is a folder by Domain or fully sender Address in INBOX.&#xA;&#xA;Have fun ;)]]&gt;</description>
      <content:encoded><![CDATA[<p>As allready wrote, <a href="https://blog.sanifair.xyz/sieve-mailfiler-and-how-to-have-fun" rel="nofollow"><a href="https://blog.sanifair.xyz/tag:Sieve" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sieve</span></a> Mailfilter and how to have fun</a>, today i show a sniped to filter Mails from whole Domains or single-Sender to a folder. </p>
<ol><li><p>split the TLD from E-Mail-Address</p>

<pre><code>#set Domain
if envelope :domain :matches &#34;from&#34; &#34;*.*&#34; {
set :lower &#34;domain&#34; &#34;${1}-${2}&#34;;
}
</code></pre>

<p>With this Information we are able to the Domain for later use.</p></li>

<li><p>split the localuser-Part and replace dots (.) by minus (–)</p>

<pre><code>#set from, replace . with -
if envelope :localpart :matches &#34;from&#34; &#34;*.*.*&#34; {
set :lower &#34;localuser&#34; &#34;${1}-${2}-${3}&#34;;
}
elsif envelope :localpart :matches &#34;from&#34; &#34;*.*&#34; {
set :lower &#34;localuser&#34; &#34;${1}-${2}&#34;;
}
elsif envelope :localpart :matches &#34;from&#34; &#34;*&#34; {
set :lower &#34;localuser&#34; &#34;${1}&#34;;
}
</code></pre>

<p>With this we have a localuser part</p></li>

<li><p>at leased we try to find the right directory for the E-Mail to send in</p>

<pre><code># domain in INBOX
if mailboxexists &#34;INBOX.${domain}&#34; {
fileinto &#34;INBOX.${domain}&#34;;
stop;
}
# E-Mail in INBOX
if mailboxexists &#34;INBOX.${localuser}+${domain}&#34; {
fileinto &#34;INBOX.${localuser}+${domain}&#34;;
stop;
}
</code></pre>

<p>Notice: a Plus-Sign (+) will be used at At-Sign (@) in the folder-structure.</p></li></ol>

<p>In this example will all incoming mails sorted in Folder if there is a folder by Domain or fully sender Address in INBOX.</p>

<p>Have fun ;)</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/sieve-mailfilter-filter-to-folder</guid>
      <pubDate>Sun, 15 Dec 2024 18:38:49 +0100</pubDate>
    </item>
    <item>
      <title>Lockerer Kürbiskuchen von Julia Child’s Tante Helen, via Julia Moskin</title>
      <link>https://blog.sanifair.xyz/lockerer-kurbiskuchen-von-julia-childs-tante-helen-via-julia-moskin-1</link>
      <description>&lt;![CDATA[translated by Cpt.Sanifair!--more-- from [1]&#xA;&#xA;---&#xA;&#xA;Ofen, 230-190°C&#xA;ca 30min Arbeit&#xA;ca 60min Backzeit&#xA;&#xA;---&#xA;&#xA;Zutaten, für 1 - 2 Kuchen&#xA;&#xA;| Menge | Bezeichnung |&#xA;| :--- | :--- |&#xA;| 4 | große Eier |&#xA;| 2 | Kürbispüree 450ml (900ml) [2] |&#xA;| 200g | leicht brauner Zucker |&#xA;| 230g | Zucker |&#xA;|   | Salz ohne Zusätze |&#xA;| 3 EL |  Sirup |&#xA;| 3 EL | (optional) bourbon or dark rum |&#xA;|  3 TL |geriebener Zimt |&#xA;|  3 TL  |geriebener Ingwer|&#xA;|  1/4 TL | geriebenes Muskat|&#xA;|  1/4 TL |geriebene Nelken |&#xA;|  250g | Süße Sahne |&#xA;|  180ml  | Milch |&#xA;| 2x 23cm oderbr1x 30cm | Tortenschale (ungebacken) |&#xA;&#xA;---&#xA;&#xA;Den Ofen auf 230°C vorheizen, Eier trennen und bereit stellen&#xA;&#xA;Vermengen (im Mixer / Schüssel mit Rückgerät):&#xA;Zucker, 1 TL Salz, Rum (optional), Sirup, Zimt, Ingwer, Muskat, Nelken, Eigelb, Sahne, Milch bis ein cremiges Püree entstanden ist&#xA;&#xA;Das Eiweiß in einer Schale schaumig schlagen, 1 pr. Salz zugeben. Im weiteren in die Masse (2) unterheben.&#xA;&#xA;unverzüglich in die Tortenschalen füllen, im Ofen backen bis eine leicht goldene Kruste entsteht, da nach den Ofen auf 190°C reduzieren und 25-30 Minuten backen lassen. (Die Mitte kann leicht feucht bleiben, wenn die Kruste zu braun wird, dann mit Abdecken)&#xA;&#xA;Nach dem backen im Ofen 20-30 Minuten abkühlen lassen. &#xA;&#xA;Wird warm Serviert, oder gut eingepackt im Kühlschrank zwei Tage haltbar (bei Zimmertemperatur servieren).&#xA;&#xA;[1] https://food52.com/recipes/86591-julia-child-fluffy-pumpkin-pie-recipe/&#xA;[2] https://biancazapatka.com/de/kuerbispueree-3-arten-der-zubereitung/]]&gt;</description>
      <content:encoded><![CDATA[<p>translated by Cpt.Sanifair from [1]</p>

<hr>
<ul><li>Ofen, 230-190°C</li>
<li>ca 30min Arbeit</li>
<li>ca 60min Backzeit</li></ul>

<hr>

<h1 id="zutaten-für-1-2-kuchen" id="zutaten-für-1-2-kuchen">Zutaten, für 1 – 2 Kuchen</h1>

<table>
<thead>
<tr>
<th align="left">Menge</th>
<th align="left">Bezeichnung</th>
</tr>
</thead>

<tbody>
<tr>
<td align="left">4</td>
<td align="left">große Eier</td>
</tr>

<tr>
<td align="left">2</td>
<td align="left">Kürbispüree 450ml (900ml) [2]</td>
</tr>

<tr>
<td align="left">200g</td>
<td align="left">leicht brauner Zucker</td>
</tr>

<tr>
<td align="left">230g</td>
<td align="left">Zucker</td>
</tr>

<tr>
<td align="left"></td>
<td align="left">Salz ohne Zusätze</td>
</tr>

<tr>
<td align="left">3 EL</td>
<td align="left">Sirup</td>
</tr>

<tr>
<td align="left">3 EL</td>
<td align="left">(optional) bourbon or dark rum</td>
</tr>

<tr>
<td align="left">3 TL</td>
<td align="left">geriebener Zimt</td>
</tr>

<tr>
<td align="left">3 TL</td>
<td align="left">geriebener Ingwer</td>
</tr>

<tr>
<td align="left">¼ TL</td>
<td align="left">geriebenes Muskat</td>
</tr>

<tr>
<td align="left">¼ TL</td>
<td align="left">geriebene Nelken</td>
</tr>

<tr>
<td align="left">250g</td>
<td align="left">Süße Sahne</td>
</tr>

<tr>
<td align="left">180ml</td>
<td align="left">Milch</td>
</tr>

<tr>
<td align="left">2x 23cm oder<br>1x 30cm</td>
<td align="left">Tortenschale (ungebacken)</td>
</tr>
</tbody>
</table>

<hr>
<ol><li><p>Den Ofen auf 230°C vorheizen, Eier trennen und bereit stellen</p></li>

<li><p>Vermengen (im Mixer / Schüssel mit Rückgerät):
Zucker, 1 TL Salz, Rum (optional), Sirup, Zimt, Ingwer, Muskat, Nelken, Eigelb, Sahne, Milch bis ein cremiges Püree entstanden ist</p></li>

<li><p>Das Eiweiß in einer Schale schaumig schlagen, 1 pr. Salz zugeben. Im weiteren in die Masse (2) unterheben.</p></li>

<li><p>unverzüglich in die Tortenschalen füllen, im Ofen backen bis eine leicht goldene Kruste entsteht, da nach den Ofen auf 190°C reduzieren und 25-30 Minuten backen lassen. (Die Mitte kann leicht feucht bleiben, wenn die Kruste zu braun wird, dann mit Abdecken)</p></li>

<li><p>Nach dem backen im Ofen 20-30 Minuten abkühlen lassen.</p></li></ol>

<p>Wird warm Serviert, oder gut eingepackt im Kühlschrank zwei Tage haltbar (bei Zimmertemperatur servieren).</p>

<p>[1] <a href="https://food52.com/recipes/86591-julia-child-fluffy-pumpkin-pie-recipe/" rel="nofollow">https://food52.com/recipes/86591-julia-child-fluffy-pumpkin-pie-recipe/</a>
[2] <a href="https://biancazapatka.com/de/kuerbispueree-3-arten-der-zubereitung/" rel="nofollow">https://biancazapatka.com/de/kuerbispueree-3-arten-der-zubereitung/</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/lockerer-kurbiskuchen-von-julia-childs-tante-helen-via-julia-moskin-1</guid>
      <pubDate>Sun, 13 Oct 2024 19:42:47 +0200</pubDate>
    </item>
    <item>
      <title>Its implemented!11</title>
      <link>https://blog.sanifair.xyz/its-implemented-11</link>
      <description>&lt;![CDATA[In May i begun to work on a Project how i want to use #Crowdin for translations. And tried to display the translation progress as easy as fuck.&#xA;&#xA;Crowdin offers Badgets per Language, but they used !--more--an indexed #json #array. The #Badget jsonpath query select a specific, hardcoded index. In case the index change - you are fucked.&#xA;&#xA;So i invent a solution for a working jsonpath query and offered #Crowdin to implement it. And they did!&#xA;&#xA;old style&#xA;bevor the solution was implemented the query for languages looks like&#xA;$.progress.(n).data.translationProgress&#xA;$.progress.(n).data.approvalProgress&#xA;&#xA;new style&#xA;the new jsonpath query is&#xA;$.progress[?(@.data.languageId==%27%bs%27%)].data.translationProgress&#xA;$.progress[?(@.data.languageId==%27%bs%27%)].data.approvalProgress&#xA;&#xA;you need to notice, thats needed to escape the &#39; char as %27% to get it working.&#xA;&#xA;Hopefully you can enjoy the new &#34;feature&#34;!&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>In May i begun to work on a Project how i want to use <a href="https://blog.sanifair.xyz/tag:Crowdin" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Crowdin</span></a> for translations. And tried to display the translation progress as easy as fuck.</p>

<p>Crowdin offers Badgets per Language, but they used an indexed <a href="https://blog.sanifair.xyz/tag:json" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">json</span></a> <a href="https://blog.sanifair.xyz/tag:array" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">array</span></a>. The <a href="https://blog.sanifair.xyz/tag:Badget" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Badget</span></a> jsonpath query select a specific, hardcoded index. In case the index change – you are fucked.</p>

<p>So i invent a solution for a working jsonpath query and offered <a href="https://blog.sanifair.xyz/tag:Crowdin" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Crowdin</span></a> to implement it. And they did!</p>

<h3 id="old-style" id="old-style">old style</h3>

<p>bevor the solution was implemented the query for languages looks like</p>

<pre><code class="language-json">$.progress.(n).data.translationProgress
$.progress.(n).data.approvalProgress
</code></pre>

<h3 id="new-style" id="new-style">new style</h3>

<p>the new jsonpath query is</p>

<pre><code class="language-json">$.progress[?(@.data.languageId==%27%bs%27%)].data.translationProgress
$.progress[?(@.data.languageId==%27%bs%27%)].data.approvalProgress
</code></pre>

<p>you need to notice, thats needed to escape the &#39; char as %27% to get it working.</p>

<p>Hopefully you can enjoy the new “feature”!</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/its-implemented-11</guid>
      <pubDate>Thu, 22 Jun 2023 10:53:49 +0200</pubDate>
    </item>
    <item>
      <title>github action Repository basename</title>
      <link>https://blog.sanifair.xyz/github-action-repository-basename</link>
      <description>&lt;![CDATA[#Github #actions help you to #automate Processes (CI/CD).&#xA;&#xA;In my Example I need the #Basename of a #Repository. &#xA;!--more--&#xA;As you know, actions are saved in your Repository under the Path:&#xA;.github/workflows/workflow.yaml&#xA;&#xA;        #get Repository basename, use with ${{ env.REPONAME }}&#xA;      name: get Repository name&#xA;        run: |&#xA;          echo &#34;REPONAME=$(basename ${{ github.repository }})&#34;     $GITHUBENV&#xA;&#xA;        # echo target repository basename&#xA;      name: fetch translations&#xA;        run: &#xA;          echp ${{ env.REPONAME }}&#xA;&#xA;If found this working Solution on StackOverflow [1]&#xA;&#xA;[1] https://stackoverflow.com/a/71799882]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.sanifair.xyz/tag:Github" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Github</span></a> <a href="https://blog.sanifair.xyz/tag:actions" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">actions</span></a> help you to <a href="https://blog.sanifair.xyz/tag:automate" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">automate</span></a> Processes (CI/CD).</p>

<p>In my Example I need the <a href="https://blog.sanifair.xyz/tag:Basename" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Basename</span></a> of a <a href="https://blog.sanifair.xyz/tag:Repository" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Repository</span></a>.

As you know, actions are saved in your Repository under the Path:
<code>.github/workflows/workflow.yaml</code></p>

<pre><code class="language-yaml">        #get Repository basename, use with ${{ env.REPO_NAME }}
      - name: get Repository name
        run: |
          echo &#34;REPO_NAME=$(basename ${{ github.repository }})&#34; &gt;&gt; $GITHUB_ENV


        # echo target repository basename
      - name: fetch translations
        run: 
          echp ${{ env.REPO_NAME }}
</code></pre>

<p>If found this working Solution on StackOverflow [1]</p>

<p>[1] <a href="https://stackoverflow.com/a/71799882" rel="nofollow">https://stackoverflow.com/a/71799882</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/github-action-repository-basename</guid>
      <pubDate>Tue, 16 May 2023 03:23:11 +0200</pubDate>
    </item>
    <item>
      <title>github action commit to remote repository</title>
      <link>https://blog.sanifair.xyz/github-action-commit-to-remote-repository</link>
      <description>&lt;![CDATA[#Github #actions help you to #automate Processes (CI/CD).&#xA;&#xA;In my Example I tried to checkout source code, scan for Strings, append found Strings to a File and commit changes to separate repository.&#xA;!--more--&#xA;&#xA;As you know, actions are saved in your Repository under the Path:&#xA;.github/workflows/workflow.yaml&#xA;&#xA;steps:&#xA;        # check out source repository&#xA;      name: checkout source repository (this)&#xA;        uses: actions/checkout@v3&#xA;&#xA;        # check out target repository&#xA;      name: checkout target&#xA;        uses: actions/checkout@v3&#xA;        with: &#xA;          repository: example/target&#xA;          ssh-key: ${{ secrets.DEPLOY_SECRET }}&#xA;&#xA;        # do your thing...&#xA;      name: do things&#xA;        run: modify files in target...&#xA;&#xA;      # commit to target repository&#xA;      name: commit changes&#xA;        uses: stefanzweifel/git-auto-commit-action@v4&#xA;        with:&#xA;          repository: example/target&#xA;&#xA;Explanation:&#xA;-1. Checkout run with &#34;example/source&#34;&#xA;-2․ Checkout run with &#34;example/target&#34;&#xA;  used &#34;with&#34;:&#xA;    repository to Checkout a other Repo&#xA;    ssh-key for authentication (Deploy Key for target)&#xA;-3. commit Changes, if found &#xA;&#xA;Good luck! ]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.sanifair.xyz/tag:Github" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Github</span></a> <a href="https://blog.sanifair.xyz/tag:actions" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">actions</span></a> help you to <a href="https://blog.sanifair.xyz/tag:automate" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">automate</span></a> Processes (CI/CD).</p>

<p>In my Example I tried to checkout source code, scan for Strings, append found Strings to a File and commit changes to separate repository.
</p>

<p>As you know, actions are saved in your Repository under the Path:
<code>.github/workflows/workflow.yaml</code></p>

<pre><code class="language-yaml">steps:
        # check out source repository
      - name: checkout source repository (this)
        uses: actions/checkout@v3

        # check out target repository
      - name: checkout target
        uses: actions/checkout@v3
        with: 
          repository: example/target
          ssh-key: ${{ secrets.DEPLOY_SECRET }}

        # do your thing...
      - name: do things
        run: modify files in target...

      # commit to target repository
      - name: commit changes
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          repository: example/target
</code></pre>

<p>Explanation:
-1. Checkout run with “example/source”
-2․ Checkout run with “example/target”
  – used “with”:
    – repository to Checkout a other Repo
    – ssh-key for authentication (Deploy Key for target)
-3. commit Changes, if found</p>

<p>Good luck!</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/github-action-commit-to-remote-repository</guid>
      <pubDate>Mon, 15 May 2023 20:47:27 +0200</pubDate>
    </item>
    <item>
      <title>Sieve Mailfiler (and how to have fun)</title>
      <link>https://blog.sanifair.xyz/sieve-mailfiler-and-how-to-have-fun</link>
      <description>&lt;![CDATA[Sieve &#34;An Email Filtering Language&#34;, specified by RFC5228 [1].&#xA;&#xA;The Focus of #Sieve points to #simplicity, #independency and #expandability from access method or platform. Sieve-Scripts run already in the Process of #Mail delivery on #Server-Side. Sieve supports #Plugins, like #LDAP.&#xA;&#xA;!--more--&#xA;&#xA;Archiving Mails (like Mailinglists) by Date [2]:&#xA;require [&#34;variables&#34;,&#34;date&#34;,&#34;fileinto&#34;,&#34;mailbox&#34;];&#xA;&#xA;Extract date info&#xA;if currentdate :matches &#34;year&#34; &#34;&#34; { set &#34;year&#34; &#34;${1}&#34;; }&#xA;if currentdate :matches &#34;month&#34; &#34;&#34; { set &#34;month&#34; &#34;${1}&#34;; }&#xA;&#xA;Archive Dovecot mailing list items by year and month.&#xA;Create folder when it does not exist.&#xA;if header :is &#34;list-id&#34; &#34;dovecot.dovecot.org&#34; {&#xA;  fileinto :create &#34;INBOX.Lists.${year}.${month}.dovecot&#34;;&#xA;}&#xA;&#xA;Sort Mails by Sender&#xA;Mails from a mailing list will be put into the folder &#34;mailinglist&#34;&#xA;require &#34;copy&#34;;&#xA;require &#34;mailbox&#34;;&#xA;require &#34;imap4flags&#34;;&#xA;require &#34;fileinto&#34;;&#xA;if address :is [&#34;From&#34;, &#34;To&#34;] &#34;mailinglist@example.com&#34; {&#xA;  fileinto &#34;INBOX/mailinglist&#34;;&#xA;}&#xA;&#xA;And many, many, many more possibilitys for Mailbox-Filter 24.&#xA;&#xA;And there is a great Editor [6], too!&#xA;&#xA;Sieve Editor [6]&#xA;https://github.com/thsmi/sieve&#xA;&#xA;Sieve is a powerful scripting language for server-side mail filtering. It is intended to be used with IMAP which is ubiquitous. Many IMAP Servers are capable of running Sieve filters. Sieve stores and runs all scripts on the server-side.&#xA;&#xA;Now there is the dilemma – you have access to a server supporting Sieve but how do you manage your scripts on this server?&#xA;&#xA;You can use Telnet for this purpose, but that is far too uncomfortable, not applicable for a normal user and almost impossible with secure connections. Wouldn’t it be great to activate, edit, delete and add Sieve scripts with a convenient interface? That is exactly what this sieve editor offers…&#xA;&#xA;[1] https://www.rfc-editor.org/rfc/rfc5228&#xA;[2] https://doc.dovecot.org/configurationmanual/sieve/examples/#archiving-a-mailinglist-by-date&#xA;[3] https://en.wikipedia.org/wiki/Sieve(mailfilteringlanguage)&#xA;[4] https://p5r.uk/blog/2011/sieve-tutorial.html&#xA;[5] https://support.tigertech.net/sieve&#xA;[6] https://github.com/thsmi/sieve#sieve-editor]]&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://blog.sanifair.xyz/tag:Sieve" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sieve</span></a> “An Email Filtering Language”, specified by RFC5228 [1].</p>

<p>The Focus of <a href="https://blog.sanifair.xyz/tag:Sieve" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sieve</span></a> points to <a href="https://blog.sanifair.xyz/tag:simplicity" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">simplicity</span></a>, <a href="https://blog.sanifair.xyz/tag:independency" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">independency</span></a> and <a href="https://blog.sanifair.xyz/tag:expandability" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">expandability</span></a> from access method or platform. Sieve-Scripts run already in the Process of <a href="https://blog.sanifair.xyz/tag:Mail" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Mail</span></a> delivery on <a href="https://blog.sanifair.xyz/tag:Server" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Server</span></a>-Side. Sieve supports <a href="https://blog.sanifair.xyz/tag:Plugins" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Plugins</span></a>, like <a href="https://blog.sanifair.xyz/tag:LDAP" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">LDAP</span></a>.</p>



<h4 id="archiving-mails-like-mailinglists-by-date-2" id="archiving-mails-like-mailinglists-by-date-2">Archiving Mails (like Mailinglists) by Date [2]:</h4>

<pre><code class="language-sieve">require [&#34;variables&#34;,&#34;date&#34;,&#34;fileinto&#34;,&#34;mailbox&#34;];

# Extract date info
if currentdate :matches &#34;year&#34; &#34;*&#34; { set &#34;year&#34; &#34;${1}&#34;; }
if currentdate :matches &#34;month&#34; &#34;*&#34; { set &#34;month&#34; &#34;${1}&#34;; }

# Archive Dovecot mailing list items by year and month.
# Create folder when it does not exist.
if header :is &#34;list-id&#34; &#34;dovecot.dovecot.org&#34; {
  fileinto :create &#34;INBOX.Lists.${year}.${month}.dovecot&#34;;
}
</code></pre>

<h4 id="sort-mails-by-sender" id="sort-mails-by-sender">Sort Mails by Sender</h4>

<pre><code class="language-sieve"># Mails from a mailing list will be put into the folder &#34;mailinglist&#34;
require &#34;copy&#34;;
require &#34;mailbox&#34;;
require &#34;imap4flags&#34;;
require &#34;fileinto&#34;;
if address :is [&#34;From&#34;, &#34;To&#34;] &#34;mailinglist@example.com&#34; {
  fileinto &#34;INBOX/mailinglist&#34;;
}
</code></pre>

<p>And many, many, many more possibilitys for Mailbox-Filter [2][3][4][5].</p>

<p>And there is a great Editor [6], too!</p>

<h4 id="sieve-editor-6" id="sieve-editor-6">Sieve Editor [6]</h4>

<p><a href="https://github.com/thsmi/sieve" rel="nofollow">https://github.com/thsmi/sieve</a></p>

<pre><code>Sieve is a powerful scripting language for server-side mail filtering. It is intended to be used with IMAP which is ubiquitous. Many IMAP Servers are capable of running Sieve filters. Sieve stores and runs all scripts on the server-side.

Now there is the dilemma – you have access to a server supporting Sieve but how do you manage your scripts on this server?

You can use Telnet for this purpose, but that is far too uncomfortable, not applicable for a normal user and almost impossible with secure connections. Wouldn’t it be great to activate, edit, delete and add Sieve scripts with a convenient interface? That is exactly what this sieve editor offers…
</code></pre>

<p>[1] <a href="https://www.rfc-editor.org/rfc/rfc5228" rel="nofollow">https://www.rfc-editor.org/rfc/rfc5228</a>
[2] <a href="https://doc.dovecot.org/configuration_manual/sieve/examples/#archiving-a-mailinglist-by-date" rel="nofollow">https://doc.dovecot.org/configuration_manual/sieve/examples/#archiving-a-mailinglist-by-date</a>
[3] <a href="https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language" rel="nofollow">https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language</a>)
[4] <a href="https://p5r.uk/blog/2011/sieve-tutorial.html" rel="nofollow">https://p5r.uk/blog/2011/sieve-tutorial.html</a>
[5] <a href="https://support.tigertech.net/sieve" rel="nofollow">https://support.tigertech.net/sieve</a>
[6] <a href="https://github.com/thsmi/sieve#sieve-editor" rel="nofollow">https://github.com/thsmi/sieve#sieve-editor</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/sieve-mailfiler-and-how-to-have-fun</guid>
      <pubDate>Thu, 11 May 2023 10:33:35 +0200</pubDate>
    </item>
    <item>
      <title>Filezilla &#34;portable&#34; </title>
      <link>https://blog.sanifair.xyz/filezilla-portable</link>
      <description>&lt;![CDATA[or #howto use #filezilla without any installation.&#xA;!--more--&#xA;&#xA;Download the latest #FileZilla Version (non-installer) &#xA;copy ./docs/fzdefaults.xml.example to ./fzdefaults.xml&#xA;set &#34;Config Location&#34; to &#34;./&#34;&#xA;&#xA;FileZilla3&#xA;  Settings&#xA;    Setting name=&#34;Config Location&#34;.//Setting&#xA;  /Settings&#xA;/FileZilla3&#xA;&#xA;and you are ready to go with #FileZilla&#xA;&#xA; https://filezilla-project.org/download.php?show_all=1]]&gt;</description>
      <content:encoded><![CDATA[<p>or <a href="https://blog.sanifair.xyz/tag:howto" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">howto</span></a> use <a href="https://blog.sanifair.xyz/tag:filezilla" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">filezilla</span></a> without any installation.
</p>
<ol><li>Download the latest <a href="https://blog.sanifair.xyz/tag:FileZilla" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">FileZilla</span></a> Version (non-installer) [^1]</li>
<li>copy ./docs/fzdefaults.xml.example to ./fzdefaults.xml</li>
<li>set “Config Location” to “./”</li></ol>

<pre><code class="language-xml">&lt;FileZilla3&gt;
  &lt;Settings&gt;
    &lt;Setting name=&#34;Config Location&#34;&gt;./&lt;/Setting&gt;
  &lt;/Settings&gt;
&lt;/FileZilla3&gt;
</code></pre>

<p>and you are ready to go with <a href="https://blog.sanifair.xyz/tag:FileZilla" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">FileZilla</span></a></p>

<p>[^1] <a href="https://filezilla-project.org/download.php?show_all=1" rel="nofollow">https://filezilla-project.org/download.php?show_all=1</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/filezilla-portable</guid>
      <pubDate>Wed, 05 Apr 2023 18:17:12 +0200</pubDate>
    </item>
    <item>
      <title>Update a Docker-Image on Synologys DSM</title>
      <link>https://blog.sanifair.xyz/update-a-docker-image-on-synologys-dsm</link>
      <description>&lt;![CDATA[In just a few steps to an actuall Image.&#xA;&#xA;!--more--&#xA;&#xA;open Docker on your DSM and go to your Registrie&#xA;search your Image and Download the latest Version&#xA;switch to your Container Overview, stop and reset your Container&#xA;Run the Container again&#xA;&#xA;Docker on DSM will now use the (newer) downloaded Image.&#xA;&#xA;Good Luck!&#xA;&#xA; https://mariushosting.com/synology-how-to-update-docker-image/&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>In just a few steps to an actuall Image.</p>


<ol><li>open Docker on your DSM and go to your Registrie</li>
<li>search your Image and Download the latest Version</li>
<li>switch to your Container Overview, stop and reset your Container</li>
<li>Run the Container again</li></ol>

<p>Docker on DSM will now use the (newer) downloaded Image.</p>

<p>Good Luck!</p>

<p>[^1] <a href="https://mariushosting.com/synology-how-to-update-docker-image/" rel="nofollow">https://mariushosting.com/synology-how-to-update-docker-image/</a></p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/update-a-docker-image-on-synologys-dsm</guid>
      <pubDate>Tue, 21 Mar 2023 19:19:19 +0100</pubDate>
    </item>
    <item>
      <title>termsrv.dll Patch</title>
      <link>https://blog.sanifair.xyz/termsrv-dll-patch</link>
      <description>&lt;![CDATA[This is a Guide how to activate multiple User-Logons over Remote Desktop Protokoll (RDP) for Windows Terminal Service.&#xA;!--more--&#xA;&#xA;Steps:&#xA;Prepare&#xA;Backup&#xA;Stop Terminal Service&#xA;Ownership and Rights&#xA;Patch&#xA;Revert Ownership and Rights&#xA;Start Terminal Service&#xA;When you fail&#xA;&#xA;no Backup?&#xA;\&#xA;Prepare&#xA;&#xA;you need:&#xA;Your OS Version (Windows10 x64 Professional)&#xA;%windir%\System32\termsrv.dll - Version&#xA;  -  Settings -  Details -  Version (10.0.19041.2673)&#xA;Hex-Editor (may be HxD  or imhex )&#xA;Hex-Replacements (for your specific termsrv.dll Version)&#xA;  Search   39 81 3C 06 00 00 0F 84 85 45 01 00&#xA;  Replace B8 00 01 00 00 89 81 38 06 00 00 90&#xA;  Offset    1E6A5&#xA;CMD with Admin-Rights&#xA;&#xA; https://mh-nexus.de/en/hxd/&#xA; https://github.com/WerWolv/ImHex&#xA;\&#xA;Backup&#xA;Befor you begin, make a backup.&#xA;  xcopy %windir%\System32\termsrv.dll %windir%\System32\termsrv.dll.backup /V /H /K /X /O /Y&#xA;  /V: Verifies each file as it is written to the destination&#xA;/H: Copies files with hidden and system file attributes&#xA;/K: Copies files and retains the read-only attribute if present on the source&#xA;/X: Copies file audit settings and SACL information (implies /o)&#xA;/O: Copies file ownership and DACL information&#xA;/Y: Suppresses prompting to confirm that you want to overwrite existing files&#xA;copying as a file &#xA;more About xcopy on microsoft.com&#xA;&#xA; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy&#xA; https://ss64.com/nt/xcopy.html&#xA;\&#xA;stop Terminal Service&#xA;first try to stop Terminal Service normal (net stop xxx), sometimes you need to kill Terminal Service&#xA;  net stop termservice&#xA;(yes/no)?: yes&#xA;failed to stop Remote Desktop Service&#xA;if normal stop fail, kill the service &#xA;  tasklist /svc | findstr /C:TermService&#xA;svchost.exe                   1664 TermService&#xA;&#xA;  taskkill /F /PID 1664&#xA;Process killed&#xA;&#xA;  net stop termservice&#xA; https://www.windows-commandline.com/start-terminal-services-command-line/&#xA;\&#xA;Ownership and Rights&#xA;we need to change the file-owner to Administrator-Group and grant Full Rights to this Group&#xA;  takeown /F %windir%\System32\termsrv.dll /A&#xA;  icacls %windir%\System32\termsrv.dll /grant Username:F&#xA;  takeown&#xA;/F: Specifies the file name or directory name pattern&#xA;/A: Gives ownership to the Administrators group instead of the current user&#xA;more About takeown on microsoft.com&#xA;&#xA;  icacls&#xA;/grant Grants specified user access rights, Permissions replace previously granted explicit permissions.&#xA;more About takeown on microsoft.com&#xA;&#xA; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/takeown&#xA; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/icacls&#xA;\&#xA;Patch&#xA;open termsrv.dll in your Hex-Editor with Admin-Rights and use Search and Replace for Hex&#xA;&#xA;Search   39 81 3C 06 00 00 0F 84 85 45 01 00&#xA;Replace B8 00 01 00 00 89 81 38 06 00 00 90&#xA;(Offset   1E6A5, where the Replacement should be found on)&#xA;&#xA;Save the file.&#xA;\&#xA;Revert Ownership and Rights&#xA;You should set the Admin-Group permission back to RX (Read - eXecute)&#xA; icacls %windir%\System32\termsrv.dll /grant Username:RX&#xA;and after them set the Owner back, too.&#xA;&#xA;Open the File-Settings -  (Tab) Security -  (Button) Advanced -  Owner (Link) Change&#xA;&#xA;The new and old Owner is &#34;NT Service\TrustedInstaller&#34;, confirm with ok and close the Dialog-Windows.&#xA;\&#xA;Start Terminal Service&#xA;if you did right and make no mistakes you can run Terminal Service again, with:&#xA;net start termservice&#xA;\&#xA;First connect&#xA;Connect to 127.0.0.2 instead of localhost or any else to reach your PC on loopback-Interface.&#xA;\&#xA;When you fail&#xA;boot in secure mode, delete the termsrv.dll and use the Backup instead.&#xA;&#xA;\&#xA;No Backup&#xA;No Mercy! &#xA;&#xA;Good Luck, Survivor!]]&gt;</description>
      <content:encoded><![CDATA[<p>This is a Guide how to activate multiple User-Logons over Remote Desktop Protokoll (RDP) for Windows Terminal Service.
</p>

<h1 id="steps" id="steps">Steps:</h1>
<ol><li><a href="#prepare" rel="nofollow">Prepare</a></li>
<li><a href="#backup" rel="nofollow">Backup</a></li>
<li><a href="#stop-terminal-service" rel="nofollow">Stop Terminal Service</a></li>
<li><a href="#ownership-and-rights" rel="nofollow">Ownership and Rights</a></li>
<li><a href="#patch" rel="nofollow">Patch</a></li>
<li><a href="#revert-ownership-and-rights" rel="nofollow">Revert Ownership and Rights</a></li>
<li><a href="#start-terminal-service" rel="nofollow">Start Terminal Service</a></li>
<li><a href="#when-you-fail" rel="nofollow">When you fail</a></li></ol>

<p><a href="#no-backup" rel="nofollow">no Backup?</a>
</p>

<h1 id="prepare" id="prepare">Prepare</h1>

<h3 id="you-need" id="you-need">you need:</h3>
<ul><li>Your OS Version (Windows10 x64 Professional)</li>
<li>%windir%\System32\termsrv.dll – Version
–&gt; Settings –&gt; Details –&gt; Version (10.0.19041.2673)</li>
<li>Hex-Editor (may be HxD [^1] or imhex [^2])</li>
<li>Hex-Replacements (for your specific termsrv.dll Version)
<ul><li>Search   39 81 3C 06 00 00 0F 84 85 45 01 00</li>
<li>Replace B8 00 01 00 00 89 81 38 06 00 00 90</li>
<li>Offset    1E6A5</li></ul></li>
<li>CMD with Admin-Rights</li></ul>

<p>[^1] <a href="https://mh-nexus.de/en/hxd/" rel="nofollow">https://mh-nexus.de/en/hxd/</a>
[^2] <a href="https://github.com/WerWolv/ImHex" rel="nofollow">https://github.com/WerWolv/ImHex</a>
</p>

<h1 id="backup" id="backup">Backup</h1>

<p>Befor you begin, make a backup.</p>

<pre><code class="language-CMD">&gt; xcopy %windir%\System32\termsrv.dll %windir%\System32\termsrv.dll.backup /V /H /K /X /O /Y
</code></pre>

<blockquote><p>/V: Verifies each file as it is written to the destination
/H: Copies files with hidden and system file attributes
/K: Copies files and retains the read-only attribute if present on the source
/X: Copies file audit settings and SACL information (implies /o)
/O: Copies file ownership and DACL information
/Y: Suppresses prompting to confirm that you want to overwrite existing files
* copying as a file [^2]
more About xcopy on microsoft.com[^1]</p></blockquote>

<p>[^1] <a href="https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy" rel="nofollow">https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy</a>
[^2] <a href="https://ss64.com/nt/xcopy.html" rel="nofollow">https://ss64.com/nt/xcopy.html</a>
</p>

<h1 id="stop-terminal-service" id="stop-terminal-service">stop Terminal Service</h1>

<p>first try to stop Terminal Service normal (net stop xxx), sometimes you need to kill Terminal Service</p>

<pre><code class="language-CMD">&gt; net stop termservice
(yes/no)?: yes
failed to stop Remote Desktop Service
</code></pre>

<p>if normal stop fail, kill the service [^1]</p>

<pre><code class="language-CMD">&gt;tasklist /svc | findstr /C:TermService
svchost.exe                   1664 TermService

&gt; taskkill /F /PID 1664
Process killed

&gt; net stop termservice
</code></pre>

<p>[^1] <a href="https://www.windows-commandline.com/start-terminal-services-command-line/" rel="nofollow">https://www.windows-commandline.com/start-terminal-services-command-line/</a>
</p>

<h1 id="ownership-and-rights" id="ownership-and-rights">Ownership and Rights</h1>

<p>we need to change the file-owner to Administrator-Group and grant Full Rights to this Group</p>

<pre><code class="language-cmd">&gt; takeown /F %windir%\System32\termsrv.dll /A
&gt; icacls %windir%\System32\termsrv.dll /grant &lt;Username&gt;:F
</code></pre>

<blockquote><p>takeown
/F: Specifies the file name or directory name pattern
/A: Gives ownership to the Administrators group instead of the current user
more About takeown on microsoft.com[^1]</p>

<p>icacls
/grant Grants specified user access rights, Permissions replace previously granted explicit permissions.
more About takeown on microsoft.com[^2]</p></blockquote>

<p>[^1] <a href="https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/takeown" rel="nofollow">https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/takeown</a>
[^2] <a href="https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/icacls" rel="nofollow">https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/icacls</a>
</p>

<h1 id="patch" id="patch">Patch</h1>

<p>open termsrv.dll in your Hex-Editor with Admin-Rights and use Search and Replace for Hex</p>

<p>Search   <code>39 81 3C 06 00 00 0F 84 85 45 01 00</code>
Replace <code>B8 00 01 00 00 89 81 38 06 00 00 90</code>
(Offset   <code>1E6A5</code>, where the Replacement should be found on)</p>

<p>Save the file.
</p>

<h1 id="revert-ownership-and-rights" id="revert-ownership-and-rights">Revert Ownership and Rights</h1>

<p>You should set the Admin-Group permission back to RX (Read – eXecute)</p>

<pre><code class="language-CMD"> icacls %windir%\System32\termsrv.dll /grant &lt;Username&gt;:RX
</code></pre>

<p>and after them set the Owner back, too.</p>

<p>Open the File-Settings –&gt; (Tab) Security –&gt; (Button) Advanced –&gt; Owner (Link) Change</p>

<p>The new and old Owner is “NT Service\TrustedInstaller”, confirm with ok and close the Dialog-Windows.
</p>

<h1 id="start-terminal-service" id="start-terminal-service">Start Terminal Service</h1>

<p>if you did right and make no mistakes you can run Terminal Service again, with:</p>

<pre><code class="language-cmd">net start termservice
</code></pre>

<p></p>

<h1 id="first-connect" id="first-connect">First connect</h1>

<p>Connect to 127.0.0.2 instead of localhost or any else to reach your PC on loopback-Interface.
</p>

<h1 id="when-you-fail" id="when-you-fail">When you fail</h1>

<p>boot in secure mode, delete the termsrv.dll and use the Backup instead.</p>

<p></p>

<h1 id="no-backup" id="no-backup">No Backup</h1>

<p>No Mercy!</p>

<p>Good Luck, Survivor!</p>
]]></content:encoded>
      <guid>https://blog.sanifair.xyz/termsrv-dll-patch</guid>
      <pubDate>Sun, 19 Mar 2023 20:00:32 +0100</pubDate>
    </item>
  </channel>
</rss>