From 1c0d069afc054eb61c9fcf3bd16f84befd4fe10f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Thu, 9 Nov 2023 14:55:09 +0100 Subject: [PATCH 1/4] Branch the 1.4 Complete the CHANGELOG with new features and fixes Update the dependencies --- CHANGELOG.md | 8 ++++++++ flexiapi/composer.lock | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ece336..7c3b141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,16 @@ v1.4 ---- - Redesign and refactoring of the main UI and panel flows +- Complete the statistics and add a specific API to get usage statistics from FlexiAPI - Removal of XMLRPC - Add RockyLinux 9 support +- Add Debian 12 to CI +- Fix #122 Add a new console command CreateFirstAdmin +- Fix #121 Only apply throttling to redeemed tokens +- Fix #123 Define a proper documentation for the provisioning flow +- Fix #124 Return 404 when the account is already provisioned or the provisioning_token not valid +- Fix #125 Remove the External Accounts feature +- Fix #19 Set all the ERROR confirmation_key to null in the accounts table v1.3 ---- diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index b79f0e0..5e1a1f4 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -4442,16 +4442,16 @@ }, { "name": "ramsey/uuid", - "version": "4.7.4", + "version": "4.7.5", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "60a4c63ab724854332900504274f6150ff26d286" + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286", - "reference": "60a4c63ab724854332900504274f6150ff26d286", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", "shasum": "" }, "require": { @@ -4518,7 +4518,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.4" + "source": "https://github.com/ramsey/uuid/tree/4.7.5" }, "funding": [ { @@ -4530,7 +4530,7 @@ "type": "tidelift" } ], - "time": "2023-04-15T23:01:58+00:00" + "time": "2023-11-08T05:53:05+00:00" }, { "name": "react/cache", From b70fc27feab3039f94e383e642093d508cb94565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Mon, 13 Nov 2023 10:33:37 +0000 Subject: [PATCH 2/4] Reorganize the statistics filters form for better readability --- flexiapi/composer.lock | 62 +++++++++--------- flexiapi/composer.phar | Bin 2810737 -> 2861347 bytes .../admin/statistics/parts/filters.blade.php | 24 ++++--- 3 files changed, 42 insertions(+), 44 deletions(-) diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index 5e1a1f4..43da42d 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -1391,24 +1391,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.1", + "version": "v1.1.2", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", - "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.1" + "phpoption/phpoption": "^1.9.2" }, "require-dev": { - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "autoload": { @@ -1437,7 +1437,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" }, "funding": [ { @@ -1449,7 +1449,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T20:23:15+00:00" + "time": "2023-11-12T22:16:48+00:00" }, { "name": "guzzlehttp/guzzle", @@ -3350,16 +3350,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.1", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", - "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", "shasum": "" }, "require": { @@ -3367,7 +3367,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "type": "library", "extra": { @@ -3409,7 +3409,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" }, "funding": [ { @@ -3421,7 +3421,7 @@ "type": "tidelift" } ], - "time": "2023-02-25T19:38:58+00:00" + "time": "2023-11-12T21:59:55+00:00" }, { "name": "phpunit/php-code-coverage", @@ -8422,31 +8422,31 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.5.0", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", - "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.0.2", - "php": "^7.1.3 || ^8.0", - "phpoption/phpoption": "^1.8", - "symfony/polyfill-ctype": "^1.23", - "symfony/polyfill-mbstring": "^1.23.1", - "symfony/polyfill-php80": "^1.23.1" + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -8458,7 +8458,7 @@ "forward-command": true }, "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -8490,7 +8490,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" }, "funding": [ { @@ -8502,7 +8502,7 @@ "type": "tidelift" } ], - "time": "2022-10-16T01:01:54+00:00" + "time": "2023-11-12T22:43:29+00:00" }, { "name": "voku/portable-ascii", @@ -9666,5 +9666,5 @@ "platform-overrides": { "php": "8.0.2" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/flexiapi/composer.phar b/flexiapi/composer.phar index 6d799ebd6f101824bfc6c5b1f4970f3783d90a5c..e766506542d36f55d0200e9986b5c33a6d2919a1 100755 GIT binary patch delta 85109 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 bYaVXD>Y1W5O%MO^M9{as^{u&e3+w(5GgsQI delta 52990 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

