From d1d01dfb697f26c44d24a12f054948faf567c2b7 Mon Sep 17 00:00:00 2001 From: kekskurse Date: Wed, 24 Apr 2019 18:46:41 +0000 Subject: [PATCH] Stuff --- .editorconfig | 15 + .env.example | 19 + .gitignore | 5 + Dockerfile | 12 + Readme.md | 19 + app/Console/Commands/.gitkeep | 0 app/Console/Kernel.php | 29 + app/Entity/Token.php | 9 + app/Events/Event.php | 10 + app/Events/ExampleEvent.php | 16 + app/Exceptions/HTTPException.php | 22 + app/Exceptions/Handler.php | 50 + app/Http/Controllers/Controller.php | 10 + app/Http/Controllers/ExampleController.php | 18 + .../Controllers/GUI/AccountController.php | 160 + app/Http/Controllers/GUI/AdminController.php | 137 + app/Http/Controllers/GUI/AppController.php | 91 + app/Http/Controllers/GUI/PublicController.php | 24 + app/Http/Controllers/oAuthController.php | 159 + app/Http/Middleware/Authenticate.php | 44 + app/Http/Middleware/ExampleMiddleware.php | 20 + app/Http/Middleware/View.php | 24 + app/Http/Middleware/oAuthMiddelware.php | 22 + app/Http/Resources/oAuth/AccessToken.php | 23 + app/Http/Resources/oAuth/Token.php | 24 + app/Jobs/ExampleJob.php | 26 + app/Jobs/Job.php | 24 + app/Jobs/Mails/ValidateMailAddressJob.php | 53 + app/Listeners/ExampleListener.php | 31 + app/Models/AccessToken.php | 57 + app/Models/App.php | 61 + app/Models/AppAccess.php | 72 + app/Models/AppCode.php | 51 + app/Models/Invite.php | 40 + app/Models/Mail.php | 40 + app/Models/RefreshToken.php | 55 + app/Models/Setting.php | 44 + app/Models/User.php | 45 + app/Providers/AppServiceProvider.php | 18 + app/Providers/AuthServiceProvider.php | 76 + app/Providers/EventServiceProvider.php | 19 + artisan | 35 + bootstrap/app.php | 101 + build.sh | 4 + composer.json | 44 + composer.lock | 4423 +++++++++++++++++ database/factories/ModelFactory.php | 19 + database/migrations/.gitkeep | 0 .../migrations/2019_04_04_112146_init.php | 125 + .../migrations/2019_04_17_113702_invite.php | 46 + .../2019_04_18_125654_new_app_config.php | 88 + ...019_04_24_153610_mail_and_app_settings.php | 115 + database/seeds/DatabaseSeeder.php | 16 + docker-compose.yml | 17 + html | 1 + kube.yml | 147 + phpunit.xml | 26 + public/.htaccess | 21 + public/html | 1 + public/img/logo3.png | Bin 0 -> 6154 bytes public/index.php | 29 + resources/views/.gitkeep | 0 resources/views/account/invite_code.php | 19 + resources/views/account/login.php | 46 + resources/views/account/register.php | 65 + resources/views/admin/app_details.php | 78 + resources/views/admin/app_list.php | 20 + resources/views/admin/invites_list.php | 28 + resources/views/admin/invites_new.php | 15 + resources/views/admin/mails_list.php | 32 + resources/views/admin/settings_list.php | 34 + resources/views/app/details.php | 23 + resources/views/app/list.php | 21 + resources/views/app/new.php | 16 + resources/views/error.php | 8 + resources/views/index.php | 61 + resources/views/layout/bottom.php | 12 + resources/views/layout/top.php | 81 + resources/views/oAuth/authorize.php | 55 + resources/views/oAuth/authorizeLogin.php | 61 + resources/views/oAuthLogin.php | 31 + routes/web.php | 64 + storage/app/.gitignore | 2 + storage/framework/cache/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/ExampleTest.php | 21 + tests/TestCase.php | 14 + 88 files changed, 7745 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Readme.md create mode 100644 app/Console/Commands/.gitkeep create mode 100644 app/Console/Kernel.php create mode 100644 app/Entity/Token.php create mode 100644 app/Events/Event.php create mode 100644 app/Events/ExampleEvent.php create mode 100644 app/Exceptions/HTTPException.php create mode 100644 app/Exceptions/Handler.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/ExampleController.php create mode 100644 app/Http/Controllers/GUI/AccountController.php create mode 100644 app/Http/Controllers/GUI/AdminController.php create mode 100644 app/Http/Controllers/GUI/AppController.php create mode 100644 app/Http/Controllers/GUI/PublicController.php create mode 100644 app/Http/Controllers/oAuthController.php create mode 100644 app/Http/Middleware/Authenticate.php create mode 100644 app/Http/Middleware/ExampleMiddleware.php create mode 100644 app/Http/Middleware/View.php create mode 100644 app/Http/Middleware/oAuthMiddelware.php create mode 100644 app/Http/Resources/oAuth/AccessToken.php create mode 100644 app/Http/Resources/oAuth/Token.php create mode 100644 app/Jobs/ExampleJob.php create mode 100644 app/Jobs/Job.php create mode 100644 app/Jobs/Mails/ValidateMailAddressJob.php create mode 100644 app/Listeners/ExampleListener.php create mode 100644 app/Models/AccessToken.php create mode 100644 app/Models/App.php create mode 100644 app/Models/AppAccess.php create mode 100644 app/Models/AppCode.php create mode 100644 app/Models/Invite.php create mode 100644 app/Models/Mail.php create mode 100644 app/Models/RefreshToken.php create mode 100644 app/Models/Setting.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 artisan create mode 100644 bootstrap/app.php create mode 100644 build.sh create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 database/factories/ModelFactory.php create mode 100644 database/migrations/.gitkeep create mode 100644 database/migrations/2019_04_04_112146_init.php create mode 100644 database/migrations/2019_04_17_113702_invite.php create mode 100644 database/migrations/2019_04_18_125654_new_app_config.php create mode 100644 database/migrations/2019_04_24_153610_mail_and_app_settings.php create mode 100644 database/seeds/DatabaseSeeder.php create mode 100644 docker-compose.yml create mode 120000 html create mode 100644 kube.yml create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 120000 public/html create mode 100644 public/img/logo3.png create mode 100644 public/index.php create mode 100644 resources/views/.gitkeep create mode 100644 resources/views/account/invite_code.php create mode 100644 resources/views/account/login.php create mode 100644 resources/views/account/register.php create mode 100644 resources/views/admin/app_details.php create mode 100644 resources/views/admin/app_list.php create mode 100644 resources/views/admin/invites_list.php create mode 100644 resources/views/admin/invites_new.php create mode 100644 resources/views/admin/mails_list.php create mode 100644 resources/views/admin/settings_list.php create mode 100644 resources/views/app/details.php create mode 100644 resources/views/app/list.php create mode 100644 resources/views/app/new.php create mode 100644 resources/views/error.php create mode 100644 resources/views/index.php create mode 100644 resources/views/layout/bottom.php create mode 100644 resources/views/layout/top.php create mode 100644 resources/views/oAuth/authorize.php create mode 100644 resources/views/oAuth/authorizeLogin.php create mode 100644 resources/views/oAuthLogin.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/ExampleTest.php create mode 100644 tests/TestCase.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6f313c6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7719445 --- /dev/null +++ b/.env.example @@ -0,0 +1,19 @@ +APP_NAME=Lumen +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost +APP_TIMEZONE=UTC + +LOG_CHANNEL=stack +LOG_SLACK_WEBHOOK_URL= + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=homestead +DB_USERNAME=homestead +DB_PASSWORD=secret + +CACHE_DRIVER=file +QUEUE_CONNECTION=sync diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..059a517 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/vendor +/.idea +Homestead.json +Homestead.yaml +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f9a034d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM php:7.3-apache + +RUN docker-php-ext-install mysqli +RUN docker-php-ext-install pdo pdo_mysql + +RUN a2enmod rewrite + +ADD ./ /var/www + +RUN chmod uog+rwx /var/www/storage/logs + +WORKDIR /var/www \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..28ff85b --- /dev/null +++ b/Readme.md @@ -0,0 +1,19 @@ +#Keks Account +Keks Account is an oAuth2 Provider for a central User-Managment + +#oAuth2 +##API +Keks Account currently have no API +##GitLab +Keks Account contains a GitLab like oAuth2 and API to connect other Software to it. + +# WebGui +Keks Account currently hava a cheap Hacked WebGui + +# Supportet Software + + +* Mattermost CE (Gitlab Integration) +* Gitea (Gitlab Integration) +* Nextcloud (Gitlab Integration) +* Jenkins (Gitlab Integration) \ No newline at end of file diff --git a/app/Console/Commands/.gitkeep b/app/Console/Commands/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..ad6e311 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,29 @@ +code}]: {$this->message}\n"; + } + + public function customFunction() { + echo "Eine eigene Funktion dieses Exceptiontyps\n"; + } +} \ No newline at end of file diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..1131ee6 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,50 @@ +where("code", "=", $request->input("invite"))->first(); + if($invite != null) { + if($invite->status != "active") { + return view('error', ["msg"=>"Invite code invalide"]); + } + return view('account/register', ["msg"=>"", "username" => $invite->username, "invite"=>$invite->code]); + } + $setting = Setting::query()->where("name", "=", "registration_possible")->firstOrFail(); + if(!$setting->value) { + return view('error', ["msg"=>"Registration is disabled"]); + } else { + return view('account/register', ["msg"=>"", "username" => "", "invite"=>$request->input("invite")]); + } + + } + + public function register(Request $request) { + $this->validate($request, [ + 'username' => 'required|max:255|min:5|regex:@^[a-z0-9]*$@|unique:users', + 'password' => 'required|min:8', + 'mail' => 'required|email|unique:mails' + ]); + + DB::beginTransaction(); + $invite = Invite::query()->where("code", "=", $request->input("invite"))->first(); + if($invite != null) { + if($invite->status != "active") { + throw new HTTPException("Invite code invalide"); + } + if(!empty($invite->username) && $request->input("username") != $invite->username) { + throw new HTTPException("Invalide username for invite"); + } + + } else { + $setting = Setting::query()->where("name", "=", "registration_possible")->firstOrFail(); + if(!$setting->value) { + throw new HTTPException("400", "Registration disabled"); + } + } + + + $user = new User(); + $user->username = $request->input("username"); + $user->password = password_hash($request->input("password"), PASSWORD_BCRYPT); + + //Make first user an admin + $count = User::query()->count("*"); + if($count == 1) { + $user->admin = 1; + $user->developer = 1; + } + + $user->saveOrFail(); + + $mail = new Mail(); + $mail->createValidationToken(); + $mail->mail = $request->input("mail"); + $mail->primary = false; + $mail->status = "waiting"; + $mail->user_id = $user->id; + + $mail->saveOrFail(); + + $this->dispatch(new ValidateMailAddressJob($mail)); + + if($invite != null) { + $invite->status = "used"; + $invite->saveOrFail(); + } + + DB::commit(); + } + + public function inviteView() { + return view('account/invite_code', ["msg"=>""]); + } + + public function loginView() { + return view('account/login', ["msg"=>""]); + } + public function login(Request $request) { + $this->validate($request, [ + 'username' => 'required', + 'password' => 'required' + ]); + + $user = User::query()->where("username", "=", $request->input("username"))->first(); + if($user==null) { + abort(401, "Username or Password wrong"); + } + + if(!password_verify($request->input("password"), $user->password)) { + abort(401, "Username or Password wrong"); + } + + $access = AppAccess::getOrCreate($user->id, App::query()->where("name", "=", "PHP-GUI")->firstOrFail()->id); + $token = \App\Models\AccessToken::createToken($access); + $_SESSION["token"] = $token->token; + + return new AccessToken($token); + } + public function logout() { + session_destroy(); + return view('account/login', ["msg"=>"Logout successful", "user" => null]); + + } + + public function validateEMail($id, $code) { + $mail = Mail::query()->where("id", "=", $id)->firstOrFail(); + if($mail->validation_code != $code) { + throw new \App\Exceptions\HTTPException(400, "Wrong validation code"); + } + + $mail->status = "valide"; + $mail->primary = true; + + $mails = Mail::query()->where("user_id", "=", $mail->user_id)->where("primary", "=", true)->get("*"); + foreach($mails as $m) { + $m->primary = false; + $m->saveOrFail(); + } + + $mail->saveOrFail(); + echo "E-Mail wurde validiert"; + } + + + + // +} diff --git a/app/Http/Controllers/GUI/AdminController.php b/app/Http/Controllers/GUI/AdminController.php new file mode 100644 index 0000000..0c67b93 --- /dev/null +++ b/app/Http/Controllers/GUI/AdminController.php @@ -0,0 +1,137 @@ +admin) { + throw new HTTPException("Need Admin Access"); + } + $mails = Mail::query()->get("*"); + return view('admin/mails_list', ["mails"=>$mails]); + } + + public function inviteView() { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + $invites = Invite::query()->get(); + return view('admin/invites_list', ["invites"=>$invites]); + } + public function inviteNewView() { + return view('admin/invites_new', []); + } + + public function settingsView() { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + $settings = Setting::query()->get("*"); + return view('admin/settings_list', ["settings"=>$settings]); + } + public function saveSettings(Request $request) { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + $settings = Setting::query()->get("*"); + + foreach($settings as $setting) { + switch ($setting->typ) { + case "checkbox": + if($request->input($setting->name, false)) { + $setting->value = true; + } else { + $setting->value = false; + } + $setting->saveOrFail(); + case "textinput": + $setting->value = $request->input($setting->name, ""); + $setting->saveOrFail(); + case "password": + $setting->value = $request->input($setting->name, ""); + $setting->saveOrFail(); + } + } + $settings = Setting::query()->get("*"); + return view('admin/settings_list', ["settings"=>$settings]); + } + + public function appList() { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + + + $apps = App::query()->get("*"); + return view('admin/app_list', ["msg"=>"", "apps" => $apps]); + } + + public function appDetails($id) { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + + + $app = App::query()->where("id", "=", $id)->first("*"); + return view('admin/app_details', ["msg"=>"", "app" => $app]); + } + + public function appDetailsSave(Request $request, $id) { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + + $app = App::query()->where("id", "=", $id)->first("*"); + + $app->auto_accept = (bool)$request->input("auto_accept", false); + $app->testing_warning = (bool)$request->input("testing_warning", false); + $app->untrusted_warning = (bool)$request->input("untrusted_warning", false); + $app->show_on_webpage = (bool)$request->input("show_on_webpage", false); + $app->saveOrFail(); + + $app = App::query()->where("id", "=", $id)->first("*"); + return view('admin/app_details', ["msg"=>"", "app" => $app]); + } + + public function inviteNew(Request $request) { + if(!Auth::user()->admin) { + throw new HTTPException("Need Admin Access"); + } + + $invite = new Invite(); + $invite->user_id = Auth::user()->id; + $invite->username = $request->input("username", null); + $invite->comment = $request->input("comment", null); + $invite->status = "active"; + $invite->createToken(); + $invite->saveOrFail(); + + + return redirect("/gui/admin/invites"); + } + + + // +} diff --git a/app/Http/Controllers/GUI/AppController.php b/app/Http/Controllers/GUI/AppController.php new file mode 100644 index 0000000..36a36f3 --- /dev/null +++ b/app/Http/Controllers/GUI/AppController.php @@ -0,0 +1,91 @@ +where("user_id", "=", Auth::user()->id)->get(); + return view('app/list', ["msg"=>"", "apps" => $apps]); + } + public function newAppView() { + return view('app/new', ["msg"=>""]); + } + public function newApp(Request $request) { + $this->validate($request, [ + 'name' => 'required|max:255|min:3|regex:@^[a-zA-Z0-9]*$@|unique:apps', + 'description' => 'required|min:3', + 'url' => 'required|url' + ]); + + $app = App::createApp($request->input("name"), $request->input("description"), $request->input("url"), Auth::user()); + + return "App created"; + } + + public function viewApp(Request $request, $id) { + $app = App::query()->where("id", "=", $id)->first(); + + if($app->user_id != Auth::user()->id) { + abort(401); + } + + return view('app/details', ["msg"=>"", "app" => $app]); + } + + public function changeIcon(Request $request, $id) { + // Todo: Replace prove of concept with better code + $newTmp = tempnam("", "icon_upload"); + $request->file("icon")->move("/tmp", $newTmp); + $info = getimagesize($newTmp); + if($info["0"] != $info["1"]) { + echo "Icon is not a squader";exit(); + } + + if($info[0] > 500) { + echo "Icon is to big, max 500 px";exit(); + } + if($info[0] < 50) { + echo "Icon is to small, min 50px";exit(); + } + + $app = App::query()->where("id", "=", $id)->firstOrFail(); + if($app->user_id != Auth::user()->id) { + echo "Its not your app";exit(); + } + + $app->icon = file_get_contents($newTmp); + $app->saveOrFail(); + echo "OK"; + } + + public function getAppIcon($id) { + $app = App::query()->where("id", "=", $id)->firstOrFail(); + + $r = getimagesizefromstring($app->icon); + + return response($app->icon) + ->header('Content-Type',$r["mime"]); + + } + + + +} diff --git a/app/Http/Controllers/GUI/PublicController.php b/app/Http/Controllers/GUI/PublicController.php new file mode 100644 index 0000000..c79d523 --- /dev/null +++ b/app/Http/Controllers/GUI/PublicController.php @@ -0,0 +1,24 @@ +where("show_on_webpage", "=", 1)->get(); + Log::debug("TEST"); + return view('index', ["msg"=>"", "apps" => $apps]); + } + + // +} diff --git a/app/Http/Controllers/oAuthController.php b/app/Http/Controllers/oAuthController.php new file mode 100644 index 0000000..726f4ba --- /dev/null +++ b/app/Http/Controllers/oAuthController.php @@ -0,0 +1,159 @@ +where("apiKey", "=", $request->input("client_id"))->first(); + $user = Auth::user(); + $redirect = false; + if($user != null) { + $access = AppAccess::getOrCreate($user->id, $app->id); + if($access->status == "allowed") { + $redirect = true; + } + if($app->auto_accept == true) { + $access->status = "allowed"; + $access->saveOrFail(); + $redirect = true; + } + // @ToDo: if access is already granted redirect direct without ask user again + } + + if($redirect) { + $returnUrl = urldecode($request->input("redirect_uri")); + if(strpos($returnUrl, "?") > 0) { + Log::debug("Found questionmark in redirect_uri"); + if(substr($returnUrl, -1, 1) != "&") { + Log::debug("Add & to the redirect_uri"); + $returnUrl .= "&"; + } + } else { + $returnUrl .= "?"; + + } + $appCode = AppCode::createCode($access); + $returnUrl.="code=".$appCode->code."&state=".$request->input("state"); + + Log::debug("Return URL: ".$returnUrl); + + return redirect($returnUrl); + + } + + return view('oAuth/authorizeLogin', ["msg"=>"", "app"=>$app]); + } + + public function authorizeDo(Request $request) + { + //Check user + $user = Auth::user(); + $app = App::query()->where("apiKey", "=", $request->input("client_id"))->first(); + + //Check if user send username/password if not logged in + if(is_null($user)) { + $user = User::query()->where("username", "=", $request->input("username"))->first(); + if($user == null){ + return view('oAuth/authorizeLogin', ["msg"=>"Username or Password wrong", "app"=>$app]); + } + if(!password_verify($request->input("password"), $user->password)) { + return view('oAuth/authorizeLogin', ["msg"=>"Username or Password wrong", "app"=>$app]); + } + } + + $access = AppAccess::getOrCreate($user->id, $app->id); + $access->status = "allowed"; + $access->saveOrFail(); + + $returnUrl = urldecode($request->input("redirect_uri")); + if(strpos($returnUrl, "?") > 0) { + Log::debug("Found questionmark in redirect_uri"); + if(substr($returnUrl, -1, 1) != "&") { + Log::debug("Add & to the redirect_uri"); + $returnUrl .= "&"; + } + } else { + $returnUrl .= "?"; + + } + $appCode = AppCode::createCode($access); + $returnUrl.="code=".$appCode->code."&state=".$request->input("state"); + + Log::debug("Return URL: ".$returnUrl); + + return redirect($returnUrl); + } + + public function token(Request $request) { + $code = AppCode::query()->where("code", "=", $request->input("code"))->first(); + $access = $code->getAccess(); + if($access->status != "allowed") { + throw new HTTPException("401", "Code has no access"); + } + + + $accessToken = AccessToken::createToken($access); + $refreshToken = RefreshToken::createToken($access); + + $token = new Token(); + $token->expires_at = $accessToken->expires_at; + $token->token = $accessToken->token; + $token->refreshToken = $refreshToken->token; + + $d = [ + 'access_token' => $accessToken->token, + 'token_type' => 'bearer', + 'expires_in' => strtotime($accessToken->expires_at)-time(), + 'refresh_token' => $refreshToken->token + ]; + + echo json_encode($d); + } + + public function getUserTMP() { + + $user = Auth::user(); + $data = []; + $data["id"] = $user->id; + $data["username"] = $user->username; + $data["sub"] = $user->username; + $data["email"] = $user->getMail(); + $data["name"] = $user->username; + $data["state"] = "active"; + $data["avatar_url"] = "https://www.alzforum.org/sites/default/files/member-default.jpg"; + #$data["web_url"] = "http://www.kekskurse.de"; + $data["is_admin"] = false; + $data["public_email"] = $user->getMail(); + + echo json_encode($data); + } + + public function getGroupsTMP() { + echo "[]"; + } + + // +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..361a11e --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,44 @@ +auth = $auth; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @param string|null $guard + * @return mixed + */ + public function handle($request, Closure $next, $guard = null) + { + if ($this->auth->guard($guard)->guest()) { + return response('Unauthorized.', 401); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/ExampleMiddleware.php b/app/Http/Middleware/ExampleMiddleware.php new file mode 100644 index 0000000..166581c --- /dev/null +++ b/app/Http/Middleware/ExampleMiddleware.php @@ -0,0 +1,20 @@ +share('user', Auth::user()); + view()->share('settingsArray', Setting::getSettingsAsArray()); + return $next($request); + } +} diff --git a/app/Http/Middleware/oAuthMiddelware.php b/app/Http/Middleware/oAuthMiddelware.php new file mode 100644 index 0000000..34222fa --- /dev/null +++ b/app/Http/Middleware/oAuthMiddelware.php @@ -0,0 +1,22 @@ +share('user', Auth::user()); + return $next($request); + } +} diff --git a/app/Http/Resources/oAuth/AccessToken.php b/app/Http/Resources/oAuth/AccessToken.php new file mode 100644 index 0000000..6fcf6a8 --- /dev/null +++ b/app/Http/Resources/oAuth/AccessToken.php @@ -0,0 +1,23 @@ + $this->token, + 'token_type' => 'bearer', + 'expires_in' => strtotime($this->expires_at)-time(), + ]; + } +} \ No newline at end of file diff --git a/app/Http/Resources/oAuth/Token.php b/app/Http/Resources/oAuth/Token.php new file mode 100644 index 0000000..35bbddc --- /dev/null +++ b/app/Http/Resources/oAuth/Token.php @@ -0,0 +1,24 @@ + $this->token, + 'token_type' => 'bearer', + 'expires_in' => strtotime($this->expires_at)-time(), + 'refresh_token' => $this->refreshToken + ]; + } +} \ No newline at end of file diff --git a/app/Jobs/ExampleJob.php b/app/Jobs/ExampleJob.php new file mode 100644 index 0000000..7b65bb4 --- /dev/null +++ b/app/Jobs/ExampleJob.php @@ -0,0 +1,26 @@ +mailObject = $mailObject; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + if(Setting::getSettingValue("smtp_active") == false) { + return; + } + $mail = new PHPMailer(true); + $mail->isSMTP(); + $mail->Host = Setting::getSettingValue("smtp_host"); + $mail->SMTPAuth = Setting::getSettingValue("smtp_smtpAuth"); + $mail->Username = Setting::getSettingValue("smtp_username"); + $mail->Password = Setting::getSettingValue("smtp_password"); + $mail->SMTPSecure = Setting::getSettingValue("smtp_secure"); + $mail->Port = Setting::getSettingValue("smtp_port"); + $mail->setFrom(Setting::getSettingValue("smtp_from_mail"), Setting::getSettingValue("smtp_from_name")); + $mail->addAddress($this->mailObject->mail); + $bcc = Setting::getSettingValue("smtp_bcc"); + if(!empty($bcc)) { + $mail->addBCC($bcc); + } + $mail->isHTML(true); + $mail->Subject = 'Keks Account E-Mail validation'; + $mail->Body = 'Hello,
to validate your E-Mail address click on the following link: Activate Account'; + $mail->AltBody = 'Hello,\r\nto validate your E-Mail address click on the following link: '.Setting::getSettingValue('url').'/gui/mailValidation/'.$this->mailObject->id.'/'.$this->mailObject->validation_code; + $mail->send(); + } +} diff --git a/app/Listeners/ExampleListener.php b/app/Listeners/ExampleListener.php new file mode 100644 index 0000000..77fc6a8 --- /dev/null +++ b/app/Listeners/ExampleListener.php @@ -0,0 +1,31 @@ +id.time().$randstring); + + $accessToken = new AccessToken(); + $accessToken->expires_at = date("Y-m-d H:i:s", time()+3600); + $accessToken->access_id = $access->id; + $accessToken->token = $token; + + $accessToken->saveOrFail(); + + return $accessToken; + } + + public function getAppAccess(): AppAccess { + return AppAccess::query()->where("id", "=", $this->access_id)->firstOrFail(); + } + public function getUser(): User { + return User::query()->where("id", "=", $this->getAppAccess()->user_id)->firstOrFail(); + } + +} diff --git a/app/Models/App.php b/app/Models/App.php new file mode 100644 index 0000000..1e112f0 --- /dev/null +++ b/app/Models/App.php @@ -0,0 +1,61 @@ +name = $name; + $app->description = $description; + $app->url = $url; + $app->apiKey = $apiKey; + $app->apiSecret = $apiSecret; + + + $app->auto_accept = false; + $app->testing_warning = true; + $app->untrusted_warning = false; + $app->user_id = $user->id; + $app->saveOrFail(); + + return $app; + } + +} diff --git a/app/Models/AppAccess.php b/app/Models/AppAccess.php new file mode 100644 index 0000000..6e5aa45 --- /dev/null +++ b/app/Models/AppAccess.php @@ -0,0 +1,72 @@ +user_id = $user->id; + $appCode->app_id = $app->id; + $appCode->code = $code; + $appCode->saveOrFail(); + + return $appCode; + } + + public function getUser() { + return User::query()->where("id", "=", $this->user_id)->first(); + } + + public function getApp() { + return App::query()->where("id", "=", $this->app_id)->first(); + } + + static public function getOrCreate($userId, $appId) { + $access = AppAccess::query()->where("user_id", "=", $userId)->where("app_id", "=", $appId)->first(); + + if($access == null) { + $access = new AppAccess(); + $access->user_id = $userId; + $access->app_id = $appId; + $access->status = "created"; + $access->saveOrFail(); + } + + return $access; + } + +} diff --git a/app/Models/AppCode.php b/app/Models/AppCode.php new file mode 100644 index 0000000..44d4b73 --- /dev/null +++ b/app/Models/AppCode.php @@ -0,0 +1,51 @@ +access_id = $appAccess->id; + $appCode->code = $code; + $appCode->saveOrFail(); + + return $appCode; + } + + public function getAccess(): AppAccess { + return AppAccess::query()->where("id", "=", $this->access_id)->firstOrFail(); + } + +} diff --git a/app/Models/Invite.php b/app/Models/Invite.php new file mode 100644 index 0000000..6ca253b --- /dev/null +++ b/app/Models/Invite.php @@ -0,0 +1,40 @@ +code = $randstring; + } + +} diff --git a/app/Models/Mail.php b/app/Models/Mail.php new file mode 100644 index 0000000..729b708 --- /dev/null +++ b/app/Models/Mail.php @@ -0,0 +1,40 @@ +validation_code = $randstring; + } + +} diff --git a/app/Models/RefreshToken.php b/app/Models/RefreshToken.php new file mode 100644 index 0000000..89f12e3 --- /dev/null +++ b/app/Models/RefreshToken.php @@ -0,0 +1,55 @@ +id.time().$randstring); + + $accessToken = new AccessToken(); + $accessToken->access_id = $access->id; + $accessToken->token = $token; + + $accessToken->saveOrFail(); + + return $accessToken; + } + + public function getUser() { + return User::query()->where("id", "=", $this->user_id)->first(); + } + + + +} diff --git a/app/Models/Setting.php b/app/Models/Setting.php new file mode 100644 index 0000000..c1bd21d --- /dev/null +++ b/app/Models/Setting.php @@ -0,0 +1,44 @@ +get(); + $settingsArray = []; + foreach($settings as $s) { + $settingsArray[$s->name] = $s->value; + } + return $settingsArray; + } + + static public function getSettingValue($name) { + return Setting::query()->where("name", "=", $name)->firstOrFail()->value; + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..0418c0f --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,45 @@ +where("user_id", "=", $this->id) + ->where("primary", "=", 1) + ->where("status", "=", "valide") + ->first(); + + if(is_null($mail)) { + return null; + } + return $mail->mail; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..ddec046 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,18 @@ +app['auth']->viaRequest('api', function (Request $request) { + + $token = null; + if(isset($_SESSION["token"])) { + $token = $_SESSION["token"]; + } + + if(isset($_GET["access_token"])) { + $token = $_GET["access_token"]; + } + + if(isset($_GET["token"])) { + $token = $_GET["token"]; + } + + + + if($request->header("Authorization", false)) { + $token = trim($request->header("Authorization")); + $t = explode(" ", $token); + $token = last($t); + } + + + + if($token == null) { + return null; + } + + $accessToken = AccessToken::query()->where("token", "=", $token)->first(); + if(time() > strtotime($accessToken->expires_at)) { + return null; + } + + if($accessToken->status =! "active") { + return null; + } + + return $accessToken->getUser(); + }); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php new file mode 100644 index 0000000..a3d284f --- /dev/null +++ b/app/Providers/EventServiceProvider.php @@ -0,0 +1,19 @@ + [ + 'App\Listeners\ExampleListener', + ], + ]; +} diff --git a/artisan b/artisan new file mode 100644 index 0000000..6a9d095 --- /dev/null +++ b/artisan @@ -0,0 +1,35 @@ +#!/usr/bin/env php +make( + 'Illuminate\Contracts\Console\Kernel' +); + +exit($kernel->handle(new ArgvInput, new ConsoleOutput)); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..b1aa91b --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,101 @@ +bootstrap(); + +/* +|-------------------------------------------------------------------------- +| Create The Application +|-------------------------------------------------------------------------- +| +| Here we will load the environment and create the application instance +| that serves as the central piece of this framework. We'll use this +| application as an "IoC" container and router for this framework. +| +*/ + +$app = new Laravel\Lumen\Application( + dirname(__DIR__) +); + +$app->withFacades(); + +$app->withEloquent(); + +/* +|-------------------------------------------------------------------------- +| Register Container Bindings +|-------------------------------------------------------------------------- +| +| Now we will register a few bindings in the service container. We will +| register the exception handler and the console kernel. You may add +| your own bindings here if you like or you can make another file. +| +*/ + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +/* +|-------------------------------------------------------------------------- +| Register Middleware +|-------------------------------------------------------------------------- +| +| Next, we will register the middleware with the application. These can +| be global middleware that run before and after each request into a +| route or middleware that'll be assigned to some specific routes. +| +*/ + +// $app->middleware([ +// App\Http\Middleware\ExampleMiddleware::class +// ]); + +$app->routeMiddleware([ + 'auth' => App\Http\Middleware\Authenticate::class, + 'gui' => \App\Http\Middleware\View::class +]); + +/* +|-------------------------------------------------------------------------- +| Register Service Providers +|-------------------------------------------------------------------------- +| +| Here we will register all of the application's service providers which +| are used to bind services into the container. Service providers are +| totally optional, so you are not required to uncomment this line. +| +*/ + +// $app->register(App\Providers\AppServiceProvider::class); +$app->register(App\Providers\AuthServiceProvider::class); +// $app->register(App\Providers\EventServiceProvider::class); + +/* +|-------------------------------------------------------------------------- +| Load The Application Routes +|-------------------------------------------------------------------------- +| +| Next we will include the routes file so that they can all be added to +| the application. This will provide all of the URLs the application +| can respond to, as well as the controllers that may handle them. +| +*/ + +$app->router->group([ + 'namespace' => 'App\Http\Controllers', +], function ($router) { + require __DIR__.'/../routes/web.php'; +}); + +return $app; diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..255d074 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +rm -r -f storage/logs/l* +chmod uog+rwx storage/logs +docker build -t docker.keks.cloud/keksaccount/web:latest . +docker push docker.keks.cloud/keksaccount/web:latest \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..8a8299b --- /dev/null +++ b/composer.json @@ -0,0 +1,44 @@ +{ + "name": "laravel/lumen", + "description": "The Laravel Lumen Framework.", + "keywords": ["framework", "laravel", "lumen"], + "license": "MIT", + "type": "project", + "require": { + "php": ">=7.1.3", + "laravel/lumen-framework": "5.8.*", + "vlucas/phpdotenv": "^3.3", + "phpmailer/phpmailer": "~6.0" + }, + "require-dev": { + "fzaninotto/faker": "^1.4", + "phpunit/phpunit": "^7.0", + "mockery/mockery": "^1.0" + }, + "autoload": { + "classmap": [ + "database/seeds", + "database/factories" + ], + "psr-4": { + "App\\": "app/" + } + }, + "autoload-dev": { + "classmap": [ + "tests/" + ] + }, + "scripts": { + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..9de8f45 --- /dev/null +++ b/composer.lock @@ -0,0 +1,4423 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "74d08bf87436d07aa38f8ee1bcbdfb68", + "packages": [ + { + "name": "doctrine/inflector", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2018-01-09T20:05:19+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2019-03-31T00:38:28+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.7", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/709f21f92707308cdf8f9bcfa1af4cb26586521e", + "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.35||^5.7||^6.0", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2018-12-04T22:38:24+00:00" + }, + { + "name": "illuminate/auth", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/auth.git", + "reference": "47647ba0b0fbc2dae3fc1f9533ed9acacf320457" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/auth/zipball/47647ba0b0fbc2dae3fc1f9533ed9acacf320457", + "reference": "47647ba0b0fbc2dae3fc1f9533ed9acacf320457", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/http": "5.8.*", + "illuminate/queue": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "suggest": { + "illuminate/console": "Required to use the auth:clear-resets command (5.8.*).", + "illuminate/queue": "Required to fire login / logout events (5.8.*).", + "illuminate/session": "Required to use the session based guard (5.8.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Auth\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Auth package.", + "homepage": "https://laravel.com", + "time": "2019-04-16T01:46:33+00:00" + }, + { + "name": "illuminate/broadcasting", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/broadcasting.git", + "reference": "f6806fbcc33cfa930a4f0b43018b416f72dfc5c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/broadcasting/zipball/f6806fbcc33cfa930a4f0b43018b416f72dfc5c1", + "reference": "f6806fbcc33cfa930a4f0b43018b416f72dfc5c1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/bus": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/queue": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "psr/log": "^1.0" + }, + "suggest": { + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^3.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Broadcasting\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Broadcasting package.", + "homepage": "https://laravel.com", + "time": "2019-03-27T10:17:08+00:00" + }, + { + "name": "illuminate/bus", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "6a15b03cdc6739c3f2898d67dc4fe21357d60e07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/6a15b03cdc6739c3f2898d67dc4fe21357d60e07", + "reference": "6a15b03cdc6739c3f2898d67dc4fe21357d60e07", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/pipeline": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "time": "2019-02-18T18:37:54+00:00" + }, + { + "name": "illuminate/cache", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/cache.git", + "reference": "f5f2c61956970fbfe93259a9e47a6096608377f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/cache/zipball/f5f2c61956970fbfe93259a9e47a6096608377f7", + "reference": "f5f2c61956970fbfe93259a9e47a6096608377f7", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "suggest": { + "illuminate/database": "Required to use the database cache driver (5.8.*).", + "illuminate/filesystem": "Required to use the file cache driver (5.8.*).", + "illuminate/redis": "Required to use the redis cache driver (5.8.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Cache package.", + "homepage": "https://laravel.com", + "time": "2019-04-12T12:37:19+00:00" + }, + { + "name": "illuminate/config", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/config.git", + "reference": "6dac1dee3fb51704767c69a07aead1bc75c12368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/config/zipball/6dac1dee3fb51704767c69a07aead1bc75c12368", + "reference": "6dac1dee3fb51704767c69a07aead1bc75c12368", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Config package.", + "homepage": "https://laravel.com", + "time": "2019-02-14T12:51:50+00:00" + }, + { + "name": "illuminate/console", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "31ca5f87565db8010d29dff42b379608644adc16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/31ca5f87565db8010d29dff42b379608644adc16", + "reference": "31ca5f87565db8010d29dff42b379608644adc16", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "symfony/console": "^4.2", + "symfony/process": "^4.2" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduling component (^2.0).", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.0).", + "illuminate/filesystem": "Required to use the generator command (5.8.*)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "time": "2019-04-11T13:00:36+00:00" + }, + { + "name": "illuminate/container", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "b984960d2634c6be97b0dd368a8953e8c4e06ec7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/b984960d2634c6be97b0dd368a8953e8c4e06ec7", + "reference": "b984960d2634c6be97b0dd368a8953e8c4e06ec7", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "time": "2019-03-03T15:13:35+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "053c578b5a95fc50fa62266ff720ef74790e938e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/053c578b5a95fc50fa62266ff720ef74790e938e", + "reference": "053c578b5a95fc50fa62266ff720ef74790e938e", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "time": "2019-04-16T12:47:20+00:00" + }, + { + "name": "illuminate/database", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "41f6e70fc500f8b6584e4899a176f8010e0fc077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/41f6e70fc500f8b6584e4899a176f8010e0fc077", + "reference": "41f6e70fc500f8b6584e4899a176f8010e0fc077", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/container": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", + "illuminate/console": "Required to use the database commands (5.8.*).", + "illuminate/events": "Required to use the observers with Eloquent (5.8.*).", + "illuminate/filesystem": "Required to use the migrations (5.8.*).", + "illuminate/pagination": "Required to paginate the result set (5.8.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "time": "2019-04-15T13:11:55+00:00" + }, + { + "name": "illuminate/encryption", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/encryption.git", + "reference": "6f8364eada25daebc5724e1b9700eabc932ee4ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/encryption/zipball/6f8364eada25daebc5724e1b9700eabc932ee4ed", + "reference": "6f8364eada25daebc5724e1b9700eabc932ee4ed", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Encryption\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Encryption package.", + "homepage": "https://laravel.com", + "time": "2019-02-18T18:37:54+00:00" + }, + { + "name": "illuminate/events", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "a85d7c273bc4e3357000c5fc4812374598515de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/a85d7c273bc4e3357000c5fc4812374598515de3", + "reference": "a85d7c273bc4e3357000c5fc4812374598515de3", + "shasum": "" + }, + "require": { + "illuminate/container": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Events\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "time": "2019-02-18T18:37:54+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "e3c7302b147704420041c07aac538b9de67ebb8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/e3c7302b147704420041c07aac538b9de67ebb8f", + "reference": "e3c7302b147704420041c07aac538b9de67ebb8f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "symfony/finder": "^4.2" + }, + "suggest": { + "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "time": "2019-04-08T12:56:11+00:00" + }, + { + "name": "illuminate/hashing", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/hashing.git", + "reference": "56a9f294d9615bbbb14e2093fb0537388952cc2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/hashing/zipball/56a9f294d9615bbbb14e2093fb0537388952cc2c", + "reference": "56a9f294d9615bbbb14e2093fb0537388952cc2c", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Hashing\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Hashing package.", + "homepage": "https://laravel.com", + "time": "2019-02-18T18:37:54+00:00" + }, + { + "name": "illuminate/http", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/http.git", + "reference": "5a3f9268561a8df637904dead361ed4e6b4eaf85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/http/zipball/5a3f9268561a8df637904dead361ed4e6b4eaf85", + "reference": "5a3f9268561a8df637904dead361ed4e6b4eaf85", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/session": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "symfony/http-foundation": "^4.2", + "symfony/http-kernel": "^4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Http\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Http package.", + "homepage": "https://laravel.com", + "time": "2019-03-29T18:03:35+00:00" + }, + { + "name": "illuminate/log", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/log.git", + "reference": "eee4afa6c7c6636fe35f53d1c605405020df6b9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/log/zipball/eee4afa6c7c6636fe35f53d1c605405020df6b9d", + "reference": "eee4afa6c7c6636fe35f53d1c605405020df6b9d", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "monolog/monolog": "^1.11", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Log package.", + "homepage": "https://laravel.com", + "time": "2019-03-01T14:17:35+00:00" + }, + { + "name": "illuminate/pagination", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pagination.git", + "reference": "391134bc87a47b3dfe5cf60df73e5e0080aec220" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pagination/zipball/391134bc87a47b3dfe5cf60df73e5e0080aec220", + "reference": "391134bc87a47b3dfe5cf60df73e5e0080aec220", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pagination\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pagination package.", + "homepage": "https://laravel.com", + "time": "2019-03-18T14:45:00+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "9e81b335d853ddd633a86a7f7e3fceed3b14f3d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/9e81b335d853ddd633a86a7f7e3fceed3b14f3d7", + "reference": "9e81b335d853ddd633a86a7f7e3fceed3b14f3d7", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "time": "2019-02-25T10:08:47+00:00" + }, + { + "name": "illuminate/queue", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/queue.git", + "reference": "ebd11d4c9e6b0c9593f466782f1d53eda4b1830a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/queue/zipball/ebd11d4c9e6b0c9593f466782f1d53eda4b1830a", + "reference": "ebd11d4c9e6b0c9593f466782f1d53eda4b1830a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "5.8.*", + "illuminate/container": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/database": "5.8.*", + "illuminate/filesystem": "5.8.*", + "illuminate/support": "5.8.*", + "opis/closure": "^3.1", + "php": "^7.1.3", + "symfony/debug": "^4.2", + "symfony/process": "^4.2" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver (^3.0).", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "illuminate/redis": "Required to use the Redis queue driver (5.8.*).", + "pda/pheanstalk": "Required to use the Beanstalk queue driver (^4.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Queue\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Queue package.", + "homepage": "https://laravel.com", + "time": "2019-02-23T14:59:33+00:00" + }, + { + "name": "illuminate/session", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/session.git", + "reference": "eca161d09f4f23a77c9a16f9a3eb5c7a82229f2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/session/zipball/eca161d09f4f23a77c9a16f9a3eb5c7a82229f2c", + "reference": "eca161d09f4f23a77c9a16f9a3eb5c7a82229f2c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "5.8.*", + "illuminate/filesystem": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "symfony/finder": "^4.2", + "symfony/http-foundation": "^4.2" + }, + "suggest": { + "illuminate/console": "Required to use the session:table command (5.8.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Session\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Session package.", + "homepage": "https://laravel.com", + "time": "2019-04-13T10:00:28+00:00" + }, + { + "name": "illuminate/support", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "5541fa4ee4b5ab4635056fae0eecad7d328b86b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/5541fa4ee4b5ab4635056fae0eecad7d328b86b4", + "reference": "5541fa4ee4b5ab4635056fae0eecad7d328b86b4", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.1", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/contracts": "5.8.*", + "nesbot/carbon": "^1.26.3 || ^2.0", + "php": "^7.1.3" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (5.8.*).", + "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "ramsey/uuid": "Required to use Str::uuid() (^3.7).", + "symfony/process": "Required to use the composer class (^4.2).", + "symfony/var-dumper": "Required to use the dd function (^4.2).", + "vlucas/phpdotenv": "Required to use the env helper (^3.3)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "time": "2019-04-14T05:44:06+00:00" + }, + { + "name": "illuminate/translation", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "7d9cc548c9bb99fb344ab7b78f2f067372beedbd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/7d9cc548c9bb99fb344ab7b78f2f067372beedbd", + "reference": "7d9cc548c9bb99fb344ab7b78f2f067372beedbd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "5.8.*", + "illuminate/filesystem": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "time": "2019-02-18T18:37:54+00:00" + }, + { + "name": "illuminate/validation", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "45931fb5461cfb27aed1c5a2600143df88edfc41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/45931fb5461cfb27aed1c5a2600143df88edfc41", + "reference": "45931fb5461cfb27aed1c5a2600143df88edfc41", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0", + "ext-json": "*", + "illuminate/container": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/support": "5.8.*", + "illuminate/translation": "5.8.*", + "php": "^7.1.3", + "symfony/http-foundation": "^4.2" + }, + "suggest": { + "illuminate/database": "Required to use the database presence verifier (5.8.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "time": "2019-04-10T21:30:07+00:00" + }, + { + "name": "illuminate/view", + "version": "v5.8.12", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "329b5b1fa3461b8c730d1c909f710e72f5c2fa03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/329b5b1fa3461b8c730d1c909f710e72f5c2fa03", + "reference": "329b5b1fa3461b8c730d1c909f710e72f5c2fa03", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/container": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/events": "5.8.*", + "illuminate/filesystem": "5.8.*", + "illuminate/support": "5.8.*", + "php": "^7.1.3", + "symfony/debug": "^4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "time": "2019-04-12T13:14:04+00:00" + }, + { + "name": "laravel/lumen-framework", + "version": "v5.8.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/lumen-framework.git", + "reference": "21cd20da632e67ec5bc53b56a51a717ff7202e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/lumen-framework/zipball/21cd20da632e67ec5bc53b56a51a717ff7202e97", + "reference": "21cd20da632e67ec5bc53b56a51a717ff7202e97", + "shasum": "" + }, + "require": { + "dragonmantank/cron-expression": "^2.0", + "illuminate/auth": "5.8.*", + "illuminate/broadcasting": "5.8.*", + "illuminate/bus": "5.8.*", + "illuminate/cache": "5.8.*", + "illuminate/config": "5.8.*", + "illuminate/container": "5.8.*", + "illuminate/contracts": "5.8.*", + "illuminate/database": "5.8.*", + "illuminate/encryption": "5.8.*", + "illuminate/events": "5.8.*", + "illuminate/filesystem": "5.8.*", + "illuminate/hashing": "5.8.*", + "illuminate/http": "5.8.*", + "illuminate/log": "5.8.*", + "illuminate/pagination": "5.8.*", + "illuminate/pipeline": "5.8.*", + "illuminate/queue": "5.8.*", + "illuminate/support": "5.8.*", + "illuminate/translation": "5.8.*", + "illuminate/validation": "5.8.*", + "illuminate/view": "5.8.*", + "nikic/fast-route": "^1.3", + "php": "^7.1.3", + "symfony/http-foundation": "^4.1", + "symfony/http-kernel": "^4.1", + "symfony/var-dumper": "^4.1" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0|^8.0", + "vlucas/phpdotenv": "^3.3" + }, + "suggest": { + "laravel/tinker": "Required to use the tinker console command (^1.0).", + "vlucas/phpdotenv": "Required to use .env files (^3.3)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.8-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Lumen\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "The Laravel Lumen Framework.", + "homepage": "https://lumen.laravel.com", + "keywords": [ + "framework", + "laravel", + "lumen" + ], + "time": "2019-03-21T17:35:25+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.24.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", + "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2018-11-05T09:00:11+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.16.3", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "373d9f0d58651af366435148c39beb702c2b7ef4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/373d9f0d58651af366435148c39beb702c2b7ef4", + "reference": "373d9f0d58651af366435148c39beb702c2b7ef4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/translation": "^3.4 || ^4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "kylekatarnls/multi-tester": "^0.1", + "phpmd/phpmd": "^2.6", + "phpstan/phpstan": "^0.10.8", + "phpunit/phpunit": "^7.5 || ^8.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2019-04-06T17:09:23+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "opis/closure", + "version": "3.1.6", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "ccb8e3928c5c8181c76cdd0ed9366c5bcaafd91b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/ccb8e3928c5c8181c76cdd0ed9366c5bcaafd91b", + "reference": "ccb8e3928c5c8181c76cdd0ed9366c5bcaafd91b", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0|^5.0|^6.0|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "time": "2019-02-22T10:30:00+00:00" + }, + { + "name": "phpmailer/phpmailer", + "version": "v6.0.7", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "0c41a36d4508d470e376498c1c0c527aa36a2d59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/0c41a36d4508d470e376498c1c0c527aa36a2d59", + "reference": "0c41a36d4508d470e376498c1c0c527aa36a2d59", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "doctrine/annotations": "1.2.*", + "friendsofphp/php-cs-fixer": "^2.2", + "phpdocumentor/phpdocumentor": "2.*", + "phpunit/phpunit": "^4.8 || ^5.7", + "zendframework/zend-eventmanager": "3.0.*", + "zendframework/zend-i18n": "2.7.3", + "zendframework/zend-serializer": "2.7.*" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "time": "2019-02-01T15:04:28+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2015-07-25T16:39:46+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "symfony/console", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "e2840bb38bddad7a0feaf85931e38fdcffdb2f81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/e2840bb38bddad7a0feaf85931e38fdcffdb2f81", + "reference": "e2840bb38bddad7a0feaf85931e38fdcffdb2f81", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-04-08T14:23:48+00:00" + }, + { + "name": "symfony/contracts", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "exclude-from-classmap": [ + "**/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "2d279b6bb1d582dd5740d4d3251ae8c18812ed37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/2d279b6bb1d582dd5740d4d3251ae8c18812ed37", + "reference": "2d279b6bb1d582dd5740d4d3251ae8c18812ed37", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2019-04-11T11:27:41+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "fbce53cd74ac509cbe74b6f227622650ab759b02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fbce53cd74ac509cbe74b6f227622650ab759b02", + "reference": "fbce53cd74ac509cbe74b6f227622650ab759b02", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2019-04-06T13:51:08+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e45135658bd6c14b61850bf131c4f09a55133f69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e45135658bd6c14b61850bf131c4f09a55133f69", + "reference": "e45135658bd6c14b61850bf131c4f09a55133f69", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2019-04-06T13:51:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "5b7ab6beaa5b053b8d3c9b13367ada9b292e12e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5b7ab6beaa5b053b8d3c9b13367ada9b292e12e1", + "reference": "5b7ab6beaa5b053b8d3c9b13367ada9b292e12e1", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2019-03-30T15:58:42+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "72f5f8f9dd6e6fbda0220ded537610ad20fa2ce8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72f5f8f9dd6e6fbda0220ded537610ad20fa2ce8", + "reference": "72f5f8f9dd6e6fbda0220ded537610ad20fa2ce8", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/contracts": "^1.0.2", + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~4.1", + "symfony/http-foundation": "^4.1.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<4.2", + "symfony/translation": "<4.2", + "symfony/var-dumper": "<4.1.1", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "^4.2", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/var-dumper": "^4.1.1" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2019-04-16T07:20:25+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "82ebae02209c21113908c229e9883c419720738a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", + "reference": "82ebae02209c21113908c229e9883c419720738a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "backendtea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/process", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "8cf39fb4ccff793340c258ee7760fd40bfe745fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/8cf39fb4ccff793340c258ee7760fd40bfe745fe", + "reference": "8cf39fb4ccff793340c258ee7760fd40bfe745fe", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-04-10T16:20:36+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "46c0dede1f925383d13dc783857be2c41efd0b24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/46c0dede1f925383d13dc783857be2c41efd0b24", + "reference": "46c0dede1f925383d13dc783857be2c41efd0b24", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/contracts": "^1.0.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "symfony/translation-contracts-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/intl": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2019-04-10T16:20:36+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "f42850fa32b8d7a35a75510810f6ef597674be74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f42850fa32b8d7a35a75510810f6ef597674be74", + "reference": "f42850fa32b8d7a35a75510810f6ef597674be74", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2019-04-11T11:27:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "dbcc609971dd9b55f48b8008b553d79fd372ddde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/dbcc609971dd9b55f48b8008b553d79fd372ddde", + "reference": "dbcc609971dd9b55f48b8008b553d79fd372ddde", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0", + "phpoption/phpoption": "^1.5", + "symfony/polyfill-ctype": "^1.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2019-03-06T09:39:45+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "a2c590166b2133a4633738648b6b064edae0814a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2019-03-17T17:37:11+00:00" + }, + { + "name": "fzaninotto/faker", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de", + "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2018-07-12T10:23:15+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2016-01-20T08:20:44+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", + "reference": "0eb0b48c3f07b3b89f5169ce005b7d05b18cf1d2", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~2.0", + "lib-pcre": ">=7.0", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2019-02-13T09:37:52+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2019-04-07T13:18:21+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-30T07:14:17+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-08-05T17:53:17+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.1 || ^4.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "ext-xdebug": "^2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-10-31T16:06:48+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b389aebe1b8b0578430bda0c7c95a829608e059", + "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2019-02-20T10:12:59+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", + "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2018-10-30T05:52:18+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "7.5.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "c29c0525cf4572c11efe1db49a8b8aee9dfac58a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c29c0525cf4572c11efe1db49a8b8aee9dfac58a", + "reference": "c29c0525cf4572c11efe1db49a8b8aee9dfac58a", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", + "sebastian/environment": "^4.0", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpunit/phpunit-mock-objects": "*" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2019-03-26T13:23:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656", + "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2019-02-01T05:27:49+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2017-04-03T13:19:02+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/1c42705be2b6c1de5904f8afacef5895cab44bf8", + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-04-04T09:56:43+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-12-25T11:19:39+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=7.1.3" + }, + "platform-dev": [] +} diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php new file mode 100644 index 0000000..bf9496b --- /dev/null +++ b/database/factories/ModelFactory.php @@ -0,0 +1,19 @@ +define(App\User::class, function (Faker\Generator $faker) { + return [ + 'name' => $faker->name, + 'email' => $faker->email, + ]; +}); diff --git a/database/migrations/.gitkeep b/database/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/database/migrations/2019_04_04_112146_init.php b/database/migrations/2019_04_04_112146_init.php new file mode 100644 index 0000000..1a23c7b --- /dev/null +++ b/database/migrations/2019_04_04_112146_init.php @@ -0,0 +1,125 @@ +increments('id'); + $table->timestamps(); + $table->string('username'); + $table->string('password'); + $table->boolean('developer')->default(false); + $table->boolean('admin')->default(false); + $table->enum('status', ['active']); + }); + + Schema::create("mails", function(Blueprint $table) { + $table->increments("id"); + $table->timestamps(); + $table->unsignedInteger("user_id"); + $table->string("mail"); + $table->string("validation_code"); + $table->boolean("primary")->comment("This is the Account primary mail adress"); + $table->enum("status", ["waiting", "valide", "invalide"]); + + $table->foreign('user_id')->references('id')->on('users'); + $table->unique(['user_id', 'primary'], 'unique_primary_email'); + }); + + + Schema::create('apps', function (Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->unsignedInteger('user_id'); + $table->string("name"); + $table->text("description"); + $table->string("url"); + $table->string("apiKey"); + $table->string("apiSecret"); + $table->enum("trustLevel", ["untrustet", "trustet", "full-trustet"])->comment("If level is untrustet a warning is shown, trustet show a notice, only full-trustet it without warning"); + $table->enum("owner", ["user", "system"])->comment("If owner is user a warning is shown"); + $table->enum("status", ["active", "deactivate", "testing"])->default("active"); + + $table->foreign('user_id')->references('id')->on('users'); + }); + + Schema::create("app_codes", function (Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->unsignedInteger('app_id'); + $table->unsignedInteger('user_id'); + $table->string('code'); + + $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('app_id')->references('id')->on('apps'); + }); + + Schema::create('access_tokens', function(Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->enum('status', ['active'])->default('active'); + $table->timestamp('expires_at')->nullable(); + $table->unsignedInteger('user_id'); + $table->unsignedInteger('app_id')->nullable(); + $table->string('token'); + + $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('app_id')->references('id')->on('apps'); + }); + + Schema::create('refresh_tokens', function(Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->enum('status', ['active'])->default('active'); + $table->unsignedInteger('user_id'); + $table->unsignedInteger('app_id')->nullable(); + $table->string('token'); + + $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('app_id')->references('id')->on('apps'); + }); + + Schema::create('settings', function(Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->string("name"); + $table->string("description"); + $table->enum("typ", ["checkbox"]); + $table->string("value"); + }); + + $setting = new \App\Models\Setting(); + $setting->name = "registration_possible"; + $setting->description = "Can new user create an account"; + $setting->typ = "checkbox"; + $setting->value = 1; + $setting->saveOrFail(); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop("settings"); + Schema::drop('refresh_tokens'); + Schema::drop('access_tokens'); + Schema::drop('app_codes'); + Schema::drop('apps'); + Schema::drop('mails'); + Schema::drop('users'); + } +} diff --git a/database/migrations/2019_04_17_113702_invite.php b/database/migrations/2019_04_17_113702_invite.php new file mode 100644 index 0000000..b3f7ca3 --- /dev/null +++ b/database/migrations/2019_04_17_113702_invite.php @@ -0,0 +1,46 @@ +name = "invites"; + $setting->description = "Enabled Invites"; + $setting->typ = "checkbox"; + $setting->value = 1; + $setting->saveOrFail(); + + Schema::create('invites', function (Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->string('username')->nullable()->default(null)->comment("If set the username can't be changed"); + $table->string("user_id")->comment("User who create the invite"); + $table->string("code")->comment("Invite code"); + $table->string("comment")->nullable()->default(null); + $table->enum("status", ["active", "inaktive", "used"])->default("active"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $s = \App\Models\Setting::query()->where("name", "=", "invites")->first(); + $s->delete(); + + Schema::drop('invites'); + } +} diff --git a/database/migrations/2019_04_18_125654_new_app_config.php b/database/migrations/2019_04_18_125654_new_app_config.php new file mode 100644 index 0000000..6cb9096 --- /dev/null +++ b/database/migrations/2019_04_18_125654_new_app_config.php @@ -0,0 +1,88 @@ +increments('id'); + $table->timestamps(); + $table->unsignedInteger('user_id'); + $table->unsignedInteger('app_id'); + $table->enum("status", ["created", "allowed", "disabled"]); + + $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('app_id')->references('id')->on('apps'); + }); + + Schema::table('apps', function (Blueprint $table) { + $table->boolean('auto_accept')->default(false)->comment('User dont have to click login, if the user is logged in he/she will immediately redirected back.'); + $table->boolean('testing_warning')->default(true)->comment('Show warning that the Application is just in testing mode'); + $table->boolean('untrusted_warning')->default(false)->comment('Show warning that the Application is untrusted'); + $table->dropColumn('trustLevel'); + $table->dropColumn('owner'); + $table->dropColumn('status'); + }); + + \App\Models\AppCode::query()->delete(); + Schema::table('app_codes', function (Blueprint $table) { + $table->dropForeign("app_codes_app_id_foreign"); + $table->dropColumn("app_id"); + $table->dropForeign("app_codes_user_id_foreign"); + $table->dropColumn("user_id"); + $table->unsignedInteger("access_id"); + + $table->foreign('access_id')->references('id')->on('app_access'); + }); + + \App\Models\AccessToken::query()->delete(); + Schema::table('access_tokens', function (Blueprint $table) { + $table->dropForeign("access_tokens_app_id_foreign"); + $table->dropColumn("app_id"); + $table->dropForeign("access_tokens_user_id_foreign"); + $table->dropColumn("user_id"); + $table->unsignedInteger("access_id"); + + $table->foreign('access_id')->references('id')->on('app_access'); + }); + + \App\Models\RefreshToken::query()->delete(); + Schema::table('refresh_tokens', function (Blueprint $table) { + $table->dropForeign("refresh_tokens_app_id_foreign"); + $table->dropColumn("app_id"); + $table->dropForeign("refresh_tokens_user_id_foreign"); + $table->dropColumn("user_id"); + $table->unsignedInteger("access_id"); + + $table->foreign('access_id')->references('id')->on('app_access'); + }); + + $user = new \App\Models\User(); + $user->username = "system"; + $user->password = ""; + $user->admin = 0; + $user->developer = 0; + $user->saveOrFail(); + + $app = \App\Models\App::createApp("PHP-GUI", "Webgui for oAuth Provider", "https://account.keks.cloud", $user); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop("app_access"); + } +} diff --git a/database/migrations/2019_04_24_153610_mail_and_app_settings.php b/database/migrations/2019_04_24_153610_mail_and_app_settings.php new file mode 100644 index 0000000..ad3ce74 --- /dev/null +++ b/database/migrations/2019_04_24_153610_mail_and_app_settings.php @@ -0,0 +1,115 @@ +name = "smtp_active"; + $setting->description = "If SMTP is not active the system will not send any mails"; + $setting->typ = "checkbox"; + $setting->value = 0; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_host"; + $setting->description = "SMTP Host"; + $setting->typ = "textinput"; + $setting->value = ""; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_port"; + $setting->description = "SMTP Port"; + $setting->typ = "textinput"; + $setting->value = "587"; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_smtpAuth"; + $setting->description = "Use SMTP-Auth"; + $setting->typ = "checkbox"; + $setting->value = 1; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_username"; + $setting->description = "SMTP Username"; + $setting->typ = "textinput"; + $setting->value = ""; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_password"; + $setting->description = "SMTP Password"; + $setting->typ = "password"; + $setting->value = ""; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_secure"; + $setting->description = "SMTP Secure Message"; + $setting->typ = "textinput"; + $setting->value = "tls"; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_from_mail"; + $setting->description = "SMTP From Mail"; + $setting->typ = "textinput"; + $setting->value = "account@example.com"; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_from_name"; + $setting->description = "SMTP From Name"; + $setting->typ = "textinput"; + $setting->value = "KeksAccount"; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "smtp_bcc"; + $setting->description = "BCC All Messages to this address (No BCC fi empty)"; + $setting->typ = "textinput"; + $setting->value = ""; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "url"; + $setting->description = "URL of this Service"; + $setting->typ = "textinput"; + $setting->value = "https://account.keks.cloud"; + $setting->saveOrFail(); + $setting = new \App\Models\Setting(); + $setting->name = "name"; + $setting->description = "Name of this Service"; + $setting->typ = "textinput"; + $setting->value = "Keks Account"; + $setting->saveOrFail(); + + Schema::table('apps', function (Blueprint $table) { + $table->boolean('show_on_webpage')->default(false)->comment('If this flag is true, the App will shown on the Webpage'); + $table->string("direct_url")->nullable()->default(null)->comment("Direct Login URL"); + $table->binary("icon")->nullable()->default(null)->comment("200x200 Image as Icon"); + }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + $settings = \App\Models\Setting::query()->where("name", "LIKE", "smtp_%")->get(); + foreach($settings as $s) { + $s->delete(); + } + \App\Models\Setting::query()->where("name", "=", "url")->delete(); + DB::statement("ALTER TABLE settings MODIFY COLUMN typ ENUM('checkbox')"); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php new file mode 100644 index 0000000..23526c9 --- /dev/null +++ b/database/seeds/DatabaseSeeder.php @@ -0,0 +1,16 @@ +call('UsersTableSeeder'); + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..80f78a6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3' +services: + webapp: + build: ./ + volumes: + - ./:/var/www + ports: + - 8000:80 + mysql: + image: mysql:5.7 + ports: + - 3306:3306 + environment: + MYSQL_ROOT_PASSWORD: example + MYSQL_DATABASE: oauth + MYSQL_USER: oauth + MYSQL_PASSWORD: oauth \ No newline at end of file diff --git a/html b/html new file mode 120000 index 0000000..d70ebaa --- /dev/null +++ b/html @@ -0,0 +1 @@ +public \ No newline at end of file diff --git a/kube.yml b/kube.yml new file mode 100644 index 0000000..374cd3c --- /dev/null +++ b/kube.yml @@ -0,0 +1,147 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: env-keksaccount-web + namespace: keksaccount +data: + APP_DEBUG: "false" + DB_CONNECTION: "mysql" + DB_HOST: "mysql" + DB_PORT: "3306" + DB_PORT: "oauth" + DB_USERNAME: "oauth" + DB_PASSWORD: "oauth" +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-keksaccount-mysql + namespace: keksaccount +type: Opaque +data: + MYSQL_ROOT_PASSWORD: dGlmaW1hZG9ja2Vy + MYSQL_DATABASE: b2F1dGg= + MYSQL_USER: b2F1dGg= + MYSQL_PASSWORD: b2F1dGg= +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: keksaccount + namespace: keksaccount +spec: + replicas: 1 + template: + metadata: + labels: + app: keksaccount + spec: + containers: + - name: web + image: docker.keks.cloud/keksaccount/web:latest + ports: + - containerPort: 80 + envFrom: + - configMapRef: + name: env-keksaccount-web + imagePullSecrets: + - name: docker-keks-cloud + +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + field.cattle.io/targetWorkloadIds: '["deployment:keksaccount:keksaccount"]' + name: ingress-keksaccount + namespace: keksaccount +spec: + ports: + - port: 80 + protocol: TCP + targetPort: 80 + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: mysql + namespace: keksaccount +spec: + replicas: 1 + template: + metadata: + labels: + app: mysql + spec: + containers: + - name: mysql + image: mysql:5.6 + ports: + - containerPort: 3306 + envFrom: + - secretRef: + name: secret-keksaccount-mysql + volumeMounts: + - mountPath: /var/lib/mysql + name: mysql + volumes: + - name: mysql + persistentVolumeClaim: + claimName: mysql +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + field.cattle.io/targetWorkloadIds: '["deployment:keksaccount:mysql"]' + name: mysql + namespace: keksaccount +spec: + ports: + - port: 3306 + protocol: TCP + targetPort: 3306 + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: certmanager.k8s.io/v1alpha1 +kind: Certificate +metadata: + name: account.keks.cloud + namespace: keksaccount +spec: + secretName: account-keks-cloud-tls + acme: + config: + - dns01: + provider: cf-dns + domains: + - 'account.keks.cloud' + commonName: 'account.keks.cloud' + dnsNames: + - account.keks.cloud + issuerRef: + kind: ClusterIssuer + name: letsencrypt-prod + +--- +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: keksaccount + namespace: keksaccount +spec: + rules: + - host: account.keks.cloud + http: + paths: + - backend: + serviceName: ingress-keksaccount + servicePort: 80 + path: / + tls: + - secretName: account-keks-cloud-tls \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..b8c2751 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,26 @@ + + + + + ./tests + + + + + ./app + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b75525b --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/html b/public/html new file mode 120000 index 0000000..724f4d4 --- /dev/null +++ b/public/html @@ -0,0 +1 @@ +html \ No newline at end of file diff --git a/public/img/logo3.png b/public/img/logo3.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc8b465e4c5f8ef56151881caceba3e6109f541 GIT binary patch literal 6154 zcmaJ_30zZ0x1a36EJV>5HU-yOgN=d&L^K2xQK49@25<=oL8@$`EK%{YOL3!BWD}*L z($-gkaifY2i%V+|3blJyI{+f<@a2ll?okmDp^=+mh>-iH(4ftsAvW>ho7dZTdU^YX z%m`&6G&a)9!)#c1@Q>vMRg+>SRfTWxkY%)f4ZISoDdbM>LG-xM`u z-80c>XZ8K?LuMO}?%#fOj(Ie)zxUbOy&ZdpUnIR7_SH@q@a0sMjQgf!T;A7miHr1i zt;5%c1IjYhW$DJ>f|LGyt2G5)t}SxA7I(WAxvL=Mq2HwesT~#8KYtYH8mWjt91u0nf zXQ z2C$+5W?5#~B)ZG!;xQ*~x>s#=oj%ZL38Kk#7jE`E`+=@LeTzH_a_QowDZPIu!cL4+ z*J}Mt8+`0q#@gnUC9C!&CUuvbRoD0VWv_ep&(N~>51nikeP!v7%f@x_s)7uj4CR+@ z>{~?fF?HGF(J&zpm4HZB3auA1&DHKvN2L83NKAkGx=dK~deu!@Rf)6*Q55W3(Ftd} zuZB0Qa4p)>@+A_c%)HjS?PzyNoci~^1u&dl5T+;8WtISOXC_r6;LKRoBvo2HBP&L%{`^|HS2;GyB#4qa{>>(OY**0J%D zf>_?hUZC!H!KtFe;oR2cQHXoCh*Mp_LIT41kMB$aVAau;&tJ}=BLWm?$Ohgbgq;}y z{;!xoy98X&v)A98h>#$u`Me1e(9)F%kZfUD;(QQJmI4BDARtDP1B?7i>pL!e82pc2 z0INS`tLS8aO0H?O{0jgyGfPQd3x-oB&^ebtVd+w~Fo}XFd3gfyFcncH%b=xjxWRHw zF9)%I^GH`xMBqBhq`HO#7?Z+KVt~(~88N_ewvfO8Wdbpx{R_Yk(9v8-@)N*_YN`aM zR1@~R?P$hW5;cD^dhzH%4t8wM=yavVJR1nYDemFxw%$DR`aLd?#FNz-|Mck=Hh5M2 zfrj^VzfMLdZ7pT6OML;#LRTK=>B@iFGkydv2(kC%yU@B!Dun!G|LiJ01wvRlo;dt2 z9;OQl(n1*=b91N`i>bXM!)m;7Oj-|=v~bG@0#66J_-5$*=XjE|^1%KpbmaqT@7a5aQ}4XR)zRxIgYD+8rZ++N z9DGFWU3rlV$b*3=5sJ#eJpi*Z7Edh{bq0$1Yj+3#zSJEjKAqkf7^XKy7=kW&l6~|8 zZaMH=$LNgcyE+R;ccl02@1&O5m`^y+VK6zX$PS_8ohSQ_Dv9|RWG+wl=0?!u9W-3X zTlG8M+&EfD2JoD^ob*C*dd@>+jEqhvGDb2~=wDR+%Umn6(#RgiwegWJ95a^w!V|xIc&Z2jokKOhs)X&KVotS1i-uP161DztU5D*Xd z%b^6j0Hb(`81j)nS z#i_1WQ&AArdGfPexv30P!`QU=uKxh+AnY;M#4(R=?+`(N^ixaP5@%$xu$R2k+Gl%1 z5kU}EX7TOUODHHA`A>P)bI=_(=c%Ouru%95>DAJJ`TJ|}f}7ybqBCl`AUU}qX6ZYUiHaK@o|RPA}voqqd_+*AMCFsahC>^<1R8P z$v!GQyLprfqQS|#VbS8PAj^+$hS#|yd^_1Oq(2$O=&w04g`yENuq?@ij%vPu)zL<$ z*`SHY?1a?}+)T@ z*4u%;qhdFSy@0qsGBU+KGQZNAX-}hw(v&|O%#Y8kz9>UX+q^sJhB%R)Lst%dAD@yH zxW3(**+->_{;<6)k8Q8Ms5?11LUrEciu|uOerjSeT59ovzOLln;8Lbz-dMKo$!BLVI^OZo9||-Vj3od$JRX+ zC{!-*wq?xAGp{LkzBV@vbZJQ|vXP!k5vlupB)P3_^Dl(*RT+r8{XpvOP?Z;vpWM3e z?$Q{uU7?P>l?jeY6%6 z<{G_tn#5ibxTtXUdj&JMb;6lt<8e|6tHQZrdkz;MO`8nxZ(XcSe|kJF&z!C6jX&lE zW>PR4zo^jpSP%?cB=&mxm&vE|{VZ75^{@Iy!x+KKq%S4H{DOlEc2?RV_kt!5MMzh; zp0}MJ9(%&UOlba(MXY<2``xx_-suZ6-e1u-Uf<`qb#bh-Z!uMEW$*q$ez#|uw?US? z=BmE29KX^!`yT0-Y2W`@X?=0iX8!1|t$MDjNx1fe!x0+epKgF7nar+HI?zlf%p23|>W??I@i}Y}45pUWmo?qto3JgP)=!G9&8PSM zw2XbLMQF|*Z(znv-ki7k*pJps<)Qr0NT+z4w+h|T#t%R2`ew_G}KTu3A*K0Z`=zlYe?GKs$7n`~~HMJ(;Ys9zf{ zG_}-xAz7=N=~866FTViJyAfHGb*iJS_vaElr0x=~$bM=)KMaMGZ8s>xzoCe_#%Jhx z6w#gdDQo5~q=-cGS;hGb12lS1xx-n+?dL7V1FP?UUc8Q@lQlGkM6z|dn4zEWO9FAj zov*v#GZ0l$H?7_d!B*oQVAx~^$0m3xYU+gZ6;)Cis`=S-3W$c~1x;O~cIl&;FYsZD ztrMJZxL|~8)qBJ73P58P*OIUH3K5nmK7Ls_(M_{L(esiRFRq0dSqDnq}FX`g}!K_ z#Gbf#GJe2UqksL*>c*HnbJ>oH->l`n75Y8HtAutij*5|1*OZ6GT?yO#T&G9stY1xp z9%8NieC=eeirMIi)7_Y}<*j*{(`(mD@qk6-uD`rn9Tt&?xU%=!C$KT|e$#Qwzgwl|6H~HcMJ3xOW6aqMpjyU#1TW z6d_iD((OB8N(?2J<8Db#CD_f{Htlj7atdC#I_!O~BBW@g-}Y}SDf*N5qB1oKyIF=G zE9R_=L|U~|^d6B9)aXiEzr?_lTp#!Ajlq(Nx~}caetQ+G@t$9HcbQvgP(bkDiao6q z$)=7~s<%2tus(iX(MUc2NZ|=uSF!sNbhfTH!Wy#KRkbPqNo{aW#f{dOBt4I?uNv*q zVI2$(m`LJMwV2BO+@!zSG|~SH!MUv1GRs zcRYDdsi^DB>Fd@PSfd8Pii*1EK%$jWSHEQmbqP1sOiSBY_)tj86=i&;VhN<@?C9c| z+!cDhO{7mCRS_&Ym1iw$+vqrKH**P>9*ngwGcQeMvTF@YfpjZRoy`^OtmoN8-m-Wu zG`HavT7ot-z)YEqqYH7~|8sg^Fd^9(hhnsTc+n-_=|K-vrT8XPqrqW#*urhf2)rHN zhZJlG<4yWntbDzu2jRm!C<`-NDIUyqSh;3wMk{3!GZ;Uo987Pelx76sXE`Znfqalb zJ(xa3DP@uJn%s;b3cD7A*NJ&r8YUnpqMZR&DwYkK1KW+@%v?QRCK9GFls4Za=UEdr zV!ThF6w)&aVUjRtC#MEuAi>x)41jEAfHmw$vQ+|Xiiqi5gKwQve{FpygwExO&Z#m7sz)XRdQc; zeNrLslXWlWq(M}g{hn*GqDlO^kz_bdM(EtWo73T#gadS1xmPyGK#Lx3VMF{%uQzM5 zdP!pexgnx7IM5+PMuvAO3KC#5bo{}}QWL1h^d&3*7^U}waJB(iqVX=lm&J3q5qOU_Kf z75j4eX)c+EClmBulNHmkBgmSf;(jt?^pmqkth}h^Y*UloMb^ZZJkmUj z-Wl=N*`I+lkQJ1`b_`j)xbsk$u%6WG5)heWUlB7X35$%P(S)ffsdo>q%(LNmfRN;K zk{TiJwmyImL@H-cP}iuW%uJ;l6opSoNMH*=~nULg>Z_-H8lkkO;{Jck`-i zB#7v>v`k?HBUCM&L+8{YR1>w4E&P^((%J_FVi66oFUmDaAXs`Yb^dS~p;Anp2;d`w z13kX>LbCwv^6v$mAMjCqzp$SP)RE;fqt&)ly6!n3)N*f-j1W@}S+J`wdDYBxEs@Hi z2=SvSqIw!(Ew{l+K0Pd;jTmx?WPOFg;fPeme!Y8C!#H#yO%wKFiipRU`X;#@Z6^dL ze^mOKc43B#_T^icFD5BGfOnrVDrL+)`@dV%WgE)F$}sQO z%S~5aUdds)&L5CPb@8-o?9!B?mbn(EZpZpz#>^*9aTO>D1QlhpB!7Zomk^Uq%S|U`tyQV4K6c5Wh zLxAKp(wGCV#)Ebr9arJL)Rkmofl0Mhh;BK3Gt#;46G_XiPSIRhhWS)rdbNwe+UTql zYXFUk!31LN1`8t#Z2WEXp5yot1_Wq4yMU7RSezSHH2RlFAXc>E$)ru-*sk^z(e literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..7b30079 --- /dev/null +++ b/public/index.php @@ -0,0 +1,29 @@ +run(); diff --git a/resources/views/.gitkeep b/resources/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/account/invite_code.php b/resources/views/account/invite_code.php new file mode 100644 index 0000000..660cde2 --- /dev/null +++ b/resources/views/account/invite_code.php @@ -0,0 +1,19 @@ + +
+
+

