From 0d399503c48f00fc5c957e068c4b1a866df8bed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Mon, 10 Jun 2024 13:49:42 +0000 Subject: [PATCH] Fix FLEXIAPI-181 Replace APP_ADMINS_MANAGE_MULTI_DOMAINS with APP_SUPER_ADMINS_SIP_DOMAINS --- CHANGELOG.md | 1 + flexiapi/.env.example | 2 +- flexiapi/app/Account.php | 19 ++++++++- flexiapi/app/Helpers/Utils.php | 3 +- .../Controllers/Account/AccountController.php | 2 +- .../Account/AuthenticateController.php | 2 +- .../Admin/StatisticsController.php | 3 +- .../app/Libraries/StatisticsGraphFactory.php | 7 ++-- flexiapi/composer.lock | 40 +++++++++---------- flexiapi/config/app.php | 7 +--- flexiapi/public/css/style.css | 4 ++ .../views/admin/account/create_edit.blade.php | 2 +- .../views/admin/account/index.blade.php | 18 ++------- .../parts/forms/select_domain.blade.php | 16 ++++++++ .../contacts_list/contacts/add.blade.php | 14 +------ .../admin/contacts_list/create_edit.blade.php | 14 +------ .../admin/statistics/parts/filters.blade.php | 17 +------- .../admin/statistics/show_call_logs.blade.php | 17 +------- .../api/documentation_markdown.blade.php | 4 +- .../resources/views/layouts/main.blade.php | 10 ++++- flexiapi/routes/web.php | 2 +- flexiapi/tests/Feature/ApiAccountTest.php | 7 ++-- 22 files changed, 94 insertions(+), 117 deletions(-) create mode 100644 flexiapi/resources/views/admin/account/parts/forms/select_domain.blade.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 2de8144..8d0edd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ v1.5 ---- +- Fix FLEXIAPI-181 Replace APP_ADMINS_MANAGE_MULTI_DOMAINS with APP_SUPER_ADMINS_SIP_DOMAINS - Fix FLEXIAPI-180 Fix the token and activation flow for the provisioning with token endpoint when the header is missing - Fix FLEXIAPI-179 Add Localization support as a Middleware that handles Accept-Language HTTP header - Fix FLEXIAPI-178 Show the unused code in the Activity tab of the accounts in the admin panel diff --git a/flexiapi/.env.example b/flexiapi/.env.example index ab60b93..42f8e7c 100644 --- a/flexiapi/.env.example +++ b/flexiapi/.env.example @@ -4,6 +4,7 @@ APP_KEY= APP_DEBUG=false APP_URL=http://localhost APP_SIP_DOMAIN=sip.example.com +APP_SUPER_ADMINS_SIP_DOMAINS= # A comma separated list of sip domains that has their admins super admins APP_LINPHONE_DAEMON_UNIX_PATH= APP_FLEXISIP_PUSHER_PATH= @@ -15,7 +16,6 @@ APP_API_ACCOUNT_CREATION_TOKEN_RETRY_MINUTES=60 # Number of minutes between two APP_ALLOW_PHONE_NUMBER_USERNAME_ADMIN_API=false # Allow phone numbers to be set as username in admin account creation endpoints # Risky toggles -APP_ADMINS_MANAGE_MULTI_DOMAINS=false # Allow admins to handle all the accounts in the database APP_DANGEROUS_ENDPOINTS=false # Enable some dangerous endpoints used for XMLRPC like fallback usage # SIP server parameters diff --git a/flexiapi/app/Account.php b/flexiapi/app/Account.php index a78bf65..ccb2494 100644 --- a/flexiapi/app/Account.php +++ b/flexiapi/app/Account.php @@ -68,7 +68,7 @@ class Account extends Authenticatable protected static function booted() { static::addGlobalScope('domain', function (Builder $builder) { - if (Auth::hasUser() && Auth::user()->admin && config('app.admins_manage_multi_domains')) { + if (Auth::hasUser() && Auth::user()->superAdmin) { return; } @@ -321,6 +321,23 @@ class Account extends Authenticatable return self::$dtmfProtocols[$this->attributes['dtmf_protocol']]; } + public function getSuperAdminAttribute(): bool + { + $domains = config('app.super_admins_sip_domains'); + + if (empty($domains)) { + return false; + } + + $domains = explode(',', $domains); + + if (empty($domains)) { + return false; + } + + return $this->admin && in_array($this->domain, $domains); + } + /** * Utils */ diff --git a/flexiapi/app/Helpers/Utils.php b/flexiapi/app/Helpers/Utils.php index 0c4293d..2ac428e 100644 --- a/flexiapi/app/Helpers/Utils.php +++ b/flexiapi/app/Helpers/Utils.php @@ -111,8 +111,7 @@ function resolveDomain(Request $request): string { return $request->has('domain') && $request->user() - && $request->user()->admin - && config('app.admins_manage_multi_domains') + && $request->user()->superAdmin ? $request->get('domain') : config('app.sip_domain'); } diff --git a/flexiapi/app/Http/Controllers/Account/AccountController.php b/flexiapi/app/Http/Controllers/Account/AccountController.php index db7c9c05..01ca377 100644 --- a/flexiapi/app/Http/Controllers/Account/AccountController.php +++ b/flexiapi/app/Http/Controllers/Account/AccountController.php @@ -40,7 +40,7 @@ class AccountController extends Controller return view('account.blocked'); } - public function panel(Request $request) + public function dashboard(Request $request) { return view('account.dashboard', [ 'account' => $request->user() diff --git a/flexiapi/app/Http/Controllers/Account/AuthenticateController.php b/flexiapi/app/Http/Controllers/Account/AuthenticateController.php index 17b6f15..8f90ff9 100644 --- a/flexiapi/app/Http/Controllers/Account/AuthenticateController.php +++ b/flexiapi/app/Http/Controllers/Account/AuthenticateController.php @@ -33,7 +33,7 @@ class AuthenticateController extends Controller public function login(Request $request) { - if (auth()->user()) { + if (Auth::user()) { return redirect()->route('account.dashboard'); } diff --git a/flexiapi/app/Http/Controllers/Admin/StatisticsController.php b/flexiapi/app/Http/Controllers/Admin/StatisticsController.php index e32f995..9a45fa6 100644 --- a/flexiapi/app/Http/Controllers/Admin/StatisticsController.php +++ b/flexiapi/app/Http/Controllers/Admin/StatisticsController.php @@ -27,6 +27,7 @@ use App\Http\Controllers\Controller; use App\Libraries\StatisticsGraphFactory; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class StatisticsController extends Controller { @@ -65,7 +66,7 @@ class StatisticsController extends Controller return $graph->export(); } - if (config('app.admins_manage_multi_domains')) { + if (Auth::user()?->superAdmin) { switch ($type) { case 'messages': $domains = StatisticsMessage::groupBy('from_domain')->pluck('from_domain'); diff --git a/flexiapi/app/Libraries/StatisticsGraphFactory.php b/flexiapi/app/Libraries/StatisticsGraphFactory.php index 1e2a14a..9b2b3de 100644 --- a/flexiapi/app/Libraries/StatisticsGraphFactory.php +++ b/flexiapi/app/Libraries/StatisticsGraphFactory.php @@ -26,6 +26,7 @@ use Carbon\Carbon; use Carbon\CarbonInterval; use Carbon\CarbonPeriod; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; @@ -56,7 +57,7 @@ class StatisticsGraphFactory $fromQuery = StatisticsMessage::query(); $toQuery = StatisticsMessage::query(); - if (!config('app.admins_manage_multi_domains')) { + if (!Auth::user()?->isAdmin) { $fromQuery->where('from_domain', config('app.sip_domain')); $toQuery->toDomain($this->domain); } elseif ($this->domain) { @@ -88,7 +89,7 @@ class StatisticsGraphFactory $fromQuery = StatisticsCall::query(); $toQuery = StatisticsCall::query(); - if (!config('app.admins_manage_multi_domains')) { + if (!Auth::user()?->superAdmin) { $fromQuery->where('from_domain', config('app.sip_domain')); $toQuery->where('to_domain', config('app.sip_domain')); } elseif ($this->domain) { @@ -125,7 +126,7 @@ class StatisticsGraphFactory // Accounts doesn't have a from and to $this->domain = $this->domain ?? $this->fromDomain; - if (!config('app.admins_manage_multi_domains')) { + if (!Auth::user()?->isAdmin) { $this->data->where('domain', config('app.sip_domain')); } elseif ($this->domain) { $this->data->where('domain', $this->domain); diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index cb5a3ad..b7e2043 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -2921,16 +2921,16 @@ }, { "name": "nesbot/carbon", - "version": "2.72.3", + "version": "2.72.5", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", - "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed", "shasum": "" }, "require": { @@ -2964,8 +2964,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" }, "laravel": { "providers": [ @@ -3024,7 +3024,7 @@ "type": "tidelift" } ], - "time": "2024-01-25T10:35:09+00:00" + "time": "2024-06-03T19:18:41+00:00" }, { "name": "nette/schema", @@ -4508,16 +4508,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.3", + "version": "v0.12.4", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", - "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", + "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", "shasum": "" }, "require": { @@ -4581,9 +4581,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" }, - "time": "2024-04-02T15:57:53+00:00" + "time": "2024-06-10T01:18:23+00:00" }, { "name": "ralouphie/getallheaders", @@ -5618,20 +5618,20 @@ }, { "name": "scyllaly/hcaptcha", - "version": "4.4.5", + "version": "4.4.6", "source": { "type": "git", "url": "https://github.com/Scyllaly/hcaptcha.git", - "reference": "3c133dfe684d34570e911de11098ebaa0d2c369d" + "reference": "5b7d5ec5430014bbf2b44831cef3ddf9d3ded451" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Scyllaly/hcaptcha/zipball/3c133dfe684d34570e911de11098ebaa0d2c369d", - "reference": "3c133dfe684d34570e911de11098ebaa0d2c369d", + "url": "https://api.github.com/repos/Scyllaly/hcaptcha/zipball/5b7d5ec5430014bbf2b44831cef3ddf9d3ded451", + "reference": "5b7d5ec5430014bbf2b44831cef3ddf9d3ded451", "shasum": "" }, "require": { - "illuminate/support": "5.*|6.*|7.*|8.*|^9.0|10.*", + "illuminate/support": "5.*|6.*|7.*|8.*|^9.0|10.*|^11.0", "php": ">=5.5.5" }, "require-dev": { @@ -5671,9 +5671,9 @@ ], "support": { "issues": "https://github.com/Scyllaly/hcaptcha/issues", - "source": "https://github.com/Scyllaly/hcaptcha/tree/4.4.5" + "source": "https://github.com/Scyllaly/hcaptcha/tree/4.4.6" }, - "time": "2023-03-14T16:36:21+00:00" + "time": "2024-06-08T15:55:53+00:00" }, { "name": "sebastian/cli-parser", diff --git a/flexiapi/config/app.php b/flexiapi/config/app.php index c16f767..6208f94 100644 --- a/flexiapi/config/app.php +++ b/flexiapi/config/app.php @@ -15,6 +15,7 @@ return [ 'name' => env('APP_NAME', 'Account Manager'), 'sip_domain' => env('APP_SIP_DOMAIN', 'sip.domain.com'), + 'super_admins_sip_domains' => env('APP_SUPER_ADMINS_SIP_DOMAINS', ''), 'project_url' => env('APP_PROJECT_URL', ''), 'terms_of_use_url' => env('TERMS_OF_USE_URL', ''), @@ -72,12 +73,6 @@ return [ */ 'realm' => env('ACCOUNT_REALM', null), - /** - * Allow admins to handle all the accounts in the database - * ENABLE IT AT YOUR OWN RISKS IN PRODUCTION - */ - 'admins_manage_multi_domains' => env('APP_ADMINS_MANAGE_MULTI_DOMAINS', false), - /** * /!\ Enable dangerous endpoints required for fallback */ diff --git a/flexiapi/public/css/style.css b/flexiapi/public/css/style.css index df0cce0..9caaebc 100644 --- a/flexiapi/public/css/style.css +++ b/flexiapi/public/css/style.css @@ -330,6 +330,10 @@ header nav a.oppose~a.oppose { margin-left: 0; } +header nav span.badge { + margin-left: 1rem; +} + @media screen and (max-width: 800px) { header nav { padding: 1rem; diff --git a/flexiapi/resources/views/admin/account/create_edit.blade.php b/flexiapi/resources/views/admin/account/create_edit.blade.php index 4adb9b2..0c3056e 100644 --- a/flexiapi/resources/views/admin/account/create_edit.blade.php +++ b/flexiapi/resources/views/admin/account/create_edit.blade.php @@ -45,7 +45,7 @@ @include('parts.errors', ['name' => 'username'])
- user()?->superAdmin) required @else disabled @endif name="domain" type="text" value="{{ $account->domain ?? config('app.sip_domain') }}" @if ($account->id) readonly @endif> diff --git a/flexiapi/resources/views/admin/account/index.blade.php b/flexiapi/resources/views/admin/account/index.blade.php index 64b1cb1..1f306d3 100644 --- a/flexiapi/resources/views/admin/account/index.blade.php +++ b/flexiapi/resources/views/admin/account/index.blade.php @@ -35,19 +35,7 @@
-
- - -
+ @include('admin.account.parts.forms.select_domain')
+ + @foreach ($domains as $d) + + @endforeach + + +
+@endif diff --git a/flexiapi/resources/views/admin/contacts_list/contacts/add.blade.php b/flexiapi/resources/views/admin/contacts_list/contacts/add.blade.php index 50f7199..069a968 100644 --- a/flexiapi/resources/views/admin/contacts_list/contacts/add.blade.php +++ b/flexiapi/resources/views/admin/contacts_list/contacts/add.blade.php @@ -35,19 +35,7 @@ value="{{ request()->get('search', '') }}"> -
- - -
+ @include('admin.account.parts.forms.select_domain')
Reset diff --git a/flexiapi/resources/views/admin/contacts_list/create_edit.blade.php b/flexiapi/resources/views/admin/contacts_list/create_edit.blade.php index 84137eb..dd81f81 100644 --- a/flexiapi/resources/views/admin/contacts_list/create_edit.blade.php +++ b/flexiapi/resources/views/admin/contacts_list/create_edit.blade.php @@ -73,19 +73,7 @@ value="{{ request()->get('search', '') }}">
-
- - -
+ @include('admin.account.parts.forms.select_domain')
Reset diff --git a/flexiapi/resources/views/admin/statistics/parts/filters.blade.php b/flexiapi/resources/views/admin/statistics/parts/filters.blade.php index 417c4ce..763a0c0 100644 --- a/flexiapi/resources/views/admin/statistics/parts/filters.blade.php +++ b/flexiapi/resources/views/admin/statistics/parts/filters.blade.php @@ -26,22 +26,7 @@ class="chip @if ($request->get('by', 'day') == 'year') selected @endif">Year
- @if (config('app.admins_manage_multi_domains')) -
- - -
- @endif + @include('admin.account.parts.forms.select_domain')
- - @foreach ($domains as $d) - - @endforeach - - -
- @endif + @include('admin.account.parts.forms.select_domain')