summaryrefslogtreecommitdiff
path: root/mail/neomutt/files/indent-sidebar.patch
blob: d5a530a7d2168b40544a737c6c25db5a1d7c5c69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
From a7f602f120788bb8501cba46e9de6cf9de35a742 Mon Sep 17 00:00:00 2001
From: Richard Russon <rich@flatcap.org>
Date: Sun, 15 Mar 2020 17:12:58 +0000
Subject: [PATCH] fix sidebar indent

Take care when comparing "$folder" against an IMAP Mailbox path
(the `user@` may not be present on both sides).

Fixes: #2173
Fixes: #2175
---
 sidebar.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 56 insertions(+), 4 deletions(-)

diff --git a/sidebar.c b/sidebar.c
index 199fa7df0b..1f0943371a 100644
--- a/sidebar.c
+++ b/sidebar.c
@@ -36,6 +36,7 @@
 #include <string.h>
 #include "mutt/lib.h"
 #include "config/lib.h"
+#include "email/lib.h"
 #include "core/lib.h"
 #include "gui/lib.h"
 #include "sidebar.h"
@@ -833,6 +834,48 @@ static void fill_empty_space(struct MuttWindow *win, int first_row,
   }
 }
 
+/**
+ * imap_is_prefix - Check if folder matches the beginning of mbox
+ * @param folder Folder
+ * @param mbox   Mailbox path
+ * @param plen   Prefix length
+ * @retval true If folder is the prefix of mbox
+ */
+static bool imap_is_prefix(const char *folder, const char *mbox, size_t *plen)
+{
+  struct Url *url_m = url_parse(mbox);
+  struct Url *url_f = url_parse(folder);
+
+  if (!url_m || !url_f)
+    return false;
+
+  bool rc = false;
+
+  if (mutt_str_strcasecmp(url_m->host, url_f->host) != 0)
+    goto done;
+
+  if (url_m->user && url_f->user && (mutt_str_strcasecmp(url_m->user, url_f->user) != 0))
+    goto done;
+
+  size_t mlen = mutt_str_strlen(url_m->path);
+  size_t flen = mutt_str_strlen(url_f->path);
+  if (flen > mlen)
+    goto done;
+
+  if (mutt_str_strncmp(url_m->path, url_f->path, flen) != 0)
+    goto done;
+
+  if (url_m->user && !url_f->user)
+    *plen += mutt_str_strlen(url_m->user) + 1;
+  rc = true;
+
+done:
+  url_free(&url_m);
+  url_free(&url_f);
+
+  return rc;
+}
+
 /**
  * draw_sidebar - Write out a list of mailboxes, in a panel
  * @param win        Window to draw on
@@ -915,15 +958,24 @@ static void draw_sidebar(struct MuttWindow *win, int num_rows, int num_cols, int
     size_t maildirlen = mutt_str_strlen(C_Folder);
     if (maildirlen && C_SidebarDelimChars &&
         strchr(C_SidebarDelimChars, C_Folder[maildirlen - 1]))
+    {
       maildirlen--;
+    }
 
     /* check whether C_Folder is a prefix of the current folder's path */
     bool maildir_is_prefix = false;
-    if ((mutt_buffer_len(&m->pathbuf) > maildirlen) &&
-        (mutt_str_strncmp(C_Folder, mailbox_path(m), maildirlen) == 0) &&
-        C_SidebarDelimChars && strchr(C_SidebarDelimChars, mailbox_path(m)[maildirlen]))
+    if (m->magic == MUTT_IMAP)
     {
-      maildir_is_prefix = true;
+      maildir_is_prefix = imap_is_prefix(C_Folder, mailbox_path(m), &maildirlen);
+    }
+    else
+    {
+      if ((mutt_buffer_len(&m->pathbuf) > maildirlen) &&
+          (mutt_str_strncmp(C_Folder, mailbox_path(m), maildirlen) == 0) &&
+          C_SidebarDelimChars && strchr(C_SidebarDelimChars, mailbox_path(m)[maildirlen]))
+      {
+        maildir_is_prefix = true;
+      }
     }
 
     /* calculate depth of current folder and generate its display name with indented spaces */