Page MenuHomePhorge

D4944.id14171.diff
No OneTemporary

D4944.id14171.diff

diff --git a/src/app/DataMigrator/Account.php b/src/app/DataMigrator/Account.php
--- a/src/app/DataMigrator/Account.php
+++ b/src/app/DataMigrator/Account.php
@@ -42,7 +42,7 @@
* Object constructor
*
* Input can be a valid URI or "<username>:<password>".
- * For proxy authentication use: "<proxy-user>**<username>" as username.
+ * For user impersonation use: ?user=<user> in the query part of the URI.
*
* @param string $input Account specification (URI)
*/
@@ -61,10 +61,6 @@
if (isset($url['user'])) {
$this->username = urldecode($url['user']);
-
- if (strpos($this->username, '**')) {
- list($this->username, $this->loginas) = explode('**', $this->username, 2);
- }
}
if (isset($url['pass'])) {
@@ -90,6 +86,10 @@
parse_str($url['query'], $this->params);
}
+ if (!empty($this->params['user'])) {
+ $this->loginas = $this->params['user'];
+ }
+
if (strpos($this->loginas, '@')) {
$this->email = $this->loginas;
} elseif (strpos($this->username, '@')) {
diff --git a/src/app/DataMigrator/IMAP.php b/src/app/DataMigrator/IMAP.php
--- a/src/app/DataMigrator/IMAP.php
+++ b/src/app/DataMigrator/IMAP.php
@@ -35,7 +35,7 @@
$this->engine = $engine;
// TODO: Move this to self::authenticate()?
- $config = self::getConfig($account->username, $account->password, $account->uri);
+ $config = self::getConfig($account);
$this->imap = self::initIMAP($config);
}
@@ -351,7 +351,7 @@
/**
* Initialize IMAP connection and authenticate the user
*/
- private static function initIMAP(array $config, string $login_as = null): \rcube_imap_generic
+ private static function initIMAP(array $config): \rcube_imap_generic
{
$imap = new \rcube_imap_generic();
@@ -359,13 +359,6 @@
$imap->setDebug(true, 'App\Backends\IMAP::logDebug');
}
- if ($login_as) {
- $config['options']['auth_cid'] = $config['user'];
- $config['options']['auth_pw'] = $config['password'];
- $config['options']['auth_type'] = 'PLAIN';
- $config['user'] = $login_as;
- }
-
$imap->connect($config['host'], $config['user'], $config['password'], $config['options']);
if (!$imap->connected()) {
@@ -382,9 +375,9 @@
/**
* Get IMAP configuration
*/
- private static function getConfig($user, $password, $uri): array
+ private static function getConfig(Account $account): array
{
- $uri = \parse_url($uri);
+ $uri = \parse_url($account->uri);
$default_port = 143;
$ssl_mode = null;
@@ -399,8 +392,8 @@
$config = [
'host' => $uri['host'],
- 'user' => $user,
- 'password' => $password,
+ 'user' => $account->username,
+ 'password' => $account->password,
'options' => [
'port' => !empty($uri['port']) ? $uri['port'] : $default_port,
'ssl_mode' => $ssl_mode,
@@ -417,6 +410,14 @@
],
];
+ // User impersonation. Example URI: imap://admin:password@hostname:143?user=user%40domain.tld
+ if ($account->loginas) {
+ $config['options']['auth_cid'] = $config['user'];
+ $config['options']['auth_pw'] = $config['password'];
+ $config['options']['auth_type'] = 'PLAIN';
+ $config['user'] = $account->loginas;
+ }
+
return $config;
}
diff --git a/src/tests/BackendsTrait.php b/src/tests/BackendsTrait.php
--- a/src/tests/BackendsTrait.php
+++ b/src/tests/BackendsTrait.php
@@ -233,9 +233,10 @@
'password' => $account->password,
];
+ $login_as = $account->params['user'] ?? null;
$config = array_merge($getConfig->invoke(null), $config);
- $this->clients[$clientId] = $initIMAP->invokeArgs(null, [$config]);
+ $this->clients[$clientId] = $initIMAP->invokeArgs(null, [$config, $login_as]);
}
return $this->clients[$clientId];
diff --git a/src/tests/Feature/DataMigrator/IMAPTest.php b/src/tests/Feature/DataMigrator/IMAPTest.php
--- a/src/tests/Feature/DataMigrator/IMAPTest.php
+++ b/src/tests/Feature/DataMigrator/IMAPTest.php
@@ -109,8 +109,11 @@
$uri = 'imap://' . $uri;
}
- $src = new Account(str_replace('://', '://john%40kolab.org:simple123@', $uri));
- $dst = new Account(str_replace('://', '://jack%40kolab.org:simple123@', $uri));
+ // Let's test with impersonation now
+ $adminUser = \config('services.imap.admin_login');
+ $adminPass = \config('services.imap.admin_password');
+ $src = new Account(str_replace('://', "://$adminUser:$adminPass@", $uri) . '?user=john%40kolab.org');
+ $dst = new Account(str_replace('://', "://$adminUser:$adminPass@", $uri) . '?user=jack%40kolab.org');
// Add some mails to the source account
$srcMessages = $this->imapList($src, 'INBOX');

File Metadata

Mime Type
text/plain
Expires
Thu, Oct 31, 10:07 AM (19 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
10076382
Default Alt Text
D4944.id14171.diff (5 KB)

Event Timeline