Invite Code

+ + + +
+ Invite Code + +
+ +
+
+
+ + \ No newline at end of file diff --git a/resources/views/account/login.php b/resources/views/account/login.php new file mode 100644 index 0000000..dbd46e9 --- /dev/null +++ b/resources/views/account/login.php @@ -0,0 +1,46 @@ + +
+
+

Register

+ + + +
+ Username: + + Password: + + +
+
+
+ + \ No newline at end of file diff --git a/resources/views/account/register.php b/resources/views/account/register.php new file mode 100644 index 0000000..4dfb513 --- /dev/null +++ b/resources/views/account/register.php @@ -0,0 +1,65 @@ + +
+
+

Register

+ + + +
+ + Username: + + + + + + + + Password: + + E-Mail + + +
+
+
+ + \ No newline at end of file diff --git a/resources/views/admin/app_details.php b/resources/views/admin/app_details.php new file mode 100644 index 0000000..3616c42 --- /dev/null +++ b/resources/views/admin/app_details.php @@ -0,0 +1,78 @@ + +
+
+

Apps name; ?>

+

description; ?>

+ url; ?> +
+

Settings

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameBeschreibungValue
Auto AcceptUser dont have to click login, if the user is logged in he/she will immediately redirected back. + auto_accept) { echo 'checked="checked"'; } ?>> +
Testing WarningShow warning that the Application is just in testing mode + testing_warning) { echo 'checked="checked"'; } ?>> +
Untrusted WarningShow warning that the Application is untrusted + untrusted_warning) { echo 'checked="checked"'; } ?>> +
Show on WebpageShow this App on the Webpage. + show_on_webpage) { echo 'checked="checked"'; } ?>> +
+ +
+
+
+ \ No newline at end of file diff --git a/resources/views/admin/app_list.php b/resources/views/admin/app_list.php new file mode 100644 index 0000000..2ebd3df --- /dev/null +++ b/resources/views/admin/app_list.php @@ -0,0 +1,20 @@ + +
+
+

