From a3861304cca8c24bb794f9445ecc4ba9e58d715e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Thu, 10 Apr 2025 09:11:26 +0000 Subject: [PATCH] Fix FLEXIAPI-284 Add configurable admin API Keys --- CHANGELOG.md | 1 + flexiapi/app/Account.php | 9 +- flexiapi/app/ApiKey.php | 6 +- .../Commands/Accounts/ClearApiKeys.php | 38 +++++--- .../Commands/Accounts/CreateAdminAccount.php | 2 +- .../Controllers/Account/ApiKeyController.php | 2 +- .../Controllers/Admin/ApiKeyController.php | 95 +++++++++++++++++++ .../Api/Account/ApiKeyController.php | 4 +- .../factories/EmailChangeCodeFactory.php | 2 +- .../factories/PhoneChangeCodeFactory.php | 2 +- ...5_04_08_134915_complete_api_keys_table.php | 37 ++++++++ flexiapi/lang/fr.json | 9 +- flexiapi/public/css/form.css | 14 --- flexiapi/public/css/style.css | 41 ++++++-- .../resources/views/account/api_key.blade.php | 4 +- .../views/account/dashboard.blade.php | 2 +- .../admin/account/activity/index.blade.php | 14 +-- .../views/admin/account/index.blade.php | 25 +++-- .../views/admin/api_key/create.blade.php | 40 ++++++++ .../views/admin/api_key/delete.blade.php | 32 +++++++ .../views/admin/api_key/index.blade.php | 53 +++++++++++ .../admin/contacts_list/delete.blade.php | 2 +- .../views/admin/parts/settings_tabs.blade.php | 13 +++ .../views/admin/phone_country/index.blade.php | 36 ++++--- .../views/admin/space/index.blade.php | 18 ++-- .../resources/views/parts/sidebar.blade.php | 2 +- flexiapi/routes/web.php | 31 +++--- .../tests/Feature/AccountBlockingTest.php | 6 +- .../tests/Feature/AccountProvisioningTest.php | 20 ++-- .../tests/Feature/ApiAccountActionTest.php | 6 +- .../tests/Feature/ApiAccountApiKeyTest.php | 4 +- .../tests/Feature/ApiAccountContactsTest.php | 4 +- .../Feature/ApiAccountCreationTokenTest.php | 4 +- .../Feature/ApiAccountDictionaryTest.php | 2 +- .../Feature/ApiAccountEmailChangeTest.php | 10 +- .../Feature/ApiAccountExternalAccountTest.php | 2 +- .../tests/Feature/ApiAccountMessageTest.php | 2 +- .../Feature/ApiAccountPhoneChangeTest.php | 10 +- flexiapi/tests/Feature/ApiAccountTest.php | 42 ++++---- flexiapi/tests/Feature/ApiAccountTypeTest.php | 8 +- .../Feature/ApiAccountVcardsStorageTest.php | 4 +- .../tests/Feature/ApiAuthenticationTest.php | 2 +- .../tests/Feature/ApiLocalizationTest.php | 2 +- .../tests/Feature/ApiPhoneCountryTest.php | 2 +- .../tests/Feature/ApiPushNotificationTest.php | 2 +- .../tests/Feature/ApiSpaceEmailServerTest.php | 2 +- flexiapi/tests/Feature/ApiSpaceTest.php | 6 +- .../Feature/ApiSpaceWithMiddlewareTest.php | 4 +- flexiapi/tests/Feature/ApiStatisticsTest.php | 4 +- 49 files changed, 503 insertions(+), 179 deletions(-) create mode 100644 flexiapi/app/Http/Controllers/Admin/ApiKeyController.php create mode 100644 flexiapi/database/migrations/2025_04_08_134915_complete_api_keys_table.php create mode 100644 flexiapi/resources/views/admin/api_key/create.blade.php create mode 100644 flexiapi/resources/views/admin/api_key/delete.blade.php create mode 100644 flexiapi/resources/views/admin/api_key/index.blade.php create mode 100644 flexiapi/resources/views/admin/parts/settings_tabs.blade.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 6282944..7a59c7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ v1.7 - Fix FLEXIAPI-233 Add External Accounts (new version) - Fix FLEXIAPI-277 Restrict authorized ini keys that can be set to prevent conflict with the existing ones set in the UI - Fix FLEXIAPI-272 Add Space based email server integration +- Fix FLEXIAPI-284 Add configurable admin API Keys v1.6 ---- diff --git a/flexiapi/app/Account.php b/flexiapi/app/Account.php index 3996474..1bde2c6 100644 --- a/flexiapi/app/Account.php +++ b/flexiapi/app/Account.php @@ -118,7 +118,12 @@ class Account extends Authenticatable public function apiKey() { - return $this->hasOne(ApiKey::class); + return $this->hasOne(ApiKey::class)->whereNull('expires_after_last_used_minutes'); + } + + public function adminApiKeys() + { + return $this->hasMany(ApiKey::class)->whereNotNull('expires_after_last_used_minutes'); } public function external() @@ -352,7 +357,7 @@ class Account extends Authenticatable return ($this->activationExpiration && $this->activationExpiration->isExpired()); } - public function generateApiKey(?string $ip = null): ApiKey + public function generateUserApiKey(?string $ip = null): ApiKey { $this->apiKey()->delete(); diff --git a/flexiapi/app/ApiKey.php b/flexiapi/app/ApiKey.php index 8bb3045..241d7ee 100644 --- a/flexiapi/app/ApiKey.php +++ b/flexiapi/app/ApiKey.php @@ -28,8 +28,12 @@ class ApiKey extends Model protected $table = 'api_keys'; + protected $casts = [ + 'last_used_at' => 'datetime', + ]; + public function account() { - return $this->belongsTo(Account::class); + return $this->belongsTo(Account::class)->withoutGlobalScopes(); } } diff --git a/flexiapi/app/Console/Commands/Accounts/ClearApiKeys.php b/flexiapi/app/Console/Commands/Accounts/ClearApiKeys.php index e7ef164..716a96b 100644 --- a/flexiapi/app/Console/Commands/Accounts/ClearApiKeys.php +++ b/flexiapi/app/Console/Commands/Accounts/ClearApiKeys.php @@ -27,15 +27,11 @@ use App\ApiKey; class ClearApiKeys extends Command { protected $signature = 'accounts:clear-api-keys {minutes?}'; - protected $description = 'Clear the expired API Keys after n minutes'; - - public function __construct() - { - parent::__construct(); - } + protected $description = 'Clear the expired user API Keys after n minutes and clear the other expired admin keys'; public function handle() { + // User API Keys $minutes = $this->argument('minutes') ?? config('app.api_key_expiration_minutes'); if ($minutes == 0) { @@ -43,14 +39,30 @@ class ClearApiKeys extends Command return 0; } - $this->info('Deleting api keys unused after ' . $minutes . ' minutes'); + $this->info('Deleting user API Keys unused after ' . $minutes . ' minutes'); - $count = ApiKey::where( - 'last_used_at', - '<', - Carbon::now()->subMinutes($minutes)->toDateTimeString() - )->delete(); + $count = ApiKey::whereNull('expires_after_last_used_minutes') + ->where('last_used_at', '<', Carbon::now()->subMinutes($minutes)->toDateTimeString()) + ->delete(); - $this->info($count . ' api keys deleted'); + $this->info($count . ' user API Keys deleted'); + + // Admin API Keys + $keys = ApiKey::whereNotNull('expires_after_last_used_minutes') + ->where('expires_after_last_used_minutes', '>', 0) + ->with('account') + ->get(); + + $count = 0; + + foreach ($keys as $key) { + if ($key->last_used_at->addMinutes($key->expires_after_last_used_minutes)->isPast()) { + $this->info('Deleting ' . $key->account->identifier . ' admin API Key expired after ' . $key->expires_after_last_used_minutes .'min'); + $key->delete(); + $count++; + } + } + + $this->info($count . ' admin API Keys deleted'); } } diff --git a/flexiapi/app/Console/Commands/Accounts/CreateAdminAccount.php b/flexiapi/app/Console/Commands/Accounts/CreateAdminAccount.php index 5b1ebd8..fc74c29 100644 --- a/flexiapi/app/Console/Commands/Accounts/CreateAdminAccount.php +++ b/flexiapi/app/Console/Commands/Accounts/CreateAdminAccount.php @@ -90,7 +90,7 @@ class CreateAdminAccount extends Command $account->created_at = Carbon::now()->subYears(3); $account->save(); - $account->generateApiKey(ip: $this->option('api_key_ip') ?? null); + $account->generateUserApiKey(ip: $this->option('api_key_ip') ?? null); $account->updatePassword($password); $this->info('Admin test account created: "' . $username . '@' . $domain . '" | Password: "' . $password . '" | API Key: "' . $account->apiKey->key . '" (valid on ' . ($account->apiKey->ip ?? 'any') . ' ip)'); diff --git a/flexiapi/app/Http/Controllers/Account/ApiKeyController.php b/flexiapi/app/Http/Controllers/Account/ApiKeyController.php index 381dddb..da883d8 100644 --- a/flexiapi/app/Http/Controllers/Account/ApiKeyController.php +++ b/flexiapi/app/Http/Controllers/Account/ApiKeyController.php @@ -34,7 +34,7 @@ class ApiKeyController extends Controller public function update(Request $request) { $account = $request->user(); - $account->generateApiKey($request->ip()); + $account->generateUserApiKey($request->ip()); return redirect()->back(); } diff --git a/flexiapi/app/Http/Controllers/Admin/ApiKeyController.php b/flexiapi/app/Http/Controllers/Admin/ApiKeyController.php new file mode 100644 index 0000000..049b450 --- /dev/null +++ b/flexiapi/app/Http/Controllers/Admin/ApiKeyController.php @@ -0,0 +1,95 @@ +. +*/ + +namespace App\Http\Controllers\Admin; + +use App\ApiKey; +use App\Http\Controllers\Controller; + +use Illuminate\Http\Request; +use Illuminate\Support\Str; +use Carbon\Carbon; + +class ApiKeyController extends Controller +{ + public function index(Request $request) + { + return view('admin.api_key.index', [ + 'api_keys' => $this->getApiKeysQuery($request)->with('account')->get() + ]); + } + + public function create(Request $request) + { + return view('admin.api_key.create', [ + 'account' => $request->user() + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|min:3', + 'expires_after_last_used_minutes' => 'integer|min:0' + ]); + + $apiKey = new ApiKey; + $apiKey->account_id = $request->user()->id; + $apiKey->name = $request->get('name'); + $apiKey->expires_after_last_used_minutes = $request->get('expires_after_last_used_minutes'); + $apiKey->last_used_at = Carbon::now(); + $apiKey->key = Str::random(40); + $apiKey->save(); + + return redirect()->route('admin.api_keys.index'); + } + + public function delete(Request $request, string $key) + { + return view('admin.api_key.delete', [ + 'api_key' => $this->getApiKeysQuery($request)->where('key', $key)->first() + ]); + } + + public function destroy(Request $request) + { + $this->getApiKeysQuery($request)->where('key', $request->get('key'))->delete(); + + return redirect()->route('admin.api_keys.index'); + } + + private function getApiKeysQuery(Request $request) + { + $apiKeys = ApiKey::whereIn('account_id', function ($query) { + $query->select('id') + ->from('accounts') + ->where('admin', true); + })->whereNotNull('expires_after_last_used_minutes'); + + if (!$request->user()->superAdmin) { + $apiKeys->whereIn('account_id', function ($query) use ($request) { + $query->select('id') + ->from('accounts') + ->where('domain', $request->user()->domain); + }); + } + + return $apiKeys; + } +} diff --git a/flexiapi/app/Http/Controllers/Api/Account/ApiKeyController.php b/flexiapi/app/Http/Controllers/Api/Account/ApiKeyController.php index 0a04814..8136a69 100644 --- a/flexiapi/app/Http/Controllers/Api/Account/ApiKeyController.php +++ b/flexiapi/app/Http/Controllers/Api/Account/ApiKeyController.php @@ -29,7 +29,7 @@ class ApiKeyController extends Controller public function generate(Request $request) { $account = $request->user(); - $account->generateApiKey($request->ip()); + $account->generateUserApiKey($request->ip()); $account->refresh(); Cookie::queue('x-api-key', $account->apiKey->key, config('app.api_key_expiration_minutes')); @@ -42,7 +42,7 @@ class ApiKeyController extends Controller $authToken = AuthToken::where('token', $token)->valid()->firstOrFail(); if ($authToken->account) { - $authToken->account->generateApiKey($request->ip()); + $authToken->account->generateUserApiKey($request->ip()); $authToken->account->refresh(); Cookie::queue('x-api-key', $authToken->account->apiKey->key, config('app.api_key_expiration_minutes')); diff --git a/flexiapi/database/factories/EmailChangeCodeFactory.php b/flexiapi/database/factories/EmailChangeCodeFactory.php index 8bb4be4..c5daa05 100644 --- a/flexiapi/database/factories/EmailChangeCodeFactory.php +++ b/flexiapi/database/factories/EmailChangeCodeFactory.php @@ -30,7 +30,7 @@ class EmailChangeCodeFactory extends Factory public function definition() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); return [ 'account_id' => $account->id, diff --git a/flexiapi/database/factories/PhoneChangeCodeFactory.php b/flexiapi/database/factories/PhoneChangeCodeFactory.php index f3da542..c0f8bf2 100644 --- a/flexiapi/database/factories/PhoneChangeCodeFactory.php +++ b/flexiapi/database/factories/PhoneChangeCodeFactory.php @@ -30,7 +30,7 @@ class PhoneChangeCodeFactory extends Factory public function definition() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); return [ 'account_id' => $account->id, diff --git a/flexiapi/database/migrations/2025_04_08_134915_complete_api_keys_table.php b/flexiapi/database/migrations/2025_04_08_134915_complete_api_keys_table.php new file mode 100644 index 0000000..25212ef --- /dev/null +++ b/flexiapi/database/migrations/2025_04_08_134915_complete_api_keys_table.php @@ -0,0 +1,37 @@ +string('name')->nullable(); + $table->integer('expires_after_last_used_minutes')->nullable(); + + if (DB::getDriverName() !== 'sqlite') { + $table->dropForeign(['account_id']); + } + + $table->dropUnique(['account_id']); + + if (DB::getDriverName() !== 'sqlite') { + $table->foreign('account_id')->references('id') + ->on('accounts')->onDelete('cascade'); + } + }); + } + + public function down(): void + { + Schema::table('api_keys', function (Blueprint $table) { + $table->dropColumn('name'); + $table->dropColumn('expires_after_last_used_minutes'); + $table->unique('account_id'); + }); + } +}; + diff --git a/flexiapi/lang/fr.json b/flexiapi/lang/fr.json index f85f6d0..ce903a5 100644 --- a/flexiapi/lang/fr.json +++ b/flexiapi/lang/fr.json @@ -13,6 +13,7 @@ "Activate": "Activer", "Activated": "Activé", "Activity": "Activité", + "Activity expiration delay": "Délais d'expiration après activité", "Add contact": "Ajout d'un contact", "Add contacts": "Ajouter des contacts", "Add": "Ajouter", @@ -24,8 +25,10 @@ "An email will be sent to :email with a unique link allowing the user to reset its password.": "Un email sera envoyé à :email avec un lien unique l'invitant à réinitialiser son mot de passe", "An email will be sent to this email when someone join the newsletter": "Un email sera envoyé à cette addresse quand quelqu'un rejoint la liste de diffusion", "App Configuration": "Configuration de l'App", + "Api Keys": "Clefs d'API", "Assistant": "Assistant", "Blocked": "Bloqué", + "By": "Par", "Calls logs": "Journaux d'appel", "Cancel": "Annuler", "Cannot be changed once created.": "Ne peut être changé par la suite.", @@ -47,7 +50,7 @@ "Copyright text": "Texte droits d'auteurs", "Country code": "Code du pays", "Create": "Créer", - "Created on": "Créé le", + "Created": "Créé", "Currently set": "Actuellement remplit", "Custom entries": "Entrées personnalisées", "Dactivate": "Désactiver", @@ -94,6 +97,7 @@ "Intercom features": "Fonctionnalités d'interphonie", "It might actually disable this page, be careful": "Cette page pourrait être désactivée, faites attention", "Key": "Clef", + "Last used": "Dernière utilisation", "Leave empty to create a root Space.": "Laisser vide si vous souhaitez créer un Espace à la racine", "Login using a QRCode": "S'authentifier avec un QRCode", "Login": "Authentification", @@ -105,6 +109,7 @@ "My Account": "Mon Compte", "My Space": "Mon Espace", "Name": "Nom", + "Never": "Jamais", "Never expire": "N'expire jamais", "New Admin": "Nouvel Admin", "Newsletter registration email address": "Addresse email d'inscription à la liste de diffusion", @@ -113,6 +118,7 @@ "No email yet": "Pas d'email pour le moment", "No limit": "Sans limite", "No phone yet": "Pas de téléphone pour le moment", + "Number of minutes to expire the key after the last request.": "Nombre de minutes avant l'expiration de la clef après son dernier usage.", "Only display usernames (hide SIP addresses)": "N'afficher que les num d'utilisateur (cacher les addresses SIP)", "Other information": "Autres informations", "Outbound proxy": "Outbound proxy", @@ -149,6 +155,7 @@ "Select a file": "Choisir un fichier", "Send an email to the user to reset the password": "Envoyer un email à l'utilisateur pour réinitialiser son mot de passe", "Send": "Envoyer", + "Settings": "Paramètres", "Sip Adress": "Adresse SIP", "SIP Domain": "Domaine SIP", "Space": "Espace", diff --git a/flexiapi/public/css/form.css b/flexiapi/public/css/form.css index 2297532..12474ac 100644 --- a/flexiapi/public/css/form.css +++ b/flexiapi/public/css/form.css @@ -24,8 +24,6 @@ p .btn { } .btn i { - margin-right: 0.5rem; - margin-left: -0.5rem; font-size: 2rem; vertical-align: middle; } @@ -154,18 +152,6 @@ form .disabled:not(a) { } } -form small { - display: block; - font-weight: 300; - color: var(--second-6); - font-size: 1.25rem; - margin-top: 0.25rem; -} - -form small.error { - color: var(--danger-6); -} - form label { color: var(--second-6); font-size: 1.5rem; diff --git a/flexiapi/public/css/style.css b/flexiapi/public/css/style.css index f850e34..3520633 100644 --- a/flexiapi/public/css/style.css +++ b/flexiapi/public/css/style.css @@ -434,10 +434,9 @@ content>nav { width: 20rem; margin-left: 0; padding: 1.5rem; - border-radius: 0 3rem 0 0; - + padding-left: 1rem; padding-bottom: 10rem; - padding-top: 4rem; + border-radius: 0 3rem 0 0; background-size: auto 10rem; background-position: bottom center; background-repeat: repeat-x; @@ -453,13 +452,17 @@ content>nav a { display: flex; align-items: center; line-height: 5rem; - margin: 1rem 0; + margin: 0.5rem 0; position: relative; white-space: nowrap; - padding: 0 1rem; + padding: 0 1.5rem; overflow: hidden; } +content>nav a:first-child { + margin-top: 0; +} + content>nav a.current { background-color: white; border-radius: 4rem; @@ -468,8 +471,7 @@ content>nav a.current { } content>nav a i { - margin-right: 0.75rem; - margin-left: 0.25rem; + margin-right: 1rem; font-size: 2rem; } @@ -610,6 +612,10 @@ h3+p:has(span.badge) { display: inline-block; } +.badge.oppose { + float: right; +} + h3 .badge { margin-left: 1rem; } @@ -659,6 +665,9 @@ table tr th { table tr th { padding: 0 1rem; line-height: 4rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } table tr td.line, @@ -968,3 +977,21 @@ details[open] > summary::before { details > summary:hover { cursor: pointer; } + +/** Small **/ + +small { + display: block; + font-weight: 300; + color: var(--second-6); + font-size: 1.25rem; + margin-top: 0.25rem; +} + +small a { + font-size: 1.25rem; +} + +small.error { + color: var(--danger-6); +} diff --git a/flexiapi/resources/views/account/api_key.blade.php b/flexiapi/resources/views/account/api_key.blade.php index 2513182..01b709d 100644 --- a/flexiapi/resources/views/account/api_key.blade.php +++ b/flexiapi/resources/views/account/api_key.blade.php @@ -21,12 +21,12 @@
- Can only be used from the following ip: {{ $account->apiKey->ip }} | {{ $account->apiKey->requests }} requests + Can only be used from the following ip: {{ $account->apiKey->ip }} | {{ __('Requests ')}} {{ $account->apiKey->requests }}
@endif -
+ @csrf
diff --git a/flexiapi/resources/views/account/dashboard.blade.php b/flexiapi/resources/views/account/dashboard.blade.php index d5cd4b3..27c6b12 100644 --- a/flexiapi/resources/views/account/dashboard.blade.php +++ b/flexiapi/resources/views/account/dashboard.blade.php @@ -51,7 +51,7 @@

key {{ __('API Key') }} - + {{ __('Manage') }}

diff --git a/flexiapi/resources/views/admin/account/activity/index.blade.php b/flexiapi/resources/views/admin/account/activity/index.blade.php index ab90bad..e493d12 100644 --- a/flexiapi/resources/views/admin/account/activity/index.blade.php +++ b/flexiapi/resources/views/admin/account/activity/index.blade.php @@ -20,7 +20,7 @@ {{ __('Code') }} - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} IP {{ __('Requests') }} @@ -54,7 +54,7 @@ {{ __('Code') }} - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} IP @@ -82,7 +82,7 @@ {{ __('Code') }} - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} IP @@ -113,7 +113,7 @@ {{ __('Phone number') }} {{ __('Code') }} - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} IP @@ -145,7 +145,7 @@ {{ __('Email') }} {{ __('Code') }} - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} IP @@ -176,7 +176,7 @@ Token - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} IP @@ -206,7 +206,7 @@ Token - {{ __('Created on') }} + {{ __('Created') }} {{ __('Used on') }} {{ __('Email') }} diff --git a/flexiapi/resources/views/admin/account/index.blade.php b/flexiapi/resources/views/admin/account/index.blade.php index 395c783..eab0e72 100644 --- a/flexiapi/resources/views/admin/account/index.blade.php +++ b/flexiapi/resources/views/admin/account/index.blade.php @@ -63,7 +63,6 @@ @include('parts.column_sort', ['key' => 'username', 'title' => __('Identifier')]) {{ __('Contacts Lists') }} - Badges @include('parts.column_sort', ['key' => 'updated_at', 'title' => __('Updated')]) @@ -79,6 +78,17 @@ {{ $account->identifier }} + @if ($account->activated) + check + @endif + @if ($account->superAdmin) + Super Adm. + @elseif ($account->admin) + Adm. + @endif + @if ($account->blocked) + prohibit + @endif @if ($account->contactsLists->isNotEmpty()) @@ -88,19 +98,6 @@ @endif @endif - - @if ($account->activated) - check - @endif - @if ($account->superAdmin) - Super Adm. - @elseif ($account->admin) - Adm. - @endif - @if ($account->blocked) - prohibit - @endif - {{ $account->updated_at }} @endforeach diff --git a/flexiapi/resources/views/admin/api_key/create.blade.php b/flexiapi/resources/views/admin/api_key/create.blade.php new file mode 100644 index 0000000..62a8be7 --- /dev/null +++ b/flexiapi/resources/views/admin/api_key/create.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.main') + +@section('breadcrumb') + + +@endsection + +@section('content') +
+