RtNNg8@VCCK|L7C`vK7 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 diff --git a/flexiapi/resources/views/admin/statistics/parts/filters.blade.php b/flexiapi/resources/views/admin/statistics/parts/filters.blade.php index 6809d29..23fd715 100644 --- a/flexiapi/resources/views/admin/statistics/parts/filters.blade.php +++ b/flexiapi/resources/views/admin/statistics/parts/filters.blade.php @@ -15,7 +15,16 @@ -
+
@if (config('app.admins_manage_multi_domains'))
@@ -49,18 +58,7 @@
-
- Day - Week - Month - Year -
- -
+
Reset From 4d9a19f8cfc131c746e141df682cc7dbd98bd54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Mon, 13 Nov 2023 14:14:42 +0000 Subject: [PATCH 3/4] Fix #119 Add a X-Linphone-Provisioning required header to the provisioning... --- .../Account/ProvisioningController.php | 4 + flexiapi/composer.lock | 12 +-- .../documentation_markdown.blade.php | 8 ++ .../tests/Feature/AccountProvisioningTest.php | 79 +++++++++++++++---- 4 files changed, 82 insertions(+), 21 deletions(-) diff --git a/flexiapi/app/Http/Controllers/Account/ProvisioningController.php b/flexiapi/app/Http/Controllers/Account/ProvisioningController.php index d533979..f5cec57 100644 --- a/flexiapi/app/Http/Controllers/Account/ProvisioningController.php +++ b/flexiapi/app/Http/Controllers/Account/ProvisioningController.php @@ -124,6 +124,10 @@ class ProvisioningController extends Controller private function generateProvisioning(Request $request, Account $account = null) { + if (!$request->hasHeader('x-linphone-provisioning')) { + abort(400, 'x-linphone-provisioning header is missing'); + } + // Load the hooks if they exists $provisioningHooks = config_path('provisioning_hooks.php'); diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index 43da42d..1ea46ba 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -4682,16 +4682,16 @@ }, { "name": "react/event-loop", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", "shasum": "" }, "require": { @@ -4742,7 +4742,7 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" }, "funding": [ { @@ -4750,7 +4750,7 @@ "type": "open_collective" } ], - "time": "2023-05-05T10:11:24+00:00" + "time": "2023-11-13T13:48:05+00:00" }, { "name": "react/promise", diff --git a/flexiapi/resources/views/provisioning/documentation_markdown.blade.php b/flexiapi/resources/views/provisioning/documentation_markdown.blade.php index 4f633d9..65f8514 100644 --- a/flexiapi/resources/views/provisioning/documentation_markdown.blade.php +++ b/flexiapi/resources/views/provisioning/documentation_markdown.blade.php @@ -4,6 +4,14 @@ Provisioning is a core concept of the FlexiAPI - Linphone clients flow. ## About +To request the following URLs client MUST add a specific `x-linphone-provisioning` header. +Otherwise the URLs with always return 400. This specific header is required to prevent unsolicited clients (crawlers, embedders) to consume the tokens. + +``` +> GET /provisioning/### +> x-linphone-provisioning +``` + ### Provisioning XML ``` diff --git a/flexiapi/tests/Feature/AccountProvisioningTest.php b/flexiapi/tests/Feature/AccountProvisioningTest.php index 9a72713..fd0015a 100644 --- a/flexiapi/tests/Feature/AccountProvisioningTest.php +++ b/flexiapi/tests/Feature/AccountProvisioningTest.php @@ -41,22 +41,37 @@ class AccountProvisioningTest extends TestCase public function testBaseProvisioning() { - $response = $this->get($this->route); - $response->assertStatus(200); - $response->assertHeader('Content-Type', 'application/xml'); - $response->assertDontSee('ha1'); + $this->get($this->route)->assertStatus(400); + + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ])->get($this->route) + ->assertStatus(200) + ->assertHeader('Content-Type', 'application/xml') + ->assertDontSee('ha1'); + } + + public function testXLinphoneProvisioningHeader() + { + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ])->get($this->accountRoute)->assertStatus(302); } public function testAuthenticatedProvisioning() { - $response = $this->get($this->accountRoute); - $response->assertStatus(302); - $password = Password::factory()->create(); $password->account->generateApiKey(); + $this->keyAuthenticated($password->account) + ->get($this->accountRoute) + ->assertStatus(400); + // Ensure that we get the authentication password once $response = $this->keyAuthenticated($password->account) + ->withHeaders([ + 'x-linphone-provisioning' => true, + ]) ->get($this->accountRoute) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') @@ -65,6 +80,9 @@ class AccountProvisioningTest extends TestCase // And then twice $response = $this->keyAuthenticated($password->account) + ->withHeaders([ + 'x-linphone-provisioning' => true, + ]) ->get($this->accountRoute) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') @@ -80,6 +98,9 @@ class AccountProvisioningTest extends TestCase // Regenerate a new provisioning token from the authenticated account $this->keyAuthenticated($password->account) + ->withHeaders([ + 'x-linphone-provisioning' => true, + ]) ->get('/api/accounts/me/provision') ->assertStatus(200) ->assertSee('provisioning_token') @@ -88,7 +109,10 @@ class AccountProvisioningTest extends TestCase $password->account->refresh(); // And use the fresh provisioning token - $this->get($this->route . '/' . $password->account->provisioning_token) + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ]) + ->get($this->route . '/' . $password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee($password->account->username) @@ -112,13 +136,17 @@ class AccountProvisioningTest extends TestCase ); // Check the QRCode - $this->get($this->route . '/qrcode/' . $password->account->provisioning_token . '?reset_password') + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ])->get($this->route . '/qrcode/' . $password->account->provisioning_token . '?reset_password') ->assertStatus(200) ->assertHeader('Content-Type', 'image/png') ->assertHeader('X-Qrcode-URL', $provioningUrl); // And use the fresh provisioning token - $this->get($provioningUrl) + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ])->get($provioningUrl) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee($password->account->username) @@ -140,7 +168,10 @@ class AccountProvisioningTest extends TestCase $password->account->save(); // Ensure that we get the authentication password once - $response = $this->get($this->route . '/' . $password->account->provisioning_token) + $response = $this->withHeaders([ + 'x-linphone-provisioning' => true, + ]) + ->get($this->route . '/' . $password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); @@ -161,6 +192,9 @@ class AccountProvisioningTest extends TestCase $admin->account->generateApiKey(); $this->keyAuthenticated($admin->account) + ->withHeaders([ + 'x-linphone-provisioning' => true, + ]) ->json($this->method, '/api/accounts/' . $password->account->id . '/provision') ->assertStatus(200) ->assertSee('provisioning_token') @@ -171,7 +205,10 @@ class AccountProvisioningTest extends TestCase $this->assertNotEquals($provisioningToken, $password->account->provisioning_token); // And then provision one last time - $this->get($this->route . '/' . $password->account->provisioning_token) + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ]) + ->get($this->route . '/' . $password->account->provisioning_token) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); @@ -180,7 +217,10 @@ class AccountProvisioningTest extends TestCase public function testAuthTokenProvisioning() { // Generate a public auth_token and attach it - $response = $this->json('POST', '/api/accounts/auth_token') + $response = $this->withHeaders([ + 'x-linphone-provisioning' => true, + ]) + ->json('POST', '/api/accounts/auth_token') ->assertStatus(201) ->assertJson([ 'token' => true @@ -192,13 +232,19 @@ class AccountProvisioningTest extends TestCase $password->account->generateApiKey(); $this->keyAuthenticated($password->account) + ->withHeaders([ + 'x-linphone-provisioning' => true, + ]) ->json($this->method, '/api/accounts/auth_token/' . $authToken . '/attach') ->assertStatus(200); // Use the auth_token to provision the account $this->assertEquals(AuthToken::count(), 1); - $this->get($this->route . '/auth_token/' . $authToken) + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ]) + ->get($this->route . '/auth_token/' . $authToken) ->assertStatus(200) ->assertHeader('Content-Type', 'application/xml') ->assertSee('ha1'); @@ -206,7 +252,10 @@ class AccountProvisioningTest extends TestCase $this->assertEquals(AuthToken::count(), 0); // Try to re-use the auth_token - $this->get($this->route . '/auth_token/' . $authToken) + $this->withHeaders([ + 'x-linphone-provisioning' => true, + ]) + ->get($this->route . '/auth_token/' . $authToken) ->assertStatus(404); } } From c770798493d224a41ae0b72f2990c489decfbca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Thu, 30 Nov 2023 16:15:44 +0000 Subject: [PATCH 4/4] Fix #128 Add a DotEnv toggle to enable/disable the X-Linphone-Provisioning header --- Makefile | 2 +- flexiapi/.env.example | 1 + .../Account/ProvisioningController.php | 3 +- flexiapi/composer.lock | 109 +++++++++--------- flexiapi/config/app.php | 1 + .../tests/Feature/AccountProvisioningTest.php | 10 ++ 6 files changed, 70 insertions(+), 56 deletions(-) diff --git a/Makefile b/Makefile index e491328..708ef06 100644 --- a/Makefile +++ b/Makefile @@ -74,7 +74,7 @@ deb-only: fakeroot alien -g -k --scripts $(OUTPUT_DIR)/rpmbuild/tmp.rpm rm -r $(OUTPUT_DIR)/rpmbuild rm -rf $(OUTPUT_DIR)/*.orig - sed -i 's/Depends:.*/Depends: $${shlibs:Depends}, php (>= 8.0), php-xml, php-pdo, php-gd, php-redis, php-mysql, php-mbstring, php-sqlite3/g' $(OUTPUT_DIR)/bc-flexisip-account-manager*/debian/control + sed -i 's/Depends:.*/Depends: $${shlibs:Depends}, php (>= 8.2), php8.2-xml, php8.2-pdo, php8.2-gd, php8.2-redis, php8.2-mysql, php8.2-mbstring, php8.2-sqlite3/g' $(OUTPUT_DIR)/bc-flexisip-account-manager*/debian/control cd `ls -rt $(OUTPUT_DIR) | tail -1` && dpkg-buildpackage --no-sign @echo "📦✅ DEB Package Created" diff --git a/flexiapi/.env.example b/flexiapi/.env.example index c227eb3..1d94e98 100644 --- a/flexiapi/.env.example +++ b/flexiapi/.env.example @@ -30,6 +30,7 @@ ACCOUNT_USERNAME_REGEX="^[a-z0-9+_.-]*$" # Account provisioning ACCOUNT_PROVISIONING_RC_FILE= ACCOUNT_PROVISIONING_OVERWRITE_ALL= +ACCOUNT_PROVISIONING_USE_X_LINPHONE_PROVISIONING_HEADER=true # Instance specific parameters INSTANCE_COPYRIGHT= # Simple text displayed in the page footer diff --git a/flexiapi/app/Http/Controllers/Account/ProvisioningController.php b/flexiapi/app/Http/Controllers/Account/ProvisioningController.php index f5cec57..28e6a24 100644 --- a/flexiapi/app/Http/Controllers/Account/ProvisioningController.php +++ b/flexiapi/app/Http/Controllers/Account/ProvisioningController.php @@ -124,7 +124,8 @@ class ProvisioningController extends Controller private function generateProvisioning(Request $request, Account $account = null) { - if (!$request->hasHeader('x-linphone-provisioning')) { + if (!$request->hasHeader('x-linphone-provisioning') + && config('app.provisioning_use_x_linphone_provisioning_header')) { abort(400, 'x-linphone-provisioning header is missing'); } diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index 1ea46ba..4fd5a78 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -461,16 +461,16 @@ }, { "name": "doctrine/dbal", - "version": "3.7.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2" + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b7bd66c9ff58c04c5474ab85edce442f8081cb2", - "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2", + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2", "shasum": "" }, "require": { @@ -486,7 +486,7 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.35", + "phpstan/phpstan": "1.10.42", "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", @@ -554,7 +554,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.7.1" + "source": "https://github.com/doctrine/dbal/tree/3.7.2" }, "funding": [ { @@ -570,7 +570,7 @@ "type": "tidelift" } ], - "time": "2023-10-06T05:06:20+00:00" + "time": "2023-11-19T08:06:58+00:00" }, { "name": "doctrine/deprecations", @@ -2056,16 +2056,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.2", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c" + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/076fe2cf128bd54b4341cdc6d49b95b34e101e4c", - "reference": "076fe2cf128bd54b4341cdc6d49b95b34e101e4c", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", "shasum": "" }, "require": { @@ -2112,7 +2112,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-10-17T13:38:16+00:00" + "time": "2023-11-08T14:08:06+00:00" }, { "name": "league/commonmark", @@ -2304,16 +2304,16 @@ }, { "name": "league/flysystem", - "version": "3.19.0", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83" + "reference": "a326d8a2d007e4ca327a57470846e34363789258" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b2aa10f2326e0351399b8ce68e287d8e9209a83", - "reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a326d8a2d007e4ca327a57470846e34363789258", + "reference": "a326d8a2d007e4ca327a57470846e34363789258", "shasum": "" }, "require": { @@ -2378,7 +2378,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.19.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.21.0" }, "funding": [ { @@ -2390,20 +2390,20 @@ "type": "github" } ], - "time": "2023-11-07T09:04:28+00:00" + "time": "2023-11-18T13:59:15+00:00" }, { "name": "league/flysystem-local", - "version": "3.19.0", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076" + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/8d868217f9eeb4e9a7320db5ccad825e9a7a4076", - "reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", "shasum": "" }, "require": { @@ -2438,7 +2438,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.19.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.21.0" }, "funding": [ { @@ -2450,7 +2450,7 @@ "type": "github" } ], - "time": "2023-11-06T20:35:28+00:00" + "time": "2023-11-18T13:41:42+00:00" }, { "name": "league/mime-type-detection", @@ -4606,16 +4606,16 @@ }, { "name": "react/dns", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" + "reference": "c134600642fa615b46b41237ef243daa65bb64ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec", + "reference": "c134600642fa615b46b41237ef243daa65bb64ec", "shasum": "" }, "require": { @@ -4625,7 +4625,7 @@ "react/promise": "^3.0 || ^2.7 || ^1.2.1" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^4.8.35", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/async": "^4 || ^3 || ^2", "react/promise-timer": "^1.9" }, @@ -4670,7 +4670,7 @@ ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.11.0" + "source": "https://github.com/reactphp/dns/tree/v1.12.0" }, "funding": [ { @@ -4678,7 +4678,7 @@ "type": "open_collective" } ], - "time": "2023-06-02T12:45:26+00:00" + "time": "2023-11-29T12:41:06+00:00" }, { "name": "react/event-loop", @@ -4754,24 +4754,24 @@ }, { "name": "react/promise", - "version": "v3.0.0", + "version": "v3.1.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" + "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", - "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.20 || 1.4.10", - "phpunit/phpunit": "^9.5 || ^7.5" + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", "autoload": { @@ -4815,7 +4815,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.0.0" + "source": "https://github.com/reactphp/promise/tree/v3.1.0" }, "funding": [ { @@ -4823,7 +4823,7 @@ "type": "open_collective" } ], - "time": "2023-07-11T16:12:49+00:00" + "time": "2023-11-16T16:21:57+00:00" }, { "name": "react/socket", @@ -8319,16 +8319,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -8357,7 +8357,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -8365,7 +8365,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9222,23 +9222,24 @@ }, { "name": "pdepend/pdepend", - "version": "2.15.1", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0" + "reference": "8dfc0c46529e2073fa97986552f80646eedac562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/d12f25bcdfb7754bea458a4a5cb159d55e9950d0", - "reference": "d12f25bcdfb7754bea458a4a5cb159d55e9950d0", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/8dfc0c46529e2073fa97986552f80646eedac562", + "reference": "8dfc0c46529e2073fa97986552f80646eedac562", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5|^6.0", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", - "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", @@ -9273,7 +9274,7 @@ ], "support": { "issues": "https://github.com/pdepend/pdepend/issues", - "source": "https://github.com/pdepend/pdepend/tree/2.15.1" + "source": "https://github.com/pdepend/pdepend/tree/2.16.0" }, "funding": [ { @@ -9281,7 +9282,7 @@ "type": "tidelift" } ], - "time": "2023-09-28T12:00:56+00:00" + "time": "2023-11-29T08:52:35+00:00" }, { "name": "phpmd/phpmd", diff --git a/flexiapi/config/app.php b/flexiapi/config/app.php index 92016e4..6694d68 100644 --- a/flexiapi/config/app.php +++ b/flexiapi/config/app.php @@ -55,6 +55,7 @@ return [ */ 'provisioning_rc_file' => env('ACCOUNT_PROVISIONING_RC_FILE', ''), 'provisioning_overwrite_all' => env('ACCOUNT_PROVISIONING_OVERWRITE_ALL', false), + 'provisioning_use_x_linphone_provisioning_header' => env('ACCOUNT_PROVISIONING_USE_X_LINPHONE_PROVISIONING_HEADER', true), /** * Set a global realm for all the accounts, if not set, the account domain diff --git a/flexiapi/tests/Feature/AccountProvisioningTest.php b/flexiapi/tests/Feature/AccountProvisioningTest.php index fd0015a..0c62ee1 100644 --- a/flexiapi/tests/Feature/AccountProvisioningTest.php +++ b/flexiapi/tests/Feature/AccountProvisioningTest.php @@ -51,6 +51,16 @@ class AccountProvisioningTest extends TestCase ->assertDontSee('ha1'); } + public function testDisabledProvisioningHeader() + { + config()->set('app.provisioning_use_x_linphone_provisioning_header', false); + + $this->get($this->route) + ->assertStatus(200) + ->assertHeader('Content-Type', 'application/xml') + ->assertDontSee('ha1'); + } + public function testXLinphoneProvisioningHeader() { $this->withHeaders([