From 44429fa0d0c4f8c93991740a192715af365f4803 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Wed, 28 Oct 2026 15:29:55 +0100 Subject: [PATCH] [Web] App password and API adjustments --- data/web/inc/functions.app_passwd.inc.php | 9 +++++++++ data/web/inc/functions.auth.inc.php | 11 ++++++++--- data/web/json_api.php | 2 +- data/web/mobileconfig.php | 2 +- data/web/templates/user/tab-user-auth.twig | 2 ++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/data/web/inc/functions.app_passwd.inc.php b/data/web/inc/functions.app_passwd.inc.php index aacbb82df..085e22a8b 100644 --- a/data/web/inc/functions.app_passwd.inc.php +++ b/data/web/inc/functions.app_passwd.inc.php @@ -5,6 +5,15 @@ function app_passwd($_action, $_data = null) { $_data_log = $_data; !isset($_data_log['app_passwd']) ?: $_data_log['app_passwd'] = '*'; !isset($_data_log['app_passwd2']) ?: $_data_log['app_passwd2'] = '*'; + if (in_array($_action, array('add', 'edit', 'delete')) && + (!isset($_SESSION['acl']['app_passwds']) || $_SESSION['acl']['app_passwds'] != "1")) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_data_log), + 'msg' => 'access_denied' + ); + return false; + } if (isset($_data['username']) && filter_var($_data['username'], FILTER_VALIDATE_EMAIL)) { if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data['username'])) { $_SESSION['return'][] = array( diff --git a/data/web/inc/functions.auth.inc.php b/data/web/inc/functions.auth.inc.php index 87566af54..0899f1471 100644 --- a/data/web/inc/functions.auth.inc.php +++ b/data/web/inc/functions.auth.inc.php @@ -474,7 +474,7 @@ function apppass_login($user, $pass, $extra = null){ } // fetch app password data - $stmt = $pdo->prepare("SELECT `app_passwd`.*, `app_passwd`.`password` as `password`, `app_passwd`.`id` as `app_passwd_id` FROM `app_passwd` + $stmt = $pdo->prepare("SELECT `app_passwd`.*, `app_passwd`.`password` as `password`, `app_passwd`.`id` as `app_passwd_id`, `mailbox`.`attributes` as `mailbox_attributes` FROM `app_passwd` INNER JOIN `mailbox` ON `mailbox`.`username` = `app_passwd`.`mailbox` INNER JOIN `domain` ON `mailbox`.`domain` = `domain`.`domain` WHERE `mailbox`.`kind` NOT REGEXP 'location|thing|group' @@ -491,8 +491,13 @@ function apppass_login($user, $pass, $extra = null){ $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { - if ($extra['service'] != 'NONE' && $row[strtolower($extra['service']) . '_access'] != '1'){ - continue; + if ($extra['service'] != 'NONE') { + $key = strtolower($extra['service']) . '_access'; + // app passwords never grant a protocol the mailbox itself is denied + $mailbox_attributes = json_decode($row['mailbox_attributes'], true); + if ($row[$key] != '1' || (isset($mailbox_attributes[$key]) && $mailbox_attributes[$key] != '1')) { + continue; + } } // verify password diff --git a/data/web/json_api.php b/data/web/json_api.php index 3a6ad2659..104355b74 100644 --- a/data/web/json_api.php +++ b/data/web/json_api.php @@ -107,7 +107,7 @@ if (isset($_GET['query'])) { switch ($action) { case "add": - if ($_SESSION['mailcow_cc_api_access'] == 'ro' || isset($_SESSION['pending_mailcow_cc_username'])) { + if ($_SESSION['mailcow_cc_api_access'] == 'ro' || isset($_SESSION['pending_mailcow_cc_username']) || !isset($_SESSION["mailcow_cc_username"])) { http_response_code(403); echo json_encode(array( 'type' => 'error', diff --git a/data/web/mobileconfig.php b/data/web/mobileconfig.php index c57c48857..02e0e9a56 100644 --- a/data/web/mobileconfig.php +++ b/data/web/mobileconfig.php @@ -39,7 +39,7 @@ if (isset($_GET['only_email'])) { $onlyEmailAccount = false; $description = 'IMAP, CalDAV, CardDAV'; } -if (isset($_GET['app_password'])) { +if (isset($_GET['app_password']) && ($_SESSION['acl']['app_passwds'] ?? '0') == '1') { $app_password = true; $description .= ' with application password'; diff --git a/data/web/templates/user/tab-user-auth.twig b/data/web/templates/user/tab-user-auth.twig index 171545d6c..9e713713e 100644 --- a/data/web/templates/user/tab-user-auth.twig +++ b/data/web/templates/user/tab-user-auth.twig @@ -77,6 +77,7 @@ {% endif %} + {% if acl.app_passwds == 1 %}