feat(request): Allow to match the client version with the IRequest::USER_AGENT_* regex

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2023-05-31 17:02:36 +02:00
parent de3b6a2219
commit 2c6f32cb28
No known key found for this signature in database
GPG Key ID: 74434EFE0D2E2205
2 changed files with 73 additions and 8 deletions

View File

@ -64,43 +64,51 @@ namespace OCP;
interface IRequest {
/**
* @since 9.1.0
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_CLIENT_ANDROID = '/^Mozilla\/5\.0 \(Android\) (ownCloud|Nextcloud)\-android.*$/';
public const USER_AGENT_CLIENT_ANDROID = '/^Mozilla\/5\.0 \(Android\) (?:ownCloud|Nextcloud)\-android\/([^ ]*).*$/';
/**
* @since 13.0.0
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_TALK_ANDROID = '/^Mozilla\/5\.0 \(Android\) Nextcloud\-Talk v.*$/';
public const USER_AGENT_TALK_ANDROID = '/^Mozilla\/5\.0 \(Android\) Nextcloud\-Talk v([^ ]*).*$/';
/**
* @since 9.1.0
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_CLIENT_DESKTOP = '/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/';
public const USER_AGENT_CLIENT_DESKTOP = '/^Mozilla\/5\.0 \([A-Za-z ]+\) (?:mirall|csyncoC)\/([^ ]*).*$/';
/**
* @since 26.0.0
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_TALK_DESKTOP = '/^Mozilla\/5\.0 \((?!Android|iOS)[A-Za-z ]+\) Nextcloud\-Talk v.*$/';
public const USER_AGENT_TALK_DESKTOP = '/^Mozilla\/5\.0 \((?!Android|iOS)[A-Za-z ]+\) Nextcloud\-Talk v([^ ]*).*$/';
/**
* @since 9.1.0
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_CLIENT_IOS = '/^Mozilla\/5\.0 \(iOS\) (ownCloud|Nextcloud)\-iOS.*$/';
public const USER_AGENT_CLIENT_IOS = '/^Mozilla\/5\.0 \(iOS\) (?:ownCloud|Nextcloud)\-iOS\/([^ ]*).*$/';
/**
* @since 13.0.0
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_TALK_IOS = '/^Mozilla\/5\.0 \(iOS\) Nextcloud\-Talk v.*$/';
public const USER_AGENT_TALK_IOS = '/^Mozilla\/5\.0 \(iOS\) Nextcloud\-Talk v([^ ]*).*$/';
/**
* @since 13.0.1
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_OUTLOOK_ADDON = '/^Mozilla\/5\.0 \([A-Za-z ]+\) Nextcloud\-Outlook v.*$/';
public const USER_AGENT_OUTLOOK_ADDON = '/^Mozilla\/5\.0 \([A-Za-z ]+\) Nextcloud\-Outlook v([^ ]*).*$/';
/**
* @since 13.0.1
* @since 28.0.0 The regex has a group matching the version number
*/
public const USER_AGENT_THUNDERBIRD_ADDON = '/^Mozilla\/5\.0 \([A-Za-z ]+\) Nextcloud\-Thunderbird v.*$/';
public const USER_AGENT_THUNDERBIRD_ADDON = '/^Mozilla\/5\.0 \([A-Za-z ]+\) Nextcloud\-Thunderbird v([^ ]*).*$/';
/**
* @since 26.0.0

View File

@ -1265,6 +1265,63 @@ class RequestTest extends \Test\TestCase {
];
}
public function dataMatchClientVersion(): array {
return [
[
'Mozilla/5.0 (Android) Nextcloud-android/3.24.1',
Request::USER_AGENT_CLIENT_ANDROID,
'3.24.1',
],
[
'Mozilla/5.0 (iOS) Nextcloud-iOS/4.8.2',
Request::USER_AGENT_CLIENT_IOS,
'4.8.2',
],
[
'Mozilla/5.0 (Windows) mirall/3.8.1',
Request::USER_AGENT_CLIENT_DESKTOP,
'3.8.1',
],
[
'Mozilla/5.0 (Android) Nextcloud-Talk v17.10.0',
Request::USER_AGENT_TALK_ANDROID,
'17.10.0',
],
[
'Mozilla/5.0 (iOS) Nextcloud-Talk v17.0.1',
Request::USER_AGENT_TALK_IOS,
'17.0.1',
],
[
'Mozilla/5.0 (Windows) Nextcloud-Talk v0.6.0',
Request::USER_AGENT_TALK_DESKTOP,
'0.6.0',
],
[
'Mozilla/5.0 (Windows) Nextcloud-Outlook v1.0.0',
Request::USER_AGENT_OUTLOOK_ADDON,
'1.0.0',
],
[
'Mozilla/5.0 (Linux) Nextcloud-Thunderbird v1.0.0',
Request::USER_AGENT_THUNDERBIRD_ADDON,
'1.0.0',
],
];
}
/**
* @dataProvider dataMatchClientVersion
* @param string $testAgent
* @param string $userAgent
* @param string $version
*/
public function testMatchClientVersion(string $testAgent, string $userAgent, string $version): void {
preg_match($userAgent, $testAgent, $matches);
$this->assertSame($version, $matches[1]);
}
public function testInsecureServerHostServerNameHeader() {
$request = new Request(
[