Fix Mail Maildir paths and oCIS auth

Mail: INBOX is a subfolder (INBOX/cur), not the account root.
Removed special-case mapping that pointed INBOX to root dir.

Files: oCIS user may differ from MCP user (e.g. stefan -> admin).
Added _ocis_user() mapping for WebDAV paths and auth.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Stefan Lohmaier
2026-06-12 10:22:27 +02:00
parent 80fc323374
commit ef37d1e467
2 changed files with 11 additions and 6 deletions
+6 -2
View File
@@ -22,8 +22,12 @@ OCIS_CREDS = {u: (d['username'], d['password']) for u, d in _cfg['ocis_users'].i
mcp = FastMCP("Files", stateless_http=True,
transport_security={"enable_dns_rebinding_protection": False})
def _ocis_user(u):
c = OCIS_CREDS.get(u)
return c[0] if c else u
def _auth(u): c = OCIS_CREDS.get(u); return httpx.BasicAuth(c[0], c[1]) if c else None
def _dav(u, p=""): return f"{OCIS}/remote.php/dav/files/{u}/{p.lstrip('/')}"
def _dav(u, p=""): return f"{OCIS}/remote.php/dav/files/{_ocis_user(u)}/{p.lstrip('/')}"
def _propfind(user, path="", depth=1):
body = '<?xml version="1.0"?><d:propfind xmlns:d="DAV:"><d:prop><d:resourcetype/><d:displayname/><d:getcontentlength/><d:getlastmodified/><d:getcontenttype/></d:prop></d:propfind>'
@@ -35,7 +39,7 @@ def _parse_pf(xml, user):
entries = []
try: root = ET.fromstring(xml)
except: return entries
bp = f"/remote.php/dav/files/{user}/"
bp = f"/remote.php/dav/files/{_ocis_user(user)}/"
for resp in root.findall("d:response", ns):
href = resp.findtext("d:href", "", ns) or ""
rel = href.split(bp, 1)[-1].rstrip("/") if bp in href else href.rstrip("/")
+5 -4
View File
@@ -87,15 +87,16 @@ def _discover_folders(acct_path):
folders = []
for entry in sorted(Path(acct_path).rglob("cur")):
rel = str(entry.parent.relative_to(acct_path))
if rel == ".":
folders.insert(0, "INBOX")
elif rel not in folders:
if rel != "." and rel not in folders:
folders.append(rel)
if "INBOX" in folders:
folders.remove("INBOX")
folders.insert(0, "INBOX")
return folders
def _open_folder(acct_path, folder_name):
path = acct_path if folder_name == "INBOX" else os.path.join(acct_path, folder_name)
path = os.path.join(acct_path, folder_name)
return mailbox.Maildir(path, create=False) if os.path.isdir(path) else None