key {{ __('Create') }}

+ {{ __('Cancel') }} +
+ + + @csrf + @method('post') +
+ + + @include('parts.errors', ['name' => 'name']) +
+ +
+ + + @include('parts.errors', ['name' => 'expires_after_last_used_minutes']) + {{ __('Number of minutes to expire the key after the last request.') }} {{ __('Unlimited if set to 0') }} +
+ +
+ +
+ +@endsection diff --git a/flexiapi/resources/views/admin/api_key/delete.blade.php b/flexiapi/resources/views/admin/api_key/delete.blade.php new file mode 100644 index 0000000..b930607 --- /dev/null +++ b/flexiapi/resources/views/admin/api_key/delete.blade.php @@ -0,0 +1,32 @@ +@extends('layouts.main') + +@section('breadcrumb') + + +@endsection + +@section('content') +
+

trash {{ __('Delete') }}

+ {{ __('Cancel') }} + +
+ +
+ @csrf + @method('delete') + +
+

{{ __('You are going to permanently delete the following element. Please confirm your action.') }}

+

+ key {{ $api_key->key }} +

+
+ + +
+@endsection diff --git a/flexiapi/resources/views/admin/api_key/index.blade.php b/flexiapi/resources/views/admin/api_key/index.blade.php new file mode 100644 index 0000000..196e830 --- /dev/null +++ b/flexiapi/resources/views/admin/api_key/index.blade.php @@ -0,0 +1,53 @@ +@extends('layouts.main') + +@section('content') +
+

key {{ __('API Keys') }}

+ + plus + {{ __('Create') }} + +
+ + @include('admin.parts.settings_tabs') + + + + + + + + + + + @if ($api_keys->isEmpty()) + + + + @endif + @foreach ($api_keys as $api_key) + + + + + + @endforeach + +
{{ __('Name') }}{{ __('Key') }}{{ __('Created') }}
{{ __('Empty') }}
{{ $api_key->name }} +
+ + {{ __('Requests') }}: {{ $api_key->requests }} + + +
+ {{ $api_key->key }}
+ {{ __('Activity expiration delay') }}: {{ $api_key->expires_after_last_used_minutes ? $api_key->expires_after_last_used_minutes . ' min' : __('Never')}} | {{ __('Last used') }}: {{ $api_key->last_used_at ?? __('Never') }} +
{{ $api_key->created_at }} + trash + + + {{ __('By') }}: {{ $api_key->account->identifier }} + + +
+@endsection diff --git a/flexiapi/resources/views/admin/contacts_list/delete.blade.php b/flexiapi/resources/views/admin/contacts_list/delete.blade.php index fbe926c..499afd7 100644 --- a/flexiapi/resources/views/admin/contacts_list/delete.blade.php +++ b/flexiapi/resources/views/admin/contacts_list/delete.blade.php @@ -9,7 +9,7 @@ @section('content')
-

trash {{ __('Delete') }}

+

trash {{ __('Delete') }}

{{ __('Cancel') }}
diff --git a/flexiapi/resources/views/admin/parts/settings_tabs.blade.php b/flexiapi/resources/views/admin/parts/settings_tabs.blade.php new file mode 100644 index 0000000..17ba552 --- /dev/null +++ b/flexiapi/resources/views/admin/parts/settings_tabs.blade.php @@ -0,0 +1,13 @@ +@php + $items = [ + route('admin.api_keys.index') => __('API Keys') + ]; + + if (auth()->user()->superAdmin) { + $items[route('admin.phone_countries.index')] = __('Phone Countries'); + } +@endphp + +@include('parts.tabs', [ + 'items' => $items +]) \ No newline at end of file diff --git a/flexiapi/resources/views/admin/phone_country/index.blade.php b/flexiapi/resources/views/admin/phone_country/index.blade.php index 1b3fd5e..1b809ec 100644 --- a/flexiapi/resources/views/admin/phone_country/index.blade.php +++ b/flexiapi/resources/views/admin/phone_country/index.blade.php @@ -5,37 +5,45 @@

flag {{ __('Phone Countries') }}

- plus - {{ __('Activate All') }} + eye {{ __('Activate All') }} - minus - {{ __('Deactivate All') }} + eye-closed {{ __('Deactivate All') }}
+@include('admin.parts.settings_tabs') + - - - + @foreach ($phone_countries as $phone_country) - - - + diff --git a/flexiapi/resources/views/admin/space/index.blade.php b/flexiapi/resources/views/admin/space/index.blade.php index 9bbdc75..47b2a95 100644 --- a/flexiapi/resources/views/admin/space/index.blade.php +++ b/flexiapi/resources/views/admin/space/index.blade.php @@ -14,9 +14,7 @@ - - @@ -24,15 +22,15 @@ @foreach ($spaces as $space) - - -
{{ __('Code') }}{{ __('Name') }}{{ __('Country code') }}{{ __('Name') }} {{ __('Actions') }}
{{ $phone_country->code }}{{ $phone_country->name }}{{ $phone_country->country_code }} @if ($phone_country->activated) - {{ __('Activated') }} - {{ __('Deactivate') }} + {{ __('Activated') }} @else - {{ __('Deactivated') }} - {{ __('Activate') }} + {{ __('Deactivated') }} + @endif + {{ $phone_country->name }} + + {{ $phone_country->code }} - {{ $phone_country->country_code }} + + + @if ($phone_country->activated) + + eye-closed + + @else + + eye + @endif
{{ __('Space') }}{{ __('Host') }} {{ __('SIP Domain') }}{{ __('Accounts') }} {{ __('Expiration') }}
- - {{ $space->name }} - @if ($space->super) Super @endif - + {{ $space->name }} + @if ($space->super) Super @endif +
+ {{ $space->host }}
{{ $space->host }}{{ $space->domain }} - {{ $space->accounts_count }} / @if ($space->max_accounts > 0){{ $space->max_accounts }} @else infinity@endif + {{ $space->domain }} + + {{ $space->accounts_count }} / @if ($space->max_accounts > 0){{ $space->max_accounts }} @else infinity@endifuser + @if ($space->isExpired()) diff --git a/flexiapi/resources/views/parts/sidebar.blade.php b/flexiapi/resources/views/parts/sidebar.blade.php index a1bf11e..45f1114 100644 --- a/flexiapi/resources/views/parts/sidebar.blade.php +++ b/flexiapi/resources/views/parts/sidebar.blade.php @@ -5,7 +5,6 @@ if (auth()->user() && auth()->user()->admin) { if (auth()->user()->superAdmin) { $items['admin.spaces.index'] = ['title' => __('Spaces'), 'icon' => 'globe-hemisphere-west']; - $items['admin.phone_countries.index'] = ['title' => __('Phone Countries'), 'icon' => 'flag']; } elseif (auth()->user()->admin) { $items['admin.spaces.me'] = ['title' => __('My Space'), 'icon' => 'globe-hemisphere-west']; } @@ -13,6 +12,7 @@ $items['admin.account.index'] = ['title' => __('Accounts'), 'icon' => 'users']; $items['admin.contacts_lists.index'] = ['title' => __('Contacts Lists'), 'icon' => 'user-rectangle']; $items['admin.statistics.show'] = ['title' => __('Statistics'), 'icon' => 'chart-donut']; + $items['admin.api_keys.index'] = ['title' => __('Settings'), 'icon' => 'gear']; } @endphp diff --git a/flexiapi/routes/web.php b/flexiapi/routes/web.php index 83a835c..7148b13 100644 --- a/flexiapi/routes/web.php +++ b/flexiapi/routes/web.php @@ -30,20 +30,21 @@ use App\Http\Controllers\Admin\AccountAccountTypeController; use App\Http\Controllers\Admin\AccountActionController; use App\Http\Controllers\Admin\AccountActivityController; use App\Http\Controllers\Admin\AccountContactController; +use App\Http\Controllers\Admin\AccountController as AdminAccountController; use App\Http\Controllers\Admin\AccountDeviceController; use App\Http\Controllers\Admin\AccountDictionaryController; use App\Http\Controllers\Admin\AccountImportController; -use App\Http\Controllers\Admin\AccountTypeController; -use App\Http\Controllers\Admin\AccountController as AdminAccountController; use App\Http\Controllers\Admin\AccountStatisticsController; -use App\Http\Controllers\Admin\ContactsListController; +use App\Http\Controllers\Admin\AccountTypeController; +use App\Http\Controllers\Admin\ApiKeyController as AdminApiKeyController; use App\Http\Controllers\Admin\ContactsListContactController; +use App\Http\Controllers\Admin\ContactsListController; use App\Http\Controllers\Admin\ExternalAccountController; use App\Http\Controllers\Admin\PhoneCountryController; use App\Http\Controllers\Admin\ResetPasswordEmailController; -use App\Http\Controllers\Admin\StatisticsController; -use App\Http\Controllers\Admin\SpaceController; use App\Http\Controllers\Admin\Space\EmailServerController; +use App\Http\Controllers\Admin\SpaceController; +use App\Http\Controllers\Admin\StatisticsController; use Illuminate\Support\Facades\Route; Route::redirect('/', 'login')->name('account.home'); @@ -139,14 +140,14 @@ Route::middleware(['web_panel_enabled', 'space.check'])->group(function () { Route::delete('delete', 'destroy')->name('destroy'); }); - Route::prefix('password')->controller(PasswordController::class)->group(function () { - Route::get('/', 'show')->name('password.show'); - Route::post('/', 'update')->name('password.update'); + Route::name('password.')->prefix('password')->controller(PasswordController::class)->group(function () { + Route::get('/', 'show')->name('show'); + Route::post('/', 'update')->name('update'); }); - Route::prefix('api_key')->controller(ApiKeyController::class)->group(function () { - Route::get('/', 'show')->name('api_key.show'); - Route::post('/', 'update')->name('api_key.update'); + Route::name('api_keys.')->prefix('api_key')->controller(ApiKeyController::class)->group(function () { + Route::get('/', 'show')->name('show'); + Route::post('/', 'update')->name('update'); }); Route::post('auth_tokens', 'Account\AuthTokenController@create')->name('auth_tokens.create'); @@ -171,6 +172,14 @@ Route::middleware(['web_panel_enabled', 'space.check'])->group(function () { }); }); + Route::name('api_keys.')->prefix('api_keys')->controller(AdminApiKeyController::class)->group(function () { + Route::get('/', 'index')->name('index'); + Route::get('create', 'create')->name('create'); + Route::post('/', 'store')->name('store'); + Route::get('{key}/delete', 'delete')->name('delete'); + Route::delete('/', 'destroy')->name('destroy'); + }); + Route::middleware(['auth.super_admin'])->group(function () { Route::resource('spaces', SpaceController::class); Route::get('spaces/delete/{id}', 'Admin\SpaceController@delete')->name('spaces.delete'); diff --git a/flexiapi/tests/Feature/AccountBlockingTest.php b/flexiapi/tests/Feature/AccountBlockingTest.php index c30d4f6..5da6e6d 100644 --- a/flexiapi/tests/Feature/AccountBlockingTest.php +++ b/flexiapi/tests/Feature/AccountBlockingTest.php @@ -30,7 +30,7 @@ class AccountBlockingTest extends TestCase public function testBlocking() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); config()->set('app.blocking_amount_events_authorized_during_period', 2); @@ -48,10 +48,10 @@ class AccountBlockingTest extends TestCase public function testAdminBlocking() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($account) ->get($this->route . '/me')->assertStatus(200); diff --git a/flexiapi/tests/Feature/AccountProvisioningTest.php b/flexiapi/tests/Feature/AccountProvisioningTest.php index c35a464..711bb84 100644 --- a/flexiapi/tests/Feature/AccountProvisioningTest.php +++ b/flexiapi/tests/Feature/AccountProvisioningTest.php @@ -72,7 +72,7 @@ class AccountProvisioningTest extends TestCase space(reload: true); $account = Account::factory()->deactivated()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->assertEquals(false, $account->activated); $this->assertFalse($account->currentProvisioningToken->used); @@ -108,7 +108,7 @@ class AccountProvisioningTest extends TestCase public function testAuthenticatedWithPasswordProvisioning() { $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $this->keyAuthenticated($password->account) ->get($this->accountRoute) @@ -141,7 +141,7 @@ class AccountProvisioningTest extends TestCase $secondDomain = Space::factory()->create(); $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->domain = $secondDomain->domain; $password->account->save(); @@ -162,7 +162,7 @@ class AccountProvisioningTest extends TestCase $password = Password::factory()->create(); $password->account->display_name = "Anna O'Reily"; $password->account->save(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $provisioningToken = $password->account->provisioning_token; @@ -190,7 +190,7 @@ class AccountProvisioningTest extends TestCase public function testPasswordResetProvisioning() { $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $currentPassword = $password->password; @@ -232,7 +232,7 @@ class AccountProvisioningTest extends TestCase $response->assertStatus(404); $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->activated = false; $password->account->save(); @@ -258,7 +258,7 @@ class AccountProvisioningTest extends TestCase // Refresh the provisioning_token $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, '/api/accounts/' . $password->account->id . '/provision') @@ -292,7 +292,7 @@ class AccountProvisioningTest extends TestCase $authToken = $response->json('token'); $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $this->keyAuthenticated($password->account) ->json($this->method, '/api/accounts/auth_token/' . $authToken . '/attach') @@ -322,7 +322,7 @@ class AccountProvisioningTest extends TestCase public function testTokenExpiration() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $expirationMinutes = 10; $this->keyAuthenticated($account) @@ -356,7 +356,7 @@ class AccountProvisioningTest extends TestCase public function testCoTURN() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $host = 'coturn.tld'; $realm = 'realm.tld'; diff --git a/flexiapi/tests/Feature/ApiAccountActionTest.php b/flexiapi/tests/Feature/ApiAccountActionTest.php index f5835a1..aa0d02a 100644 --- a/flexiapi/tests/Feature/ApiAccountActionTest.php +++ b/flexiapi/tests/Feature/ApiAccountActionTest.php @@ -34,7 +34,7 @@ class ApiAccountActionTest extends TestCase $password = Password::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ @@ -95,7 +95,7 @@ class ApiAccountActionTest extends TestCase $password = Password::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ @@ -119,7 +119,7 @@ class ApiAccountActionTest extends TestCase $password = Password::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route.'/'.$password->account->id.'/actions', [ diff --git a/flexiapi/tests/Feature/ApiAccountApiKeyTest.php b/flexiapi/tests/Feature/ApiAccountApiKeyTest.php index 171e5ab..5f16a49 100644 --- a/flexiapi/tests/Feature/ApiAccountApiKeyTest.php +++ b/flexiapi/tests/Feature/ApiAccountApiKeyTest.php @@ -58,7 +58,7 @@ class ApiAccountApiKeyTest extends TestCase public function testRequest() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, '/api/accounts/me') @@ -104,7 +104,7 @@ class ApiAccountApiKeyTest extends TestCase // Attach the auth_token to the account $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $this->keyAuthenticated($password->account) ->json($this->method, '/api/accounts/auth_token/' . $authToken . '/attach') diff --git a/flexiapi/tests/Feature/ApiAccountContactsTest.php b/flexiapi/tests/Feature/ApiAccountContactsTest.php index a5c4c36..88467f5 100644 --- a/flexiapi/tests/Feature/ApiAccountContactsTest.php +++ b/flexiapi/tests/Feature/ApiAccountContactsTest.php @@ -43,7 +43,7 @@ class ApiAccountContactsTest extends TestCase $actionCode = '123'; $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route . '/' . $password1->account->id . '/contacts/' . $password2->account->id) @@ -90,7 +90,7 @@ class ApiAccountContactsTest extends TestCase ]); // /me - $password1->account->generateApiKey(); + $password1->account->generateUserApiKey(); $password1->account->save(); $this->keyAuthenticated($password1->account) diff --git a/flexiapi/tests/Feature/ApiAccountCreationTokenTest.php b/flexiapi/tests/Feature/ApiAccountCreationTokenTest.php index 456c7a2..ce85307 100644 --- a/flexiapi/tests/Feature/ApiAccountCreationTokenTest.php +++ b/flexiapi/tests/Feature/ApiAccountCreationTokenTest.php @@ -132,7 +132,7 @@ class ApiAccountCreationTokenTest extends TestCase public function testAdminEndpoint() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $response = $this->keyAuthenticated($admin) ->json($this->method, $this->adminRoute) @@ -268,7 +268,7 @@ class ApiAccountCreationTokenTest extends TestCase public function testConsume() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $accountCreationToken = AccountCreationToken::factory()->create(); $token = $accountCreationToken->token; diff --git a/flexiapi/tests/Feature/ApiAccountDictionaryTest.php b/flexiapi/tests/Feature/ApiAccountDictionaryTest.php index cd8b710..cd92451 100644 --- a/flexiapi/tests/Feature/ApiAccountDictionaryTest.php +++ b/flexiapi/tests/Feature/ApiAccountDictionaryTest.php @@ -31,7 +31,7 @@ class ApiAccountDictionaryTest extends TestCase { $account = Account::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $key = 'foo'; $value = 'bar'; diff --git a/flexiapi/tests/Feature/ApiAccountEmailChangeTest.php b/flexiapi/tests/Feature/ApiAccountEmailChangeTest.php index d7459ef..e263ed7 100644 --- a/flexiapi/tests/Feature/ApiAccountEmailChangeTest.php +++ b/flexiapi/tests/Feature/ApiAccountEmailChangeTest.php @@ -31,9 +31,9 @@ class ApiAccountEmailChangeTest extends TestCase public function testRequest() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $otherAccount = Account::factory()->withEmail()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $newEmail = 'test@test.com'; $this->keyAuthenticated($account) @@ -77,7 +77,7 @@ class ApiAccountEmailChangeTest extends TestCase public function testCodeExpiration() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ @@ -100,7 +100,7 @@ class ApiAccountEmailChangeTest extends TestCase public function testUnvalidatedAccount() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ @@ -126,7 +126,7 @@ class ApiAccountEmailChangeTest extends TestCase $email = $emailChange->email; $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($emailChange->account) ->get('/api/accounts/me') diff --git a/flexiapi/tests/Feature/ApiAccountExternalAccountTest.php b/flexiapi/tests/Feature/ApiAccountExternalAccountTest.php index 8867952..d1223a9 100644 --- a/flexiapi/tests/Feature/ApiAccountExternalAccountTest.php +++ b/flexiapi/tests/Feature/ApiAccountExternalAccountTest.php @@ -31,7 +31,7 @@ class ApiAccountExternalAccountTest extends TestCase { $account = Account::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $username = 'foo'; diff --git a/flexiapi/tests/Feature/ApiAccountMessageTest.php b/flexiapi/tests/Feature/ApiAccountMessageTest.php index 751993b..466ed5f 100644 --- a/flexiapi/tests/Feature/ApiAccountMessageTest.php +++ b/flexiapi/tests/Feature/ApiAccountMessageTest.php @@ -31,7 +31,7 @@ class ApiAccountMessageTest extends TestCase public function testRequest() { $password = Password::factory()->admin()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $this->keyAuthenticated($password->account) ->json($this->method, $this->route, [ diff --git a/flexiapi/tests/Feature/ApiAccountPhoneChangeTest.php b/flexiapi/tests/Feature/ApiAccountPhoneChangeTest.php index 4baa89f..24502f1 100644 --- a/flexiapi/tests/Feature/ApiAccountPhoneChangeTest.php +++ b/flexiapi/tests/Feature/ApiAccountPhoneChangeTest.php @@ -32,7 +32,7 @@ class ApiAccountPhoneChangeTest extends TestCase public function testRequest() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ @@ -51,7 +51,7 @@ class ApiAccountPhoneChangeTest extends TestCase public function testCodeExpiration() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ @@ -74,7 +74,7 @@ class ApiAccountPhoneChangeTest extends TestCase public function testCreatePhoneByCountry() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $frenchPhoneNumber = '+33612121212'; $dutchPhoneNumber = '+31612121212'; @@ -103,7 +103,7 @@ class ApiAccountPhoneChangeTest extends TestCase public function testUnvalidatedAccount() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->route.'/request', [ @@ -129,7 +129,7 @@ class ApiAccountPhoneChangeTest extends TestCase $phone = $phoneChange->phone; $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($phoneChange->account) ->get('/api/accounts/me') diff --git a/flexiapi/tests/Feature/ApiAccountTest.php b/flexiapi/tests/Feature/ApiAccountTest.php index fb70372..2872aa7 100644 --- a/flexiapi/tests/Feature/ApiAccountTest.php +++ b/flexiapi/tests/Feature/ApiAccountTest.php @@ -77,7 +77,7 @@ class ApiAccountTest extends TestCase public function testEmptyDevices() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->get($this->route . '/me/devices') @@ -88,7 +88,7 @@ class ApiAccountTest extends TestCase public function testUsernameNotPhone() { $account = Account::factory()->admin()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $username = '+33612121212'; $domain = Space::first()->domain; @@ -117,7 +117,7 @@ class ApiAccountTest extends TestCase public function testUsernameNotSIP() { $password = Password::factory()->admin()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $username = 'blabla🔥'; $domain = Space::first()->domain; @@ -192,7 +192,7 @@ class ApiAccountTest extends TestCase config()->set('app.sip_domain', $configDomain); $account = Account::factory()->superAdmin()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $account->save(); $username = 'foobar'; @@ -247,7 +247,7 @@ class ApiAccountTest extends TestCase public function testCreateDomainAsAdmin() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $admin->save(); $username = 'foo'; @@ -276,7 +276,7 @@ class ApiAccountTest extends TestCase /*public function testCreateDomainAsSuperAdmin() { $superAdmin = Account::factory()->superAdmin()->create(); - $superAdmin->generateApiKey(); + $superAdmin->generateUserApiKey(); $superAdmin->save(); $username = 'foo'; @@ -401,7 +401,7 @@ class ApiAccountTest extends TestCase public function testAdminWithDictionary() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $entryKey = 'foo'; $entryValue = 'bar'; @@ -588,7 +588,7 @@ class ApiAccountTest extends TestCase $password = Password::factory()->create(); $password->account->activated = false; - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->save(); /** @@ -634,7 +634,7 @@ class ApiAccountTest extends TestCase { $confirmationKey = '0123456789abc'; $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->confirmation_key = $confirmationKey; $password->account->activated = false; $password->account->save(); @@ -704,7 +704,7 @@ class ApiAccountTest extends TestCase config()->set('app.account_email_unique', true); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $admin->save(); $this->keyAuthenticated($admin) @@ -720,7 +720,7 @@ class ApiAccountTest extends TestCase public function testNonAsciiPasswordAdmin() { $password = Password::factory()->admin()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $username = 'username'; $domain = Space::first()->domain; @@ -747,7 +747,7 @@ class ApiAccountTest extends TestCase $account = $password->account; $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $admin->save(); $username = 'changed'; @@ -801,7 +801,7 @@ class ApiAccountTest extends TestCase { $confirmationKey = '0123'; $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->confirmation_key = $confirmationKey; $password->account->activated = false; $password->account->save(); @@ -853,7 +853,7 @@ class ApiAccountTest extends TestCase $confirmationKey = '1234'; $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->confirmation_key = $confirmationKey; $password->account->activated = false; $password->account->save(); @@ -873,7 +873,7 @@ class ApiAccountTest extends TestCase $phone = '+33612312312'; $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->activated = false; $password->account->phone = $phone; $password->account->save(); @@ -1079,7 +1079,7 @@ class ApiAccountTest extends TestCase { $confirmationKey = '0123'; $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $password->account->confirmation_key = $confirmationKey; $password->account->activated = false; $password->account->save(); @@ -1120,7 +1120,7 @@ class ApiAccountTest extends TestCase public function testChangePassword() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $password = 'password'; $algorithm = 'MD5'; $newPassword = 'new_password'; @@ -1193,7 +1193,7 @@ class ApiAccountTest extends TestCase $account = Account::factory()->withEmail()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); // deactivate $this->keyAuthenticated($admin) @@ -1255,7 +1255,7 @@ class ApiAccountTest extends TestCase Password::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); // /accounts $this->keyAuthenticated($admin) @@ -1278,7 +1278,7 @@ class ApiAccountTest extends TestCase public function testCodeExpires() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); // Activated, no no confirmation_key $this->keyAuthenticated($admin) @@ -1326,7 +1326,7 @@ class ApiAccountTest extends TestCase $password = Password::factory()->create(); $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->delete($this->route . '/' . $password->account->id) diff --git a/flexiapi/tests/Feature/ApiAccountTypeTest.php b/flexiapi/tests/Feature/ApiAccountTypeTest.php index 0d55d50..432a44b 100644 --- a/flexiapi/tests/Feature/ApiAccountTypeTest.php +++ b/flexiapi/tests/Feature/ApiAccountTypeTest.php @@ -33,7 +33,7 @@ class ApiAccountTypeTest extends TestCase public function testCreate() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route, [ @@ -75,7 +75,7 @@ class ApiAccountTypeTest extends TestCase public function testDelete() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route, [ @@ -96,7 +96,7 @@ class ApiAccountTypeTest extends TestCase public function testUpdate() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route, [ @@ -125,7 +125,7 @@ class ApiAccountTypeTest extends TestCase public function testAccountAddType() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $this->keyAuthenticated($admin) ->json($this->method, $this->route, [ diff --git a/flexiapi/tests/Feature/ApiAccountVcardsStorageTest.php b/flexiapi/tests/Feature/ApiAccountVcardsStorageTest.php index f77a486..d8afded 100644 --- a/flexiapi/tests/Feature/ApiAccountVcardsStorageTest.php +++ b/flexiapi/tests/Feature/ApiAccountVcardsStorageTest.php @@ -30,10 +30,10 @@ class ApiAccountVcardsStorageTest extends TestCase public function testAccountCrud() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $adminRoute = '/api/accounts/' . $account->id . '/vcards-storage'; diff --git a/flexiapi/tests/Feature/ApiAuthenticationTest.php b/flexiapi/tests/Feature/ApiAuthenticationTest.php index facff3d..2b3ac6f 100644 --- a/flexiapi/tests/Feature/ApiAuthenticationTest.php +++ b/flexiapi/tests/Feature/ApiAuthenticationTest.php @@ -58,7 +58,7 @@ class ApiAuthenticationTest extends TestCase public function testAuthenticateWithKey() { $password = Password::factory()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $response = $this->withHeaders([ 'From' => 'sip:'.$password->account->identifier, diff --git a/flexiapi/tests/Feature/ApiLocalizationTest.php b/flexiapi/tests/Feature/ApiLocalizationTest.php index b169b6e..a29d8b4 100644 --- a/flexiapi/tests/Feature/ApiLocalizationTest.php +++ b/flexiapi/tests/Feature/ApiLocalizationTest.php @@ -30,7 +30,7 @@ class ApiLocalizationTest extends TestCase public function testUsernameNotPhone() { $password = Password::factory()->admin()->create(); - $password->account->generateApiKey(); + $password->account->generateUserApiKey(); $this->keyAuthenticated($password->account) ->withHeaders([ diff --git a/flexiapi/tests/Feature/ApiPhoneCountryTest.php b/flexiapi/tests/Feature/ApiPhoneCountryTest.php index 94ca048..f433608 100644 --- a/flexiapi/tests/Feature/ApiPhoneCountryTest.php +++ b/flexiapi/tests/Feature/ApiPhoneCountryTest.php @@ -33,7 +33,7 @@ class ApiPhoneCountryTest extends TestCase public function testCreatePhoneByCountry() { $account = Account::factory()->withConsumedAccountCreationToken()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $frenchPhoneNumber = '+33612121212'; $dutchPhoneNumber = '+31612121212'; diff --git a/flexiapi/tests/Feature/ApiPushNotificationTest.php b/flexiapi/tests/Feature/ApiPushNotificationTest.php index b3751f7..f244060 100644 --- a/flexiapi/tests/Feature/ApiPushNotificationTest.php +++ b/flexiapi/tests/Feature/ApiPushNotificationTest.php @@ -40,7 +40,7 @@ class ApiPushNotificationTest extends TestCase public function testCorrectParameters() { $account = Account::factory()->create(); - $account->generateApiKey(); + $account->generateUserApiKey(); $this->keyAuthenticated($account) ->json($this->method, $this->tokenRoute, [ diff --git a/flexiapi/tests/Feature/ApiSpaceEmailServerTest.php b/flexiapi/tests/Feature/ApiSpaceEmailServerTest.php index ed6cc57..b49c1c0 100644 --- a/flexiapi/tests/Feature/ApiSpaceEmailServerTest.php +++ b/flexiapi/tests/Feature/ApiSpaceEmailServerTest.php @@ -32,7 +32,7 @@ class ApiSpaceEmailServerTest extends TestCase public function testEmailServer() { $admin = Account::factory()->superAdmin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $emailHost = 'email.domain'; $route = $this->route . '/' . $admin->space->host . '/email'; diff --git a/flexiapi/tests/Feature/ApiSpaceTest.php b/flexiapi/tests/Feature/ApiSpaceTest.php index 6214291..d4ada00 100644 --- a/flexiapi/tests/Feature/ApiSpaceTest.php +++ b/flexiapi/tests/Feature/ApiSpaceTest.php @@ -33,7 +33,7 @@ class ApiSpaceTest extends TestCase public function testBaseAdmin() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $secondDomain = Space::factory()->secondDomain()->create(); $username = 'foo'; @@ -75,7 +75,7 @@ class ApiSpaceTest extends TestCase public function testSuperAdmin() { $admin = Account::factory()->superAdmin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $thirdDomain = 'third.domain'; @@ -139,7 +139,7 @@ class ApiSpaceTest extends TestCase public function testUserCreation() { $admin = Account::factory()->superAdmin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $domain = 'domain.com'; diff --git a/flexiapi/tests/Feature/ApiSpaceWithMiddlewareTest.php b/flexiapi/tests/Feature/ApiSpaceWithMiddlewareTest.php index 36cd8d6..bda973b 100644 --- a/flexiapi/tests/Feature/ApiSpaceWithMiddlewareTest.php +++ b/flexiapi/tests/Feature/ApiSpaceWithMiddlewareTest.php @@ -33,7 +33,7 @@ class ApiSpaceWithMiddlewareTest extends TestCaseWithSpaceMiddleware public function testExpiredSpace() { $superAdmin = Account::factory()->superAdmin()->create(); - $superAdmin->generateApiKey(); + $superAdmin->generateUserApiKey(); $username = 'username'; @@ -41,7 +41,7 @@ class ApiSpaceWithMiddlewareTest extends TestCaseWithSpaceMiddleware $admin = Account::factory()->fromSpace($space)->admin()->create(); // Try to create a new user as an admin - $admin->generateApiKey(); + $admin->generateUserApiKey(); config()->set('app.root_host', $admin->domain); space(reload: true); diff --git a/flexiapi/tests/Feature/ApiStatisticsTest.php b/flexiapi/tests/Feature/ApiStatisticsTest.php index f678cac..c988006 100644 --- a/flexiapi/tests/Feature/ApiStatisticsTest.php +++ b/flexiapi/tests/Feature/ApiStatisticsTest.php @@ -35,7 +35,7 @@ class ApiStatisticsTest extends TestCase public function testMessages() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $id = '1234'; $fromUsername = 'username'; @@ -128,7 +128,7 @@ class ApiStatisticsTest extends TestCase public function testCalls() { $admin = Account::factory()->admin()->create(); - $admin->generateApiKey(); + $admin->generateUserApiKey(); $id = '1234'; $fromUsername = 'username';