Apps

+ Keine Apps gefunden'; + } else { + ?> +
+ + name; ?> + +
+ +
+
+ \ No newline at end of file diff --git a/resources/views/admin/invites_list.php b/resources/views/admin/invites_list.php new file mode 100644 index 0000000..88e54a6 --- /dev/null +++ b/resources/views/admin/invites_list.php @@ -0,0 +1,28 @@ + +
+
+ New Invite +

Invite Token

+ + + + + + + + + "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + ?> +
IDUsernameStatusInvide TokenComment
".$invite->id."".$invite->username."".$invite->status."".$invite->code."".$invite->comment."
+
+
+ \ No newline at end of file diff --git a/resources/views/admin/invites_new.php b/resources/views/admin/invites_new.php new file mode 100644 index 0000000..407826b --- /dev/null +++ b/resources/views/admin/invites_new.php @@ -0,0 +1,15 @@ + +
+
+

New Invite

+
+ Username* + + Description +
+ +
+

* if empty the user can choose it own username

+
+
+ \ No newline at end of file diff --git a/resources/views/admin/mails_list.php b/resources/views/admin/mails_list.php new file mode 100644 index 0000000..0e4e15c --- /dev/null +++ b/resources/views/admin/mails_list.php @@ -0,0 +1,32 @@ + +
+
+

