1
0
Fork 0
mirror of https://github.com/Kozea/Radicale.git synced 2025-06-26 16:45:52 +00:00

Added urldecode_username option to decode the username when sent by the client. This solved problems when authenticating against an imap server from the iOS calendar.

This commit is contained in:
Juan F Arjona 2025-05-02 18:02:43 -04:00
parent b036439332
commit d22d74320a
2 changed files with 10 additions and 0 deletions

View file

@ -37,6 +37,7 @@ from typing import List, Sequence, Set, Tuple, Union, final
from radicale import config, types, utils from radicale import config, types, utils
from radicale.log import logger from radicale.log import logger
from urllib.parse import unquote
INTERNAL_TYPES: Sequence[str] = ("none", "remote_user", "http_x_remote_user", INTERNAL_TYPES: Sequence[str] = ("none", "remote_user", "http_x_remote_user",
"denyall", "denyall",
@ -93,6 +94,7 @@ def load(configuration: "config.Configuration") -> "BaseAuth":
class BaseAuth: class BaseAuth:
_ldap_groups: Set[str] = set([]) _ldap_groups: Set[str] = set([])
_urldecode_username: bool
_lc_username: bool _lc_username: bool
_uc_username: bool _uc_username: bool
_strip_domain: bool _strip_domain: bool
@ -119,9 +121,11 @@ class BaseAuth:
self._lc_username = configuration.get("auth", "lc_username") self._lc_username = configuration.get("auth", "lc_username")
self._uc_username = configuration.get("auth", "uc_username") self._uc_username = configuration.get("auth", "uc_username")
self._strip_domain = configuration.get("auth", "strip_domain") self._strip_domain = configuration.get("auth", "strip_domain")
self._urldecode_username = configuration.get("auth", "urldecode_username")
logger.info("auth.strip_domain: %s", self._strip_domain) logger.info("auth.strip_domain: %s", self._strip_domain)
logger.info("auth.lc_username: %s", self._lc_username) logger.info("auth.lc_username: %s", self._lc_username)
logger.info("auth.uc_username: %s", self._uc_username) logger.info("auth.uc_username: %s", self._uc_username)
logger.info("auth.urldecode_username: %s", self._urldecode_username)
if self._lc_username is True and self._uc_username is True: if self._lc_username is True and self._uc_username is True:
raise RuntimeError("auth.lc_username and auth.uc_username cannot be enabled together") raise RuntimeError("auth.lc_username and auth.uc_username cannot be enabled together")
self._auth_delay = configuration.get("auth", "delay") self._auth_delay = configuration.get("auth", "delay")
@ -219,6 +223,8 @@ class BaseAuth:
login = login.lower() login = login.lower()
if self._uc_username: if self._uc_username:
login = login.upper() login = login.upper()
if self._urldecode_username:
login = unquote(login)
if self._strip_domain: if self._strip_domain:
login = login.split('@')[0] login = login.split('@')[0]
if self._cache_logins is True: if self._cache_logins is True:

View file

@ -342,6 +342,10 @@ DEFAULT_CONFIG_SCHEMA: types.CONFIG_SCHEMA = OrderedDict([
("lc_username", { ("lc_username", {
"value": "False", "value": "False",
"help": "convert username to lowercase, must be true for case-insensitive auth providers", "help": "convert username to lowercase, must be true for case-insensitive auth providers",
"type": bool}),
("urldecode_username", {
"value": "False",
"help": "url-decode the username, set to True when clients send url-encoded email address as username",
"type": bool})])), "type": bool})])),
("rights", OrderedDict([ ("rights", OrderedDict([
("type", { ("type", {