diff --git a/.gitignore b/.gitignore index 44c43bb6..290dae62 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # Laravel /bootstrap/compiled.php /vendor -/workbench # Configuration .env.*.php diff --git a/app/config/app.php b/app/config/app.php index a182c155..15f6db4b 100644 --- a/app/config/app.php +++ b/app/config/app.php @@ -113,22 +113,20 @@ return [ 'Illuminate\Pagination\PaginationServiceProvider', 'Illuminate\Queue\QueueServiceProvider', 'Illuminate\Redis\RedisServiceProvider', - 'Illuminate\Remote\RemoteServiceProvider', 'Illuminate\Auth\Reminders\ReminderServiceProvider', 'Illuminate\Database\SeedServiceProvider', 'Illuminate\Session\SessionServiceProvider', 'Illuminate\Translation\TranslationServiceProvider', 'Illuminate\Validation\ValidationServiceProvider', 'Illuminate\View\ViewServiceProvider', - 'Illuminate\Workbench\WorkbenchServiceProvider', 'Dingo\Api\Provider\ApiServiceProvider', 'GrahamCampbell\Throttle\ThrottleServiceProvider', 'GrahamCampbell\Markdown\MarkdownServiceProvider', 'Thujohn\Rss\RssServiceProvider', - 'CachetHQ\Cachet\Support\ServiceProviders\RepositoryServiceProvider', - 'CachetHQ\Cachet\Support\ServiceProviders\RoutingServiceProvider', + 'CachetHQ\Cachet\Providers\RepositoryServiceProvider', + 'CachetHQ\Cachet\Providers\RoutingServiceProvider', ], @@ -158,19 +156,16 @@ return [ 'aliases' => [ + 'API' => 'Dingo\Api\Facade\API', 'App' => 'Illuminate\Support\Facades\App', 'Artisan' => 'Illuminate\Support\Facades\Artisan', 'Auth' => 'Illuminate\Support\Facades\Auth', 'Blade' => 'Illuminate\Support\Facades\Blade', 'Cache' => 'Illuminate\Support\Facades\Cache', - 'Carbon' => 'Carbon\Carbon', - 'ClassLoader' => 'Illuminate\Support\ClassLoader', 'Config' => 'Illuminate\Support\Facades\Config', - 'Controller' => 'Illuminate\Routing\Controller', 'Cookie' => 'Illuminate\Support\Facades\Cookie', 'Crypt' => 'Illuminate\Support\Facades\Crypt', 'DB' => 'Illuminate\Support\Facades\DB', - 'Eloquent' => 'Illuminate\Database\Eloquent\Model', 'Event' => 'Illuminate\Support\Facades\Event', 'File' => 'Illuminate\Support\Facades\File', 'Form' => 'Illuminate\Support\Facades\Form', @@ -189,20 +184,12 @@ return [ 'Response' => 'Illuminate\Support\Facades\Response', 'Route' => 'Illuminate\Support\Facades\Route', 'Schema' => 'Illuminate\Support\Facades\Schema', - 'Seeder' => 'Illuminate\Database\Seeder', 'Session' => 'Illuminate\Support\Facades\Session', - 'SoftDeletingTrait' => 'Illuminate\Database\Eloquent\SoftDeletingTrait', - 'SSH' => 'Illuminate\Support\Facades\SSH', 'Str' => 'Illuminate\Support\Str', 'URL' => 'Illuminate\Support\Facades\URL', 'Validator' => 'Illuminate\Support\Facades\Validator', 'View' => 'Illuminate\Support\Facades\View', - 'API' => 'Dingo\Api\Facade\API', - 'Throttle' => 'GrahamCampbell\Throttle\Facades\Throttle', - 'Markdown' => 'GrahamCampbell\Markdown\Facades\Markdown', - 'RSS' => 'Thujohn\Rss\RssFacade', - ], ]; diff --git a/app/config/workbench.php b/app/config/workbench.php deleted file mode 100644 index 735a7949..00000000 --- a/app/config/workbench.php +++ /dev/null @@ -1,31 +0,0 @@ - '', - - /* - |-------------------------------------------------------------------------- - | Workbench Author E-Mail Address - |-------------------------------------------------------------------------- - | - | Like the option above, your e-mail address is used when generating new - | workbench packages. The e-mail is placed in your composer.json file - | automatically after the package is created by the workbench tool. - | - */ - - 'email' => '', - -]; diff --git a/app/database/seeds/ComponentTableSeeder.php b/app/database/seeds/ComponentTableSeeder.php index 316f1b08..d65eb63b 100644 --- a/app/database/seeds/ComponentTableSeeder.php +++ b/app/database/seeds/ComponentTableSeeder.php @@ -1,15 +1,18 @@ call('UsersTableSeeder'); $this->call('SettingsTableSeeder'); diff --git a/app/database/seeds/IncidentTableSeeder.php b/app/database/seeds/IncidentTableSeeder.php index 28557cf1..33963d87 100644 --- a/app/database/seeds/IncidentTableSeeder.php +++ b/app/database/seeds/IncidentTableSeeder.php @@ -1,15 +1,18 @@ 'v1', - 'namespace' => 'CachetHQ\Cachet\Controllers\Api', - 'after' => 'allowed_domains', -], function () { +Route::api(['after' => 'allowed_domains', 'namespace' => 'CachetHQ\Cachet\Controllers\Api', 'version' => 'v1'], function () { Route::get('components', 'ComponentController@getComponents'); Route::get('components/{id}', 'ComponentController@getComponent'); Route::get('components/{id}/incidents', 'ComponentController@getComponentIncidents'); diff --git a/app/routes/app.php b/app/routes/app.php index 943edb1e..0705560c 100644 --- a/app/routes/app.php +++ b/app/routes/app.php @@ -1,14 +1,16 @@ 'has_setting:app_name'], function () { +Route::group(['before' => 'has_setting:app_name', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { Route::get('/', ['as' => 'status-page', 'uses' => 'HomeController@showIndex']); Route::get('/incident/{incident}', 'HomeController@showIncident'); }); // Setup route. -Route::group(['before' => 'is_setup'], function () { +Route::group(['before' => 'is_setup', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { Route::controller('/setup', 'SetupController'); }); -Route::get('/rss', 'RSSController@feedAction'); +Route::group(['namespace' => 'CachetHQ\Cachet\Controllers'], function () { + Route::get('/rss', 'RssController@feedAction'); +}); diff --git a/app/routes/auth.php b/app/routes/auth.php index 520a0d28..bc5eb71e 100644 --- a/app/routes/auth.php +++ b/app/routes/auth.php @@ -1,8 +1,10 @@ 'has_setting:app_name'], function () { +Route::group(['before' => 'has_setting:app_name', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { Route::get('/auth/login', ['before' => 'guest', 'as' => 'login', 'uses' => 'AuthController@showLogin']); Route::post('/auth/login', ['before' => 'guest|csrf|login_throttling', 'as' => 'logout', 'uses' => 'AuthController@postLogin']); }); -Route::get('/auth/logout', ['before' => 'auth', 'as' => 'logout', 'uses' => 'AuthController@logoutAction']); +Route::group(['before' => 'auth', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { + Route::get('/auth/logout', ['as' => 'logout', 'uses' => 'AuthController@logoutAction']); +}); diff --git a/app/routes/dashboard.php b/app/routes/dashboard.php index ce1061a1..96c8dc46 100644 --- a/app/routes/dashboard.php +++ b/app/routes/dashboard.php @@ -1,6 +1,6 @@ 'auth', 'prefix' => 'dashboard'], function () { +Route::group(['before' => 'auth', 'prefix' => 'dashboard', 'namespace' => 'CachetHQ\Cachet\Controllers'], function () { // Dashboard Route::get('/', ['as' => 'dashboard', 'uses' => 'DashboardController@showDashboard']); diff --git a/app/start/global.php b/app/start/global.php index c90d72c8..aa63d7af 100644 --- a/app/start/global.php +++ b/app/start/global.php @@ -1,27 +1,5 @@ subDays($i); + $incidentDate = Carbon\Carbon::now()->subDays($i); $incidents = Incident::whereBetween('created_at', [ $incidentDate->format('Y-m-d') . ' 00:00:00', $incidentDate->format('Y-m-d') . ' 23:59:59', diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php index 96712ce4..3514286c 100644 --- a/bootstrap/autoload.php +++ b/bootstrap/autoload.php @@ -43,31 +43,3 @@ if (file_exists($compiled = __DIR__.'/compiled.php')) { */ Patchwork\Utf8\Bootup::initMbstring(); - -/* -|-------------------------------------------------------------------------- -| Register The Laravel Auto Loader -|-------------------------------------------------------------------------- -| -| We register an auto-loader "behind" the Composer loader that can load -| model classes on the fly, even if the autoload files have not been -| regenerated for the application. We'll add it to the stack here. -| -*/ - -Illuminate\Support\ClassLoader::register(); - -/* -|-------------------------------------------------------------------------- -| Register The Workbench Loaders -|-------------------------------------------------------------------------- -| -| The Laravel workbench provides a convenient place to develop packages -| when working locally. However we will need to load in the Composer -| auto-load files for the packages so that these can be used here. -| -*/ - -if (is_dir($workbench = __DIR__.'/../workbench')) { - Illuminate\Workbench\Starter::start($workbench); -} diff --git a/composer.json b/composer.json index ed63751b..1fb54ee4 100644 --- a/composer.json +++ b/composer.json @@ -27,17 +27,20 @@ }, "autoload": { "classmap": [ - "app/controllers", - "app/models", "app/database/migrations", "app/database/seeds", - "app/tests/TestCase.php", - "app/filters" + "app/filters", + "app/models" ], "psr-4": { "CachetHQ\\Cachet\\": "src/" } }, + "autoload-dev": { + "classmap": [ + "app/tests/TestCase.php" + ] + }, "extra": { "paas": { "document-root": "public", diff --git a/composer.lock b/composer.lock index ebe05723..435b5478 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "44248db4d4bba4ff38d7f3aef78acc79", + "hash": "af0ee6e5bc07e350732bc7c907e3b2ae", "packages": [ { "name": "classpreloader/classpreloader", diff --git a/phpunit.xml b/phpunit.xml index b12cc839..b60b43d4 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -20,8 +20,7 @@ - ./app/CachetHQ - ./app/controllers + ./src ./app/filters ./app/models diff --git a/app/controllers/AuthController.php b/src/Controllers/AuthController.php similarity index 60% rename from app/controllers/AuthController.php rename to src/Controllers/AuthController.php index 688b4ccb..65b21848 100644 --- a/app/controllers/AuthController.php +++ b/src/Controllers/AuthController.php @@ -1,5 +1,15 @@ withInput(Input::except('password')) - ->with('error', 'Invalid email or password'); } + + Throttle::hit(Request::instance(), 10, 10); + + return Redirect::back() + ->withInput(Input::except('password')) + ->with('error', 'Invalid email or password'); } /** diff --git a/app/controllers/DashAPIController.php b/src/Controllers/DashAPIController.php similarity index 58% rename from app/controllers/DashAPIController.php rename to src/Controllers/DashAPIController.php index 39d5b1cb..d254dd65 100644 --- a/app/controllers/DashAPIController.php +++ b/src/Controllers/DashAPIController.php @@ -1,23 +1,30 @@ update($componentData)) { - return $component; - } else { - App::abort(500); + if (!$component->update(Input::except(['_token']))) { + throw new Exception('Failed to update the component.'); } + + return $component; } /** @@ -32,9 +39,7 @@ class DashAPIController extends Controller foreach ($componentData['component'] as $componentId => $order) { $component = Component::find($componentId); - $component->update([ - 'order' => $order, - ]); + $component->update(['order' => $order]); } return $componentData; diff --git a/app/controllers/DashComponentController.php b/src/Controllers/DashComponentController.php similarity index 91% rename from app/controllers/DashComponentController.php rename to src/Controllers/DashComponentController.php index 4ff98b75..5ec8d00b 100644 --- a/app/controllers/DashComponentController.php +++ b/src/Controllers/DashComponentController.php @@ -1,5 +1,13 @@ delete(); } - unset($settings['remove-banner']); - if (Input::hasFile('app_banner')) { $file = Input::file('app_banner'); // Image Validation. // Image size in bytes. $maxSize = $file->getMaxFilesize(); + if ($file->getSize() > $maxSize) { return Redirect::back()->withErrorMessage('You need to upload an image that is less than '.$maxSize.'.'); - } elseif (!$file->isValid() || $file->getError()) { + } + + if (!$file->isValid() || $file->getError()) { return Redirect::back()->withErrorMessage($file->getErrorMessage()); - } elseif (strpos($file->getMimeType(), 'image/') !== 0) { + } + + if (strpos($file->getMimeType(), 'image/') !== 0) { return Redirect::back()->withErrorMessage('Only images may be uploaded.'); } @@ -144,10 +152,8 @@ class DashSettingsController extends Controller ]); } - unset($settings['app_banner']); - try { - foreach ($settings as $settingName => $settingValue) { + foreach (Input::except(['app_banner', 'remove-banner']) as $settingName => $settingValue) { $setting = Setting::firstOrCreate([ 'name' => $settingName, ])->update([ diff --git a/app/controllers/DashUserController.php b/src/Controllers/DashUserController.php similarity index 71% rename from app/controllers/DashUserController.php rename to src/Controllers/DashUserController.php index 0c09ca8a..4c2d4c34 100644 --- a/app/controllers/DashUserController.php +++ b/src/Controllers/DashUserController.php @@ -1,5 +1,13 @@ component = $component; - } - /** * Returns the rendered Blade templates. * diff --git a/app/controllers/RSSController.php b/src/Controllers/RssController.php similarity index 80% rename from app/controllers/RSSController.php rename to src/Controllers/RssController.php index 83188dc4..1b914cbc 100644 --- a/app/controllers/RSSController.php +++ b/src/Controllers/RssController.php @@ -1,6 +1,14 @@ channel([ 'title' => Setting::get('app_name'), 'description' => 'Status Feed', diff --git a/app/controllers/SetupController.php b/src/Controllers/SetupController.php similarity index 80% rename from app/controllers/SetupController.php rename to src/Controllers/SetupController.php index a1d8b0a7..1a6987d8 100644 --- a/app/controllers/SetupController.php +++ b/src/Controllers/SetupController.php @@ -1,5 +1,16 @@ $userDetails['username'], 'email' => $userDetails['email'], @@ -59,8 +70,8 @@ class SetupController extends Controller $settings = array_get($postData, 'settings'); foreach ($settings as $settingName => $settingValue) { - $setting = new Setting(); - $setting->name = $settingName; + $setting = new Setting(); + $setting->name = $settingName; $setting->value = $settingValue; $setting->save(); } diff --git a/src/Support/ServiceProviders/RepositoryServiceProvider.php b/src/Providers/RepositoryServiceProvider.php similarity index 93% rename from src/Support/ServiceProviders/RepositoryServiceProvider.php rename to src/Providers/RepositoryServiceProvider.php index c193b5d3..89166bd0 100644 --- a/src/Support/ServiceProviders/RepositoryServiceProvider.php +++ b/src/Providers/RepositoryServiceProvider.php @@ -1,6 +1,6 @@