diff --git a/flexiapi/app/Account.php b/flexiapi/app/Account.php index 6093529..082180a 100644 --- a/flexiapi/app/Account.php +++ b/flexiapi/app/Account.php @@ -136,6 +136,11 @@ class Account extends Authenticatable return null; } + public function getSha256PasswordAttribute() + { + return $this->passwords()->where('algorithm', 'SHA-256')->exists(); + } + public function activationExpired(): bool { return ($this->activationExpiration && $this->activationExpiration->isExpired()); diff --git a/flexiapi/app/Helpers/Utils.php b/flexiapi/app/Helpers/Utils.php index 18cb6e5..6db0f7b 100644 --- a/flexiapi/app/Helpers/Utils.php +++ b/flexiapi/app/Helpers/Utils.php @@ -24,7 +24,7 @@ use Illuminate\Support\Str; use App\Account; use App\DigestNonce; -use League\CommonMark\Environment\Environment; +use League\CommonMark\Environment; use League\CommonMark\Extension\HeadingPermalink\HeadingPermalinkExtension; use League\CommonMark\Extension\TableOfContents\TableOfContentsExtension; use League\CommonMark\MarkdownConverter; diff --git a/flexiapi/app/Http/Controllers/Admin/AccountController.php b/flexiapi/app/Http/Controllers/Admin/AccountController.php index 82a5c6e..0ed8bcb 100644 --- a/flexiapi/app/Http/Controllers/Admin/AccountController.php +++ b/flexiapi/app/Http/Controllers/Admin/AccountController.php @@ -21,9 +21,15 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; +use Illuminate\Support\Str; +use Carbon\Carbon; use App\Account; use App\Admin; +use App\Alias; +use App\Http\Requests\CreateAccountRequest; +use App\Http\Requests\UpdateAccountRequest; +use App\Http\Controllers\Account\AuthenticateController as WebAuthenticateController; class AccountController extends Controller { @@ -41,40 +47,88 @@ class AccountController extends Controller ]); } + public function show(Account $account) + { + return view('admin.account.show', [ + 'account' => $account + ]); + } + + public function create(Request $request) + { + return view('admin.account.create_edit', [ + 'account' => new Account + ]); + } + + public function store(CreateAccountRequest $request) + { + $account = new Account; + $account->username = $request->get('username'); + $account->email = $request->get('email'); + $account->domain = config('app.sip_domain'); + $account->ip_address = $request->ip(); + $account->creation_time = Carbon::now(); + $account->user_agent = config('app.name'); + $account->save(); + + $this->fillPassword($request, $account); + $this->fillPhone($request, $account); + + return redirect()->route('admin.account.show', $account->id); + } + + public function edit(Account $account) + { + return view('admin.account.create_edit', [ + 'account' => $account + ]); + } + + public function update(UpdateAccountRequest $request, $id) + { + $account = Account::findOrFail($id); + $account->username = $request->get('username'); + $account->email = $request->get('email'); + $account->save(); + + $this->fillPassword($request, $account); + $this->fillPhone($request, $account); + + return redirect()->route('admin.account.show', $id); + } + public function search(Request $request) { return redirect()->route('admin.account.index', $request->get('search')); } - public function show(Request $request, $id) + public function activate(Account $account) { - return view('admin.account.show', [ - 'account' => Account::findOrFail($id) - ]); - } - - public function activate(Request $request, $id) - { - $account = Account::findOrFail($id); $account->activated = true; $account->save(); return redirect()->back(); } - public function deactivate(Request $request, $id) + public function deactivate(Account $account) { - $account = Account::findOrFail($id); $account->activated = false; $account->save(); return redirect()->back(); } - public function admin(Request $request, $id) + public function provision(Account $account) { - $account = Account::findOrFail($id); + $account->confirmation_key = Str::random(WebAuthenticateController::$emailCodeSize); + $account->save(); + return redirect()->back(); + } + + public function admin(Account $account) + { $admin = new Admin; $admin->account_id = $account->id; $admin->save(); @@ -94,10 +148,10 @@ class AccountController extends Controller return redirect()->back(); } - public function delete(Request $request, $id) + public function delete(Account $account) { return view('admin.account.delete', [ - 'account' => Account::findOrFail($id) + 'account' => $account ]); } @@ -118,4 +172,25 @@ class AccountController extends Controller return redirect()->back(); } + + private function fillPassword(Request $request, Account $account) + { + if ($request->filled('password')) { + $algorithm = $request->has('password_sha256') ? 'SHA-256' : 'MD5'; + $account->updatePassword($request->get('password'), $algorithm); + } + } + + private function fillPhone(Request $request, Account $account) + { + if ($request->filled('phone')) { + $account->alias()->delete(); + + $alias = new Alias; + $alias->alias = $request->get('phone'); + $alias->domain = config('app.sip_domain'); + $alias->account_id = $account->id; + $alias->save(); + } + } } diff --git a/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php b/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php index 55030ae..c713005 100644 --- a/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php +++ b/flexiapi/app/Http/Controllers/Api/Admin/AccountController.php @@ -74,14 +74,13 @@ class AccountController extends Controller $request->validate([ 'username' => [ 'required', - Rule::unique('accounts', 'username')->where(function ($query) use ($request) { + Rule::unique('accounts', 'username')->where(function ($query) { $query->where('domain', config('app.sip_domain')); }), 'filled', ], 'algorithm' => 'required|in:SHA-256,MD5', 'password' => 'required|filled', - 'domain' => 'min:3', 'email' => 'email', 'admin' => 'boolean|nullable', 'activated' => 'boolean|nullable', @@ -102,9 +101,7 @@ class AccountController extends Controller $account->activated = $request->has('activated') ? (bool)$request->get('activated') : false; - $account->domain = $request->has('domain') - ? $request->get('domain') - : config('app.sip_domain'); + $account->domain = config('app.sip_domain'); $account->ip_address = $request->ip(); $account->creation_time = Carbon::now(); $account->user_agent = config('app.name'); diff --git a/flexiapi/composer.json b/flexiapi/composer.json index dbb6221..dc6bf46 100644 --- a/flexiapi/composer.json +++ b/flexiapi/composer.json @@ -8,7 +8,7 @@ ], "license": "MIT", "require": { - "php": "^7.3", + "php": ">=7.3.0", "anhskohbo/no-captcha": "^3.3", "endroid/qr-code": "^4.1", "fideloper/proxy": "^4.4", @@ -27,6 +27,9 @@ "phpunit/phpunit": "^9.0" }, "config": { + "platform": { + "php": "7.3" + }, "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock index 0e7c0bb..8197fa5 100644 --- a/flexiapi/composer.lock +++ b/flexiapi/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3587c34f2b45c6c30d140797a60d50b4", + "content-hash": "00ccabe18c0107ac493aabb5e82aadba", "packages": [ { "name": "anhskohbo/no-captcha", @@ -226,81 +226,6 @@ }, "time": "2020-10-02T16:03:48+00:00" }, - { - "name": "dflydev/dot-access-data", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "e04ff030d24a33edc2421bef305e32919dd78fc3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/e04ff030d24a33edc2421bef305e32919dd78fc3", - "reference": "e04ff030d24a33edc2421bef305e32919dd78fc3", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", - "scrutinizer/ocular": "1.6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.14" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Dflydev\\DotAccessData\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Carlos Frutos", - "email": "carlos@kiwing.it", - "homepage": "https://github.com/cfrutos" - }, - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" - } - ], - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": [ - "access", - "data", - "dot", - "notation" - ], - "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.0" - }, - "time": "2021-01-01T22:08:42+00:00" - }, { "name": "doctrine/inflector", "version": "2.0.3", @@ -1054,16 +979,16 @@ }, { "name": "laravel/framework", - "version": "v8.51.0", + "version": "v8.52.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "208d9c0043b4c192a9bb9b15782cc4ec37f28bb0" + "reference": "8fe9877d52e25f8aed36c51734e5a8510be967e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/208d9c0043b4c192a9bb9b15782cc4ec37f28bb0", - "reference": "208d9c0043b4c192a9bb9b15782cc4ec37f28bb0", + "url": "https://api.github.com/repos/laravel/framework/zipball/8fe9877d52e25f8aed36c51734e5a8510be967e6", + "reference": "8fe9877d52e25f8aed36c51734e5a8510be967e6", "shasum": "" }, "require": { @@ -1218,7 +1143,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-07-20T14:38:36+00:00" + "time": "2021-07-27T13:03:29+00:00" }, { "name": "laravel/tinker", @@ -1362,51 +1287,42 @@ }, { "name": "league/commonmark", - "version": "2.0.0", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "167142baf9a6b946f99ad9325b06028606f8238e" + "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/167142baf9a6b946f99ad9325b06028606f8238e", - "reference": "167142baf9a6b946f99ad9325b06028606f8238e", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c4228d11e30d7493c6836d20872f9582d8ba6dcf", + "reference": "c4228d11e30d7493c6836d20872f9582d8ba6dcf", "shasum": "" }, "require": { "ext-mbstring": "*", - "league/config": "^1.1", - "php": "^7.4 || ^8.0", - "psr/event-dispatcher": "^1.0", - "symfony/polyfill-php80": "^1.15" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "scrutinizer/ocular": "1.7.*" }, "require-dev": { - "cebe/markdown": "^1.0", - "commonmark/cmark": "0.30.0", - "commonmark/commonmark.js": "0.30.0", - "composer/package-versions-deprecated": "^1.8", - "erusev/parsedown": "^1.0", + "cebe/markdown": "~1.0", + "commonmark/commonmark.js": "0.29.2", + "erusev/parsedown": "~1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "^1.4", - "phpstan/phpstan": "^0.12.88", - "phpunit/phpunit": "^9.5.5", - "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" - }, - "suggest": { - "symfony/yaml": "v2.3+ required if using the Front Matter extension" + "michelf/php-markdown": "~1.4", + "mikehaertl/php-shellcommand": "^1.4", + "phpstan/phpstan": "^0.12.90", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", + "scrutinizer/ocular": "^1.5", + "symfony/finder": "^4.2" }, + "bin": [ + "bin/commonmark" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.1-dev" - } - }, "autoload": { "psr-4": { "League\\CommonMark\\": "src" @@ -1424,7 +1340,7 @@ "role": "Lead Developer" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", @@ -1438,7 +1354,6 @@ ], "support": { "docs": "https://commonmark.thephpleague.com/", - "forum": "https://github.com/thephpleague/commonmark/discussions", "issues": "https://github.com/thephpleague/commonmark/issues", "rss": "https://github.com/thephpleague/commonmark/releases.atom", "source": "https://github.com/thephpleague/commonmark" @@ -1469,89 +1384,7 @@ "type": "tidelift" } ], - "time": "2021-07-24T20:12:58+00:00" - }, - { - "name": "league/config", - "version": "v1.1.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/config.git", - "reference": "20d42d88f12a76ff862e17af4f14a5a4bbfd0925" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/20d42d88f12a76ff862e17af4f14a5a4bbfd0925", - "reference": "20d42d88f12a76ff862e17af4f14a5a4bbfd0925", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^3.0", - "nette/schema": "^1.2", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^9.5.5", - "scrutinizer/ocular": "^1.8.1", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Config\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Define configuration arrays with strict schemas and access values with dot notation", - "homepage": "https://config.thephpleague.com", - "keywords": [ - "array", - "config", - "configuration", - "dot", - "dot-access", - "nested", - "schema" - ], - "support": { - "docs": "https://config.thephpleague.com/", - "issues": "https://github.com/thephpleague/config/issues", - "rss": "https://github.com/thephpleague/config/releases.atom", - "source": "https://github.com/thephpleague/config" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - } - ], - "time": "2021-06-19T15:52:37+00:00" + "time": "2021-07-17T17:13:23+00:00" }, { "name": "league/flysystem", @@ -1801,22 +1634,23 @@ }, { "name": "nesbot/carbon", - "version": "2.50.0", + "version": "2.51.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb" + "reference": "8619c299d1e0d4b344e1f98ca07a1ce2cfbf1922" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f47f17d17602b2243414a44ad53d9f8b9ada5fdb", - "reference": "f47f17d17602b2243414a44ad53d9f8b9ada5fdb", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8619c299d1e0d4b344e1f98ca07a1ce2cfbf1922", + "reference": "8619c299d1e0d4b344e1f98ca07a1ce2cfbf1922", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { @@ -1835,8 +1669,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" }, "laravel": { "providers": [ @@ -1890,154 +1724,7 @@ "type": "tidelift" } ], - "time": "2021-06-28T22:38:45+00:00" - }, - { - "name": "nette/schema", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "f5ed39fc96358f922cedfd1e516f0dadf5d2be0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/f5ed39fc96358f922cedfd1e516f0dadf5d2be0d", - "reference": "f5ed39fc96358f922cedfd1e516f0dadf5d2be0d", - "shasum": "" - }, - "require": { - "nette/utils": "^3.1.4 || ^4.0", - "php": ">=7.1 <8.1" - }, - "require-dev": { - "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^0.12", - "tracy/tracy": "^2.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", - "keywords": [ - "config", - "nette" - ], - "support": { - "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.1" - }, - "time": "2021-03-04T17:51:11+00:00" - }, - { - "name": "nette/utils", - "version": "v3.2.2", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/967cfc4f9a1acd5f1058d76715a424c53343c20c", - "reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c", - "shasum": "" - }, - "require": { - "php": ">=7.2 <8.1" - }, - "conflict": { - "nette/di": "<3.0.6" - }, - "require-dev": { - "nette/tester": "~2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], - "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.2" - }, - "time": "2021-03-03T22:53:25+00:00" + "time": "2021-07-28T13:16:28+00:00" }, { "name": "nikic/php-parser", @@ -2947,16 +2634,16 @@ }, { "name": "symfony/console", - "version": "v5.3.4", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ebd610dacd40d75b6a12bf64b5ccd494fc7d6ab1" + "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ebd610dacd40d75b6a12bf64b5ccd494fc7d6ab1", - "reference": "ebd610dacd40d75b6a12bf64b5ccd494fc7d6ab1", + "url": "https://api.github.com/repos/symfony/console/zipball/51b71afd6d2dc8f5063199357b9880cea8d8bfe2", + "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "shasum": "" }, "require": { @@ -3026,7 +2713,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.4" + "source": "https://github.com/symfony/console/tree/v5.3.6" }, "funding": [ { @@ -3042,7 +2729,7 @@ "type": "tidelift" } ], - "time": "2021-07-26T16:33:26+00:00" + "time": "2021-07-27T19:10:22+00:00" }, { "name": "symfony/css-selector", @@ -3551,16 +3238,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.3.4", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d6602aca7d3e11f401a0b24f43b611c530abfad3" + "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d6602aca7d3e11f401a0b24f43b611c530abfad3", - "reference": "d6602aca7d3e11f401a0b24f43b611c530abfad3", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", + "reference": "a8388f7b7054a7401997008ce9cd8c6b0ab7ac75", "shasum": "" }, "require": { @@ -3604,7 +3291,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.4" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.6" }, "funding": [ { @@ -3620,20 +3307,20 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-07-27T17:08:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.3.5", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9eb3ee3cb6c69e12ba5770665b89fe82f0b99033" + "reference": "60030f209018356b3b553b9dbd84ad2071c1b7e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9eb3ee3cb6c69e12ba5770665b89fe82f0b99033", - "reference": "9eb3ee3cb6c69e12ba5770665b89fe82f0b99033", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/60030f209018356b3b553b9dbd84ad2071c1b7e0", + "reference": "60030f209018356b3b553b9dbd84ad2071c1b7e0", "shasum": "" }, "require": { @@ -3716,7 +3403,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.3.5" + "source": "https://github.com/symfony/http-kernel/tree/v5.3.6" }, "funding": [ { @@ -3732,7 +3419,7 @@ "type": "tidelift" } ], - "time": "2021-07-27T04:39:22+00:00" + "time": "2021-07-29T07:06:27+00:00" }, { "name": "symfony/mime", @@ -3978,16 +3665,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { @@ -4039,7 +3726,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" }, "funding": [ { @@ -4055,7 +3742,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -4230,16 +3917,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -4290,7 +3977,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -4306,7 +3993,7 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:27:20+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", @@ -4465,16 +4152,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.23.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -4528,7 +4215,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -4544,7 +4231,7 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/process", @@ -5035,16 +4722,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.3.4", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a895407f7cf55da42aa1480935d707684b690bfc" + "reference": "3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a895407f7cf55da42aa1480935d707684b690bfc", - "reference": "a895407f7cf55da42aa1480935d707684b690bfc", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0", + "reference": "3dd8ddd1e260e58ecc61bb78da3b6584b3bfcba0", "shasum": "" }, "require": { @@ -5103,7 +4790,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.4" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.6" }, "funding": [ { @@ -5119,7 +4806,7 @@ "type": "tidelift" } ], - "time": "2021-07-23T15:55:36+00:00" + "time": "2021-07-27T01:56:02+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7988,16 +7675,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -8026,7 +7713,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -8034,7 +7721,7 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" } ], "aliases": [], @@ -8043,8 +7730,11 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^7.3" + "php": ">=7.3.0" }, "platform-dev": [], + "platform-overrides": { + "php": "7.3" + }, "plugin-api-version": "2.1.0" } diff --git a/flexiapi/resources/views/account/documentation_markdown.blade.php b/flexiapi/resources/views/account/documentation_markdown.blade.php index 5b740d8..3ccbafe 100644 --- a/flexiapi/resources/views/account/documentation_markdown.blade.php +++ b/flexiapi/resources/views/account/documentation_markdown.blade.php @@ -68,7 +68,7 @@ As an administrator, you will be able to generate an API Key allowing you to use ## Accounts administration -From the accounts administration panel an administrator will be able to list, show and delete accounts from the attached Flexisip server. +From the accounts administration panel an administrator will be able to list, create, show, edit and and delete accounts from the attached Flexisip server. ### Display a user account @@ -78,6 +78,8 @@ You can also set an account as an administrator. The account will then have the Finally the account page allows you to provision the account, using a QR Code or a unique link that can be shared with the contact. +The provisioning link can be generated and refreshed from this page as well. + ### Delete an account The deletion of an account is definitive, all the database related data (password, aliases…) will be destroyed after the deletion. \ No newline at end of file diff --git a/flexiapi/resources/views/admin/account/create_edit.blade.php b/flexiapi/resources/views/admin/account/create_edit.blade.php new file mode 100644 index 0000000..82bd899 --- /dev/null +++ b/flexiapi/resources/views/admin/account/create_edit.blade.php @@ -0,0 +1,80 @@ +@extends('layouts.account') + +@section('breadcrumb') + + @if ($account->id) + + + @else + + @endif +@endsection + +@section('content') + +@if ($account->id) +

Edit an account

+@else +

Create an account

+@endif + +{!! Form::model($account, [ + 'route' => $account->id + ? ['admin.account.update', $account->id] + : ['admin.account.store'], + 'method' => $account->id + ? 'put' + : 'post' +]) !!} +
+
+ {!! Form::label('username', 'Username') !!} +
+ {!! Form::text('username', $account->username, ['class' => 'form-control', 'placeholder' => 'Username']); !!} +
+ @ {{ config('app.sip_domain') }} +
+
+
+
+ +
+
+ {!! Form::label('password', ($account->id) ? 'Password (fill to change)' : 'Password') !!} + {!! Form::password('password', ['class' => 'form-control', 'placeholder' => 'Password']); !!} +
+ {!! Form::checkbox('password_sha256', 'checked', $account->sha256Password, ['class' => 'form-check-input']) !!} + {!! Form::label('password_sha256', 'Use a SHA-256 encrypted password', ['class' => 'form-check-label']) !!} +
+
+
+ +
+ +
+
+

Optional

+
+
+ {!! Form::label('email', 'Email') !!} + {!! Form::email('email', $account->email, ['class' => 'form-control', 'placeholder' => 'Email']); !!} +
+ +
+ {!! Form::label('phone', 'Phone') !!} + {!! Form::text('phone', $account->phone, ['class' => 'form-control', 'placeholder' => '+12123123']); !!} +
+
+ +{!! Form::submit(($account->id) ? 'Update' : 'Create', ['class' => 'btn btn-danger btn-centered']) !!} +{!! Form::close() !!} + +@endsection \ No newline at end of file diff --git a/flexiapi/resources/views/admin/account/delete.blade.php b/flexiapi/resources/views/admin/account/delete.blade.php index 0459ffd..cab8592 100644 --- a/flexiapi/resources/views/admin/account/delete.blade.php +++ b/flexiapi/resources/views/admin/account/delete.blade.php @@ -4,6 +4,9 @@ + @endsection diff --git a/flexiapi/resources/views/admin/account/index.blade.php b/flexiapi/resources/views/admin/account/index.blade.php index 9f60537..1a0e1e3 100644 --- a/flexiapi/resources/views/admin/account/index.blade.php +++ b/flexiapi/resources/views/admin/account/index.blade.php @@ -8,6 +8,7 @@
+ Create

Accounts

@@ -28,29 +29,31 @@ - + @foreach ($accounts as $account) - + diff --git a/flexiapi/resources/views/admin/account/show.blade.php b/flexiapi/resources/views/admin/account/show.blade.php index 61d285e..7eb2108 100644 --- a/flexiapi/resources/views/admin/account/show.blade.php +++ b/flexiapi/resources/views/admin/account/show.blade.php @@ -4,42 +4,44 @@ - + @endsection @section('content') +Delete +Edit +

Account

Id: {{ $account->id }}
Identifier: {{ $account->identifier }}
- Email: {{ $account->email }}

+ Email:{{ $account->email }}
+ Phone number:@if ($account->alias) {{ $account->phone }} @else No number @endif

-@if ($account->alias) -

Alias: {{ $account->alias->alias }}

-@else -

No alias

+@if ($account->sha256Password) + SHA256 @endif -

- @if ($account->activated) - Activated Deactivate - @else - Unactivated Activate - @endif -

+
-

- @if ($account->admin) - Admin Remove admin role - @else - Not Admin Add admin role - @endif -

+@if ($account->activated) + ActivatedDeactivate +@else + UnactivatedActivate +@endif -Delete the account +
+ +@if ($account->admin) + AdminRemove admin role +@else + Not AdminAdd admin role +@endif @if ($account->confirmation_key)

Provisioning

@@ -50,6 +52,14 @@

The following link can only be visited once

+

+ Renew the provision link + The current one will be unavailable +

+@else +

+ Generate a provision link +

@endif @endsection \ No newline at end of file diff --git a/flexiapi/resources/views/api/documentation_markdown.blade.php b/flexiapi/resources/views/api/documentation_markdown.blade.php index 3e81821..20a2a9b 100644 --- a/flexiapi/resources/views/api/documentation_markdown.blade.php +++ b/flexiapi/resources/views/api/documentation_markdown.blade.php @@ -165,7 +165,7 @@ JSON parameters: * `username` unique username, minimum 6 characters * `password` required minimum 6 characters * `algorithm` required, values can be `SHA-256` or `MD5` -* `domain` optional, the value is set to the default registration domain if not set +* `domain` **not configurable** the value is enforced to the default registration domain set in the global configuration * `activated` optional, a boolean, set to `false` by default * `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 diff --git a/flexiapi/routes/web.php b/flexiapi/routes/web.php index 2a590a6..104897e 100644 --- a/flexiapi/routes/web.php +++ b/flexiapi/routes/web.php @@ -64,17 +64,27 @@ Route::group(['middleware' => 'auth'], function () { }); Route::group(['middleware' => 'auth.admin'], function () { - Route::get('admin/accounts/{search?}', 'Admin\AccountController@index')->name('admin.account.index'); - Route::post('admin/search', 'Admin\AccountController@search')->name('admin.account.search'); - Route::post('admin/api_key', 'Admin\AccountController@generateApiKey')->name('admin.api_key.generate'); - Route::get('admin/accounts/show/{id}', 'Admin\AccountController@show')->name('admin.account.show'); - Route::get('admin/accounts/{id}/activate', 'Admin\AccountController@activate')->name('admin.account.activate'); - Route::get('admin/accounts/{id}/deactivate', 'Admin\AccountController@deactivate')->name('admin.account.deactivate'); - Route::get('admin/accounts/{id}/admin', 'Admin\AccountController@admin')->name('admin.account.admin'); + Route::get('admin/accounts/{account}/show', 'Admin\AccountController@show')->name('admin.account.show'); + + Route::get('admin/accounts/{account}/activate', 'Admin\AccountController@activate')->name('admin.account.activate'); + Route::get('admin/accounts/{account}/deactivate', 'Admin\AccountController@deactivate')->name('admin.account.deactivate'); + + Route::get('admin/accounts/{account}/admin', 'Admin\AccountController@admin')->name('admin.account.admin'); Route::get('admin/accounts/{id}/unadmin', 'Admin\AccountController@unadmin')->name('admin.account.unadmin'); - Route::get('admin/accounts/{id}/delete', 'Admin\AccountController@delete')->name('admin.account.delete'); + Route::get('admin/accounts/{account}/provision', 'Admin\AccountController@provision')->name('admin.account.provision'); + + Route::get('admin/accounts/create', 'Admin\AccountController@create')->name('admin.account.create'); + Route::post('admin/accounts', 'Admin\AccountController@store')->name('admin.account.store'); + + Route::get('admin/accounts/{account}/edit', 'Admin\AccountController@edit')->name('admin.account.edit'); + Route::put('admin/accounts/{id}', 'Admin\AccountController@update')->name('admin.account.update'); + + Route::get('admin/accounts/{account}/delete', 'Admin\AccountController@delete')->name('admin.account.delete'); Route::delete('admin/accounts', 'Admin\AccountController@destroy')->name('admin.account.destroy'); + + Route::get('admin/accounts/{search?}', 'Admin\AccountController@index')->name('admin.account.index'); + Route::post('admin/accounts/search', 'Admin\AccountController@search')->name('admin.account.search'); }); \ No newline at end of file diff --git a/flexiapi/tests/Feature/AccountApiTest.php b/flexiapi/tests/Feature/AccountApiTest.php index 3d5b8a7..875bfde 100644 --- a/flexiapi/tests/Feature/AccountApiTest.php +++ b/flexiapi/tests/Feature/AccountApiTest.php @@ -85,6 +85,9 @@ class AccountApiTest extends TestCase public function testDomain() { + $configDomain = 'sip.domain.com'; + config()->set('app.sip_domain', $configDomain); + $admin = Admin::factory()->create(); $password = $admin->account->passwords()->first(); $username = 'foobar'; @@ -104,7 +107,7 @@ class AccountApiTest extends TestCase ->assertJson([ 'id' => 2, 'username' => $username, - 'domain' => $domain, + 'domain' => $configDomain, 'activated' => false ]); diff --git a/flexisip-account-manager.spec b/flexisip-account-manager.spec index cd0749a..5ee77e6 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 88 +%define build_number 89 %define var_dir /var/opt/belledonne-communications %define opt_dir /opt/belledonne-communications/share/flexisip-account-manager
# Identifier (email) Created
- {{ $account->id }} -
+
+ + {{ $account->identifier }} + + + @if ($account->email) + Email + @endif @if ($account->activated) Activated - @else - Unactivated @endif @if ($account->admin) -
Admin + Admin @endif - -
{{ $account->identifier }} - @if ($account->email) - ({{ $account->email }}) + @if ($account->sha256Password) + SHA256 @endif {{ $account->creation_time}}