E-Mail adresses

+ + + + + + + + + + + + + + +
User IDMailActions
user_id; ?>mail; ?> + status == "waiting") { + echo 'Aktivieren'; + } + ?> +
+
+
+ \ No newline at end of file diff --git a/resources/views/admin/settings_list.php b/resources/views/admin/settings_list.php new file mode 100644 index 0000000..00a419a --- /dev/null +++ b/resources/views/admin/settings_list.php @@ -0,0 +1,34 @@ + +
+
+

Settings

+
+ '.$setting->name.''; + echo '

'.$setting->description.'

'; + switch ($setting->typ) { + case 'checkbox': + echo 'value) { + echo' checked="checked"'; + } + echo '>'.$setting->name.'
'; + $button = true; + break; + case 'textinput': + echo ''; + break; + case 'password': + echo ''; + break; + } + echo "
"; + } + ?> + +
+
+
+ \ No newline at end of file diff --git a/resources/views/app/details.php b/resources/views/app/details.php new file mode 100644 index 0000000..15386f2 --- /dev/null +++ b/resources/views/app/details.php @@ -0,0 +1,23 @@ + +
+
+

App name; ?>

+

description; ?>

+ url; ?> +
+

Settings

+ Icon + You can change the Icon of the App by uploading a square Pic. +
+
+ +
+
+

API Access

+ API-Key + + API-Secret + +
+
+ \ No newline at end of file diff --git a/resources/views/app/list.php b/resources/views/app/list.php new file mode 100644 index 0000000..89477f1 --- /dev/null +++ b/resources/views/app/list.php @@ -0,0 +1,21 @@ + +
+
+ Neue App +

Apps

+ Keine Apps gefunden'; + } else { + ?> +
+ + name; ?> + +
+ +
+
+ \ No newline at end of file diff --git a/resources/views/app/new.php b/resources/views/app/new.php new file mode 100644 index 0000000..6581245 --- /dev/null +++ b/resources/views/app/new.php @@ -0,0 +1,16 @@ + +
+
+

New App

+
+ Name + + Description + + URL + + +
+
+
+ \ No newline at end of file diff --git a/resources/views/error.php b/resources/views/error.php new file mode 100644 index 0000000..6140eee --- /dev/null +++ b/resources/views/error.php @@ -0,0 +1,8 @@ + +
+
+

Error

+

+
+
+ \ No newline at end of file diff --git a/resources/views/index.php b/resources/views/index.php new file mode 100644 index 0000000..3517d05 --- /dev/null +++ b/resources/views/index.php @@ -0,0 +1,61 @@ + +
+
+ +
+
+ +
+
+

Keks Account

+

+ account.keks.cloud is a oAuht Provider to login with a single user to different Services. You just need one Account to use all Services, also other developers can add this Service to there services. +

+

+ In the test phase of the Project you need an Invite-Code to create a new Account. +

+
+
+ 0) { +?> +
+
+

Login to

+
+
+ + + + + + + diff --git a/resources/views/layout/bottom.php b/resources/views/layout/bottom.php new file mode 100644 index 0000000..025d2e7 --- /dev/null +++ b/resources/views/layout/bottom.php @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/resources/views/layout/top.php b/resources/views/layout/top.php new file mode 100644 index 0000000..81c2556 --- /dev/null +++ b/resources/views/layout/top.php @@ -0,0 +1,81 @@ + + + Keks Account + + + + + + + + +
+ \ No newline at end of file diff --git a/resources/views/oAuth/authorize.php b/resources/views/oAuth/authorize.php new file mode 100644 index 0000000..8b87468 --- /dev/null +++ b/resources/views/oAuth/authorize.php @@ -0,0 +1,55 @@ + +
+
+ +
+
+
+
+
+ +
+
+ \ No newline at end of file diff --git a/resources/views/oAuth/authorizeLogin.php b/resources/views/oAuth/authorizeLogin.php new file mode 100644 index 0000000..2c0a0d2 --- /dev/null +++ b/resources/views/oAuth/authorizeLogin.php @@ -0,0 +1,61 @@ + +
+
+ +
+
+
+
+
+ +
+
+ \ No newline at end of file diff --git a/resources/views/oAuthLogin.php b/resources/views/oAuthLogin.php new file mode 100644 index 0000000..c81ff2c --- /dev/null +++ b/resources/views/oAuthLogin.php @@ -0,0 +1,31 @@ + +
+
+ +
+
+
+
+
+ +
+
+ \ No newline at end of file diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 0000000..84cd1ed --- /dev/null +++ b/routes/web.php @@ -0,0 +1,64 @@ +get('/', ['middleware' => 'gui', 'uses' => 'GUI\PublicController@index']); +$router->get('/api/v4/user', ['uses' => 'oAuthController@getUserTMP']); +$router->get('/api/v4/groups', ['uses' => 'oAuthController@getGroupsTMP']); + + +$router->group(['prefix' => 'gui', 'middleware' => 'gui'], function () use ($router) { + $router->get('/register', ['uses' => 'GUI\AccountController@registerView']); + $router->post('/register', ['uses' => 'GUI\AccountController@register']); + + $router->get('/invite', ['uses' => 'GUI\AccountController@inviteView']); + + $router->get('/login', ['uses' => 'GUI\AccountController@loginView']); + $router->get('/logout', ['uses' => 'GUI\AccountController@logout']); + $router->post('/login', ['uses' => 'GUI\AccountController@login']); + $router->get('/apps', ['uses' => 'GUI\AppController@appList']); + $router->get('/apps/new', ['uses' => 'GUI\AppController@newAppView']); + $router->post('/apps/new', ['uses' => 'GUI\AppController@newApp']); + $router->get('/apps/{id}', ['uses' => 'GUI\AppController@viewApp']); + $router->post('/apps/{id}/changeIcon', ['uses' => 'GUI\AppController@changeIcon']); + $router->get('/apps/{id}/icon', ['uses' => 'GUI\AppController@getAppIcon']); + $router->get("/mailValidation/{id}/{code}", ['uses' => 'GUI\AccountController@validateEMail']); + + + //Admin + $router->get("/admin/mails", ['uses' => 'GUI\AdminController@listMails']); + $router->get("/admin/settings", ['uses' => 'GUI\AdminController@settingsView']); + $router->post("/admin/settings", ["uses" => "GUI\AdminController@saveSettings"]); + $router->get("/admin/apps", ["uses" => "GUI\AdminController@appList"]); + $router->get("/admin/apps/{id}", ["uses" => "GUI\AdminController@appDetails"]); + $router->post("/admin/apps/{id}", ["uses" => "GUI\AdminController@appDetailsSave"]); + $router->get("/admin/invites", ["uses" => "GUI\AdminController@inviteView"]); + $router->get("/admin/invites/new", ["uses" => "GUI\AdminController@inviteNewView"]); + $router->post("/admin/invites/new", ["uses" => "GUI\AdminController@inviteNew"]); + + $router->get('user/profile', function () { + // Uses Auth Middleware + }); +}); + +/*$router->group(['prefix' => 'api'], function () use ($router) { + $router->group(['prefix' => 'auth'], function () use ($router) { + $router->post('/register', ['uses' => 'GUI\AccountController@register']); + }); +});*/ + + +$router->group(['prefix' => 'oauth'], function () use ($router) { + $router->get("/authorize", ['middleware' => 'gui', 'uses' => 'oAuthController@authorizeView']); + $router->post("/authorize", ['middleware' => 'gui', 'uses' => 'oAuthController@authorizeDo']); + $router->post("/token", ['uses' => 'oAuthController@token']); +}); diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/tests/ExampleTest.php b/tests/ExampleTest.php new file mode 100644 index 0000000..1bad6ef --- /dev/null +++ b/tests/ExampleTest.php @@ -0,0 +1,21 @@ +get('/'); + + $this->assertEquals( + $this->app->version(), $this->response->getContent() + ); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..89a058d --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,14 @@ +