From 717d3e3cc9d88cc0634b363b67fc0f24ef535093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Wed, 19 Jan 2022 17:59:08 +0100 Subject: [PATCH] Move the DTMF protocol from AccountAction to Account Ensure that the account actions are not reachable if the account doesn't have the DTMF protocol configured Update the documentation Update the tests Fix migration for SQLite --- Makefile | 4 +- flexiapi/app/Account.php | 26 +++- flexiapi/app/AccountAction.php | 12 -- .../Admin/AccountActionController.php | 14 +-- .../Controllers/Admin/AccountController.php | 16 +-- .../Controllers/Api/AccountController.php | 2 + .../Api/Admin/AccountActionController.php | 30 +++-- .../Api/Admin/AccountController.php | 2 + .../Http/Requests/CreateAccountRequest.php | 4 +- .../Http/Requests/UpdateAccountRequest.php | 4 +- flexiapi/composer.lock | 113 ++++-------------- flexiapi/composer.phar | Bin 2283840 -> 2356380 bytes .../database/factories/AccountFactory.php | 1 + ...021_10_13_092937_create_contacts_table.php | 11 +- ...otocol_from_account_actions_to_account.php | 36 ++++++ .../account/action/create_edit.blade.php | 4 - .../views/admin/account/create_edit.blade.php | 8 +- .../views/admin/account/show.blade.php | 8 +- .../api/documentation_markdown.blade.php | 27 ++++- flexiapi/tests/Feature/AccountActionTest.php | 41 ++++--- .../tests/Feature/AccountContactsTest.php | 6 +- flexisip-account-manager.spec | 2 +- 22 files changed, 202 insertions(+), 169 deletions(-) create mode 100644 flexiapi/database/migrations/2022_01_19_160606_move_protocol_from_account_actions_to_account.php diff --git a/Makefile b/Makefile index 578fdcf..9561768 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ $(eval GIT_DESCRIBE = $(shell sh -c "git describe")) OUTPUT_DIR = ${CURDIR} prepare: - cd flexiapi && composer install --no-dev + cd flexiapi && php composer.phar install --no-dev prepare-dev: - cd flexiapi && composer install + cd flexiapi && php composer.phar install package-common: rm -rf $(OUTPUT_DIR)/flexisip-account-manager diff --git a/flexiapi/app/Account.php b/flexiapi/app/Account.php index f9a84e3..91b1e37 100644 --- a/flexiapi/app/Account.php +++ b/flexiapi/app/Account.php @@ -31,6 +31,7 @@ use App\Password; use App\EmailChanged; use App\Helpers\Utils; use App\Mail\ChangingEmail; +use Illuminate\Database\Eloquent\Relations\HasMany; class Account extends Authenticatable { @@ -45,6 +46,8 @@ class Account extends Authenticatable ]; public $timestamps = false; + public static $dtmfProtocols = ['sipinfo' => 'SIPInfo', 'rfc2833' => 'RFC2833']; + /** * Scopes */ @@ -79,7 +82,11 @@ class Account extends Authenticatable */ public function actions() { - return $this->hasMany('App\AccountAction'); + return $this->hasMany('App\AccountAction')->whereIn('account_id', function ($query) { + $query->select('id') + ->from('accounts') + ->whereNotNull('dtmf_protocol'); + }); } public function activationExpiration() @@ -173,6 +180,16 @@ class Account extends Authenticatable return $this->passwords()->where('algorithm', 'SHA-256')->exists(); } + public static function dtmfProtocolsRule() + { + return implode(',', array_keys(self::$dtmfProtocols)); + } + + public function getResolvedDtmfProtocolAttribute() + { + return self::$dtmfProtocols[$this->attributes['dtmf_protocol']]; + } + /** * Utils */ @@ -249,6 +266,11 @@ FN:'.$this->attributes['display_name']; FN:'.$this->getIdentifierAttribute(); } + if ($this->dtmf_protocol) { + $vcard .= ' +X-LINPHONE-ACCOUNT-DTMF-PROTOCOL:'.$this->dtmf_protocol; + } + if ($this->types->count() > 0) { $vcard .= ' X-LINPHONE-ACCOUNT-TYPE:'.$this->types->implode('key', ','); @@ -256,7 +278,7 @@ X-LINPHONE-ACCOUNT-TYPE:'.$this->types->implode('key', ','); foreach ($this->actions as $action) { $vcard .= ' -X-LINPHONE-ACCOUNT-ACTION:'.$action->key.';'.$action->code.';'.$action->protocol; +X-LINPHONE-ACCOUNT-ACTION:'.$action->key.';'.$action->code; } return $vcard . ' diff --git a/flexiapi/app/AccountAction.php b/flexiapi/app/AccountAction.php index 327cafd..af1d4ae 100644 --- a/flexiapi/app/AccountAction.php +++ b/flexiapi/app/AccountAction.php @@ -9,18 +9,6 @@ class AccountAction extends Model { use HasFactory; - public static $protocols = ['sipinfo' => 'SIPInfo', 'rfc2833' => 'RFC2833']; - - public static function protocolsRule() - { - return implode(',', array_keys(self::$protocols)); - } - - public function getResolvedProtocolAttribute() - { - return self::$protocols[$this->attributes['protocol']]; - } - public function account() { return $this->belongsTo('App\Account'); diff --git a/flexiapi/app/Http/Controllers/Admin/AccountActionController.php b/flexiapi/app/Http/Controllers/Admin/AccountActionController.php index 835ba3e..de94fae 100644 --- a/flexiapi/app/Http/Controllers/Admin/AccountActionController.php +++ b/flexiapi/app/Http/Controllers/Admin/AccountActionController.php @@ -35,8 +35,7 @@ class AccountActionController extends Controller return view('admin.account.action.create_edit', [ 'action' => new AccountAction, - 'account' => $account, - 'protocols' => AccountAction::$protocols + 'account' => $account ]); } @@ -46,15 +45,13 @@ class AccountActionController extends Controller $request->validate([ 'key' => ['required', 'alpha_dash', new NoUppercase], - 'code' => ['required', 'alpha_num', new NoUppercase], - 'protocol' => 'required|in:' . AccountAction::protocolsRule() + 'code' => ['required', 'alpha_num', new NoUppercase] ]); $accountAction = new AccountAction; $accountAction->account_id = $account->id; $accountAction->key = $request->get('key'); $accountAction->code = $request->get('code'); - $accountAction->protocol = $request->get('protocol'); $accountAction->save(); $request->session()->flash('success', 'Action successfully created'); @@ -73,8 +70,7 @@ class AccountActionController extends Controller return view('admin.account.action.create_edit', [ 'action' => $accountAction, - 'account' => $account, - 'protocols' => AccountAction::$protocols + 'account' => $account ]); } @@ -84,8 +80,7 @@ class AccountActionController extends Controller $request->validate([ 'key' => ['alpha_dash', new NoUppercase], - 'code' => ['alpha_num', new NoUppercase], - 'protocol' => 'in:' . AccountAction::protocolsRule() + 'code' => ['alpha_num', new NoUppercase] ]); $accountAction = $account->actions() @@ -93,7 +88,6 @@ class AccountActionController extends Controller ->firstOrFail(); $accountAction->key = $request->get('key'); $accountAction->code = $request->get('code'); - $accountAction->protocol = $request->get('protocol'); $accountAction->save(); $request->session()->flash('success', 'Action successfully updated'); diff --git a/flexiapi/app/Http/Controllers/Admin/AccountController.php b/flexiapi/app/Http/Controllers/Admin/AccountController.php index a919015..8374346 100644 --- a/flexiapi/app/Http/Controllers/Admin/AccountController.php +++ b/flexiapi/app/Http/Controllers/Admin/AccountController.php @@ -58,7 +58,8 @@ class AccountController extends Controller public function create(Request $request) { return view('admin.account.create_edit', [ - 'account' => new Account + 'account' => new Account, + 'protocols' => [null => 'None'] + Account::$dtmfProtocols ]); } @@ -74,6 +75,7 @@ class AccountController extends Controller $account->ip_address = $request->ip(); $account->creation_time = Carbon::now(); $account->user_agent = config('app.name'); + $account->dtmf_protocol = $request->get('dtmf_protocol'); $account->save(); $this->fillPassword($request, $account); @@ -87,7 +89,8 @@ class AccountController extends Controller public function edit(int $id) { return view('admin.account.create_edit', [ - 'account' => Account::findOrFail($id) + 'account' => Account::findOrFail($id), + 'protocols' => [null => 'None'] + Account::$dtmfProtocols ]); } @@ -97,6 +100,7 @@ class AccountController extends Controller $account->username = $request->get('username'); $account->email = $request->get('email'); $account->display_name = $request->get('display_name'); + $account->dtmf_protocol = $request->get('dtmf_protocol'); $account->save(); $this->fillPassword($request, $account); @@ -201,20 +205,16 @@ class AccountController extends Controller return redirect()->back(); } - private function fillPassword(Request $request, int $id) + private function fillPassword(Request $request, Account $account) { - $account = Account::findOrFail($id); - if ($request->filled('password')) { $algorithm = $request->has('password_sha256') ? 'SHA-256' : 'MD5'; $account->updatePassword($request->get('password'), $algorithm); } } - private function fillPhone(Request $request, int $id) + private function fillPhone(Request $request, Account $account) { - $account = Account::findOrFail($id); - if ($request->filled('phone')) { $account->alias()->delete(); diff --git a/flexiapi/app/Http/Controllers/Api/AccountController.php b/flexiapi/app/Http/Controllers/Api/AccountController.php index 1bdf100..71356f0 100644 --- a/flexiapi/app/Http/Controllers/Api/AccountController.php +++ b/flexiapi/app/Http/Controllers/Api/AccountController.php @@ -67,6 +67,7 @@ class AccountController extends Controller ], 'algorithm' => 'required|in:SHA-256,MD5', 'password' => 'required|filled', + 'dtmf_protocol' => 'nullable|in:' . Account::dtmfProtocolsRule(), 'domain' => 'min:3', 'token' => [ 'required', @@ -91,6 +92,7 @@ class AccountController extends Controller $account->ip_address = $request->ip(); $account->creation_time = Carbon::now(); $account->user_agent = config('app.name'); + $account->dtmf_protocol = $request->get('dtmf_protocol'); $account->confirmation_key = Str::random(WebAuthenticateController::$emailCodeSize); $account->save(); diff --git a/flexiapi/app/Http/Controllers/Api/Admin/AccountActionController.php b/flexiapi/app/Http/Controllers/Api/Admin/AccountActionController.php index e3dca69..154ddb5 100644 --- a/flexiapi/app/Http/Controllers/Api/Admin/AccountActionController.php +++ b/flexiapi/app/Http/Controllers/Api/Admin/AccountActionController.php @@ -30,12 +30,12 @@ class AccountActionController extends Controller { public function index(int $id) { - return Account::findOrFail($id)->actions; + return $this->resolveAccount($id)->actions; } public function get(int $id, int $actionId) { - return Account::findOrFail($id) + return $this->resolveAccount($id) ->actions() ->where('id', $actionId) ->firstOrFail(); @@ -43,17 +43,17 @@ class AccountActionController extends Controller public function store(Request $request, int $id) { + $account = $this->resolveAccount($id); + $request->validate([ 'key' => ['required', 'alpha_dash', new NoUppercase], - 'code' => ['required', 'alpha_num', new NoUppercase], - 'protocol' => 'required|in:' . AccountAction::protocolsRule() + 'code' => ['required', 'alpha_num', new NoUppercase] ]); $accountAction = new AccountAction; - $accountAction->account_id = Account::findOrFail($id)->id; + $accountAction->account_id = $account->id; $accountAction->key = $request->get('key'); $accountAction->code = $request->get('code'); - $accountAction->protocol = $request->get('protocol'); $accountAction->save(); return $accountAction; @@ -61,19 +61,19 @@ class AccountActionController extends Controller public function update(Request $request, int $id, int $actionId) { + $account = $this->resolveAccount($id); + $request->validate([ 'key' => ['alpha_dash', new NoUppercase], - 'code' => ['alpha_num', new NoUppercase], - 'protocol' => 'in:' . AccountAction::protocolsRule() + 'code' => ['alpha_num', new NoUppercase] ]); - $accountAction = Account::findOrFail($id) + $accountAction = $account ->actions() ->where('id', $actionId) ->firstOrFail(); $accountAction->key = $request->get('key'); $accountAction->code = $request->get('code'); - $accountAction->protocol = $request->get('protocol'); $accountAction->save(); return $accountAction; @@ -81,9 +81,17 @@ class AccountActionController extends Controller public function destroy(int $id, int $actionId) { - return Account::findOrFail($id) + return $this->resolveAccount($id) ->actions() ->where('id', $actionId) ->delete(); } + + private function resolveAccount(int $id) + { + $account = Account::findOrFail($id); + if ($account->dtmf_protocol == null) abort(403, 'DTMF Protocol must be configured'); + + return $account; + } } diff --git a/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php b/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php index b76e408..bf01821 100644 --- a/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php +++ b/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php @@ -108,6 +108,7 @@ class AccountController extends Controller 'email' => 'email', 'admin' => 'boolean|nullable', 'activated' => 'boolean|nullable', + 'dtmf_protocol' => 'nullable|in:' . Account::dtmfProtocolsRule(), 'confirmation_key_expires' => [ 'date_format:Y-m-d H:i:s', 'nullable', @@ -127,6 +128,7 @@ class AccountController extends Controller ? (bool)$request->get('activated') : false; $account->ip_address = $request->ip(); + $account->dtmf_protocol = $request->get('dtmf_protocol'); $account->creation_time = Carbon::now(); $account->domain = $request->has('domain') && config('app.admins_manage_multi_domains') ? $request->get('domain') diff --git a/flexiapi/app/Http/Requests/CreateAccountRequest.php b/flexiapi/app/Http/Requests/CreateAccountRequest.php index 9d3fecf..22a1471 100644 --- a/flexiapi/app/Http/Requests/CreateAccountRequest.php +++ b/flexiapi/app/Http/Requests/CreateAccountRequest.php @@ -3,8 +3,9 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; - use Illuminate\Validation\Rule; + +use App\Account; use App\Rules\WithoutSpaces; class CreateAccountRequest extends FormRequest @@ -27,6 +28,7 @@ class CreateAccountRequest extends FormRequest 'domain' => config('app.admins_manage_multi_domains') ? 'required' : '', 'password' => 'required|min:3', 'email' => 'nullable|email', + 'dtmf_protocol' => 'nullable|in:' . Account::dtmfProtocolsRule(), 'phone' => [ 'nullable', 'unique:aliases,alias', diff --git a/flexiapi/app/Http/Requests/UpdateAccountRequest.php b/flexiapi/app/Http/Requests/UpdateAccountRequest.php index c66dc4c..fbab93b 100644 --- a/flexiapi/app/Http/Requests/UpdateAccountRequest.php +++ b/flexiapi/app/Http/Requests/UpdateAccountRequest.php @@ -3,8 +3,9 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; - use Illuminate\Validation\Rule; + +use App\Account; use App\Rules\WithoutSpaces; class UpdateAccountRequest extends FormRequest @@ -27,6 +28,7 @@ class UpdateAccountRequest extends FormRequest 'domain' => config('app.admins_manage_multi_domains') ? 'required' : '', 'email' => 'nullable|email', 'password_sha256' => 'nullable|min:3', + 'dtmf_protocol' => 'nullable|in:' . Account::dtmfProtocolsRule(), 'phone' => [ 'nullable', Rule::unique('accounts', 'username')->where(function ($query) { diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index f855e72..38efe76 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -183,79 +183,6 @@ ], "time": "2021-08-15T20:50:18+00:00" }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.4", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b174585d1fe49ceed21928a945138948cb394600" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", - "reference": "b174585d1fe49ceed21928a945138948cb394600", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-09-13T08:41:34+00:00" - }, { "name": "dasprid/enum", "version": "1.0.3", @@ -404,20 +331,20 @@ }, { "name": "doctrine/dbal", - "version": "3.2.1", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "4caf37acf14b513a91dd4f087f7eda424fa25542" + "reference": "a4b37db6f186b6843474189b424aed6a7cc5de4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/4caf37acf14b513a91dd4f087f7eda424fa25542", - "reference": "4caf37acf14b513a91dd4f087f7eda424fa25542", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/a4b37db6f186b6843474189b424aed6a7cc5de4b", + "reference": "a4b37db6f186b6843474189b424aed6a7cc5de4b", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.11.99", + "composer-runtime-api": "^2", "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", @@ -428,13 +355,13 @@ "require-dev": { "doctrine/coding-standard": "9.0.0", "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.3.0", + "phpstan/phpstan": "1.4.0", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "9.5.11", "psalm/plugin-phpunit": "0.16.1", "squizlabs/php_codesniffer": "3.6.2", "symfony/cache": "^5.2|^6.0", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0|^6.0", + "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0", "vimeo/psalm": "4.16.1" }, "suggest": { @@ -495,7 +422,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.2.1" + "source": "https://github.com/doctrine/dbal/tree/3.3.0" }, "funding": [ { @@ -511,7 +438,7 @@ "type": "tidelift" } ], - "time": "2022-01-05T08:52:06+00:00" + "time": "2022-01-18T00:13:52+00:00" }, { "name": "doctrine/deprecations", @@ -819,16 +746,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.0", + "version": "v3.3.1", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "63f2a76a045bac6ec93cc2daf2b534b412aa0313" + "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/63f2a76a045bac6ec93cc2daf2b534b412aa0313", - "reference": "63f2a76a045bac6ec93cc2daf2b534b412aa0313", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/be85b3f05b46c39bbc0d95f6c071ddff669510fa", + "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa", "shasum": "" }, "require": { @@ -868,7 +795,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.0" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1" }, "funding": [ { @@ -876,7 +803,7 @@ "type": "github" } ], - "time": "2022-01-14T16:02:05+00:00" + "time": "2022-01-18T15:43:28+00:00" }, { "name": "egulias/email-validator", @@ -1455,16 +1382,16 @@ }, { "name": "laravel/framework", - "version": "v8.79.0", + "version": "v8.80.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "8091f07558ff4a890435ff9d25fa9aca0189ad63" + "reference": "8949a2e46b0f274f39c61eee8d5de1dc6a1f686b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/8091f07558ff4a890435ff9d25fa9aca0189ad63", - "reference": "8091f07558ff4a890435ff9d25fa9aca0189ad63", + "url": "https://api.github.com/repos/laravel/framework/zipball/8949a2e46b0f274f39c61eee8d5de1dc6a1f686b", + "reference": "8949a2e46b0f274f39c61eee8d5de1dc6a1f686b", "shasum": "" }, "require": { @@ -1624,7 +1551,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-01-12T16:12:41+00:00" + "time": "2022-01-18T15:51:42+00:00" }, { "name": "laravel/serializable-closure", diff --git a/flexiapi/composer.phar b/flexiapi/composer.phar index 208773a73cb74970133b9d748d27954c8063bb84..0cd534bfee653d62a4d99d3cd0c21e4fd3ed8f0b 100755 GIT binary patch delta 83010 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�CT(5%?Q-}q`*?KLsFV*uf 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 Str::random(WebAuthenticateController::$emailCodeSize), 'ip_address' => $this->faker->ipv4, 'creation_time' => $this->faker->dateTime, + 'dtmf_protocol' => Account::$dtmfProtocols[array_rand(Account::$dtmfProtocols)], 'activated' => true ]; } diff --git a/flexiapi/database/migrations/2021_10_13_092937_create_contacts_table.php b/flexiapi/database/migrations/2021_10_13_092937_create_contacts_table.php index d22c967..4aa9f77 100644 --- a/flexiapi/database/migrations/2021_10_13_092937_create_contacts_table.php +++ b/flexiapi/database/migrations/2021_10_13_092937_create_contacts_table.php @@ -3,6 +3,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\DB; class CreateContactsTable extends Migration { @@ -47,7 +48,15 @@ class CreateContactsTable extends Migration ->on('accounts')->onDelete('cascade'); $table->string('key'); $table->string('code'); - $table->string('protocol'); + + /** + * See 2022_01_19_160606_move_protocol_from_account_actions_to_account.php + * SQLite can't handle the migration in the testing pipeline, so we must + * prevent the column to be created in the first place + **/ + if (DB::getDriverName() !== 'sqlite') { + $table->string('protocol'); + } $table->timestamps(); }); } diff --git a/flexiapi/database/migrations/2022_01_19_160606_move_protocol_from_account_actions_to_account.php b/flexiapi/database/migrations/2022_01_19_160606_move_protocol_from_account_actions_to_account.php new file mode 100644 index 0000000..199ed8a --- /dev/null +++ b/flexiapi/database/migrations/2022_01_19_160606_move_protocol_from_account_actions_to_account.php @@ -0,0 +1,36 @@ +string('dtmf_protocol')->nullable(); + }); + + // See 2021_10_13_092937_create_contacts_table.php + Schema::table('account_actions', function (Blueprint $table) { + if (DB::getDriverName() !== 'sqlite') { + $table->dropColumn('protocol'); + } + }); + } + + public function down() + { + Schema::table('accounts', function (Blueprint $table) { + if (DB::getDriverName() !== 'sqlite') { + $table->dropColumn('dtmf_protocol'); + } + }); + + Schema::table('account_actions', function (Blueprint $table) { + $table->string('protocol'); + }); + } +} diff --git a/flexiapi/resources/views/admin/account/action/create_edit.blade.php b/flexiapi/resources/views/admin/account/action/create_edit.blade.php index 7370897..9bcc766 100644 --- a/flexiapi/resources/views/admin/account/action/create_edit.blade.php +++ b/flexiapi/resources/views/admin/account/action/create_edit.blade.php @@ -37,10 +37,6 @@ {!! Form::label('code', 'Code') !!} {!! Form::text('code', $action->code, ['class' => 'form-control', 'placeholder' => '12ab45']); !!} -
- {!! Form::label('protocol', 'Protocol') !!} - {!! Form::select('protocol', $protocols, $action->protocol, ['class' => 'form-control']); !!} -
{!! Form::submit(($action->id) ? 'Update' : 'Create', ['class' => 'btn btn-success btn-centered']) !!} diff --git a/flexiapi/resources/views/admin/account/create_edit.blade.php b/flexiapi/resources/views/admin/account/create_edit.blade.php index 0110701..1d9abf3 100644 --- a/flexiapi/resources/views/admin/account/create_edit.blade.php +++ b/flexiapi/resources/views/admin/account/create_edit.blade.php @@ -43,7 +43,7 @@
@
- {!! Form::text('username', $account->domain ?? config('app.sip_domain'), ['class' => 'form-control', 'placeholder' => 'domain.com', 'required' => 'required']); !!} + {!! Form::text('domain', $account->domain ?? config('app.sip_domain'), ['class' => 'form-control', 'placeholder' => 'domain.com', 'required' => 'required']); !!} @else
@ {{ config('app.sip_domain') }} @@ -70,6 +70,7 @@

Optional

+
{!! Form::label('email', 'Email') !!} {!! Form::email('email', $account->email, ['class' => 'form-control', 'placeholder' => 'Email']); !!} @@ -84,6 +85,11 @@ {!! Form::label('phone', 'Phone') !!} {!! Form::text('phone', $account->phone, ['class' => 'form-control', 'placeholder' => '+12123123']); !!}
+ +
+ {!! Form::label('dtmf_protocol', 'DTMF Protocol') !!} + {!! Form::select('dtmf_protocol', $protocols, $account->dtmf_protocol, ['class' => 'form-control']); !!} +
{!! Form::submit(($account->id) ? 'Update' : 'Create', ['class' => 'btn btn-success btn-centered']) !!} diff --git a/flexiapi/resources/views/admin/account/show.blade.php b/flexiapi/resources/views/admin/account/show.blade.php index 217f8e0..47724ba 100644 --- a/flexiapi/resources/views/admin/account/show.blade.php +++ b/flexiapi/resources/views/admin/account/show.blade.php @@ -20,6 +20,7 @@ Id: {{ $account->id }}
Identifier: {{ $account->identifier }}
Email: {{ $account->email }}
+ DTMF Protocol: @if ($account->dtmf_protocol) {{ $account->resolvedDtmfProtocol }}@endif
@if ($account->alias)Phone number: {{ $account->phone }}
@endif @if ($account->display_name)Display name: {{ $account->display_name }}
@endif

@@ -63,13 +64,14 @@

Actions

+@if (!$account->dtmf_protocol) + @foreach ($account->actions as $action) -
{{ $action->key }} {{ $action->code }}{{ $action->resolvedProtocol }} Edit Delete @@ -81,6 +83,10 @@ Add +@else +

To manage actions, you must configure the DTMF protocol in the account settings.

+@endif +

Types

diff --git a/flexiapi/resources/views/api/documentation_markdown.blade.php b/flexiapi/resources/views/api/documentation_markdown.blade.php index 443a86a..1642717 100644 --- a/flexiapi/resources/views/api/documentation_markdown.blade.php +++ b/flexiapi/resources/views/api/documentation_markdown.blade.php @@ -82,6 +82,7 @@ JSON parameters: * `algorithm` required, values can be `SHA-256` or `MD5` * `domain` **not configurable except during test deployments** the value is enforced to the default registration domain set in the global configuration * `token` the unique token +* `dtmf_protocol` optional, values must be `sipinfo` or `rfc2833` #### `GET /accounts/{sip}/info` Retrieve public information about the account. @@ -179,6 +180,7 @@ The `domain` field is taken into account ONLY when `app.admins_manage_multi_doma * `display_name` optional, string * `admin` optional, a boolean, set to `false` by default, create an admin account * `phone` optional, a phone number, set a phone number to the account +* `dtmf_protocol` optional, values must be `sipinfo` or `rfc2833` * `confirmation_key_expires` optional, a datetime of this format: Y-m-d H:i:s. Only used when `activated` is not used or `false`. Enforces an expiration date on the returned `confirmation_key`. After that datetime public email or phone activation endpoints will return `403`. #### `GET /accounts` @@ -212,6 +214,8 @@ Remove a contact from the list. ### Account Actions +The following endpoints will return `403 Forbidden` if the requested account doesn't have a DTMF protocol configured. + #### `GET /accounts/{id}/actions/` Show an account related actions. @@ -225,7 +229,6 @@ JSON parameters: * `key` required, alpha numeric with dashes, lowercase * `code` required, alpha numeric, lowercase -* `protocol` required, values must be `sipinfo` or `rfc2833` #### `PUT /accounts/{id}/actions/{action_id}` Create an account action. @@ -234,7 +237,6 @@ JSON parameters: * `key` required, alpha numeric with dashes, lowercase * `code` required, alpha numeric, lowercase -* `protocol` required, values must be `sipinfo` or `rfc2833` #### `DELETE /accounts/{id}/actions/{action_id}` Delete an account related action. @@ -311,5 +313,26 @@ Return the same base content as the previous URL and the account related informa ### `GET /contacts/vcard` Return the authenticated user contacts list, in [vCard 4.0 format](https://datatracker.ietf.org/doc/html/rfc6350). +Here is the format of the vCard list returned by the endpoint: + +``` + BEGIN:VCARD + VERSION:4.0 + KIND:individual + IMPP:sip:schoen.tatyana@sip.linphone.org + FN:schoen.tatyana@sip.linphone.org + X-LINPHONE-ACCOUNT-DTMF-PROTOCOL:SIPInfo + X-LINPHONE-ACCOUNT-TYPE:phone + X-LINPHONE-ACCOUNT-ACTION:action_key;123 + END:VCARD + BEGIN:VCARD + VERSION:4.0 + KIND:individual + IMPP:sip:dhand@sip.linphone.org + FN:dhand@sip.linphone.org + X-LINPHONE-ACCOUNT-DTMF-PROTOCOL:SIPInfo + END:VCARD +``` + ### `GET /contacts/vcard/{sip}` Return a specific user authenticated contact, in [vCard 4.0 format](https://datatracker.ietf.org/doc/html/rfc6350). \ No newline at end of file diff --git a/flexiapi/tests/Feature/AccountActionTest.php b/flexiapi/tests/Feature/AccountActionTest.php index b0bbd9b..bb74a3f 100644 --- a/flexiapi/tests/Feature/AccountActionTest.php +++ b/flexiapi/tests/Feature/AccountActionTest.php @@ -43,8 +43,7 @@ class AccountActionTest extends TestCase $this->keyAuthenticated($admin->account) ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ 'key' => '123', - 'code' => '123', - 'protocol' => 'sipinfo' + 'code' => '123' ]) ->assertStatus(201); @@ -53,17 +52,7 @@ class AccountActionTest extends TestCase // Missing key $this->keyAuthenticated($admin->account) ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ - 'code' => '123', - 'protocol' => 'sipinfo' - ]) - ->assertStatus(422); - - // Invalid protocol - $this->keyAuthenticated($admin->account) - ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ - 'key' => 'abc1234', - 'code' => '123', - 'protocol' => 'wrong' + 'code' => '123' ]) ->assertStatus(422); @@ -71,8 +60,7 @@ class AccountActionTest extends TestCase $this->keyAuthenticated($admin->account) ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ 'key' => 'Abc1234', - 'code' => '123', - 'protocol' => 'wrong' + 'code' => '123' ]) ->assertStatus(422); @@ -81,10 +69,29 @@ class AccountActionTest extends TestCase ->assertJson([ [ 'key' => '123', - 'code' => '123', - 'protocol' => 'sipinfo' + 'code' => '123' ] ]); + + // No protocol + $password->account->dtmf_protocol = null; + $password->account->save(); + + $this->keyAuthenticated($admin->account) + ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ + 'key' => 'abc1234', + 'code' => '123' + ]) + ->assertStatus(403); + + $this->keyAuthenticated($admin->account) + ->get($this->route.'/'.$password->account->id.'/actions') + ->assertStatus(403); + + $this->keyAuthenticated($admin->account) + ->get($this->route.'/'.$password->account->id) + ->assertStatus(200) + ->assertJsonPath('actions', []); } public function testDelete() diff --git a/flexiapi/tests/Feature/AccountContactsTest.php b/flexiapi/tests/Feature/AccountContactsTest.php index e31ed5c..0085b24 100644 --- a/flexiapi/tests/Feature/AccountContactsTest.php +++ b/flexiapi/tests/Feature/AccountContactsTest.php @@ -121,13 +121,15 @@ class AccountContactTest extends TestCase ->get('/contacts/vcard') ->assertStatus(200) ->assertSeeText($typeKey) - ->assertSeeText($actionKey.';'.$actionCode.';'.$actionProtocol); + ->assertSeeText($password2->dtmf_protocol) + ->assertSeeText($actionKey.';'.$actionCode); $this->keyAuthenticated($password1->account) ->get('/contacts/vcard/'.$password2->account->identifier) ->assertStatus(200) ->assertSeeText($typeKey) - ->assertSeeText($actionKey.';'.$actionCode.';'.$actionProtocol); + ->assertSeeText($password2->dtmf_protocol) + ->assertSeeText($actionKey.';'.$actionCode); $this->keyAuthenticated($password1->account) ->get($this->route.'/me/contacts/'.$password2->account->identifier) diff --git a/flexisip-account-manager.spec b/flexisip-account-manager.spec index 725fbd0..daea546 100644 --- a/flexisip-account-manager.spec +++ b/flexisip-account-manager.spec @@ -8,7 +8,7 @@ #%define _datadir %{_datarootdir} #%define _docdir %{_datadir}/doc -%define build_number 123 +%define build_number 124 %define var_dir /var/opt/belledonne-communications %define opt_dir /opt/belledonne-communications/share/flexisip-account-manager