diff --git a/app/Events/ReleaseRadarActivated.php b/app/Events/ScanForNewReleaseCalled.php similarity index 67% rename from app/Events/ReleaseRadarActivated.php rename to app/Events/ScanForNewReleaseCalled.php index 6e29c784..3e9a2077 100644 --- a/app/Events/ReleaseRadarActivated.php +++ b/app/Events/ScanForNewReleaseCalled.php @@ -5,24 +5,19 @@ namespace App\Events; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Log; -class ReleaseRadarActivated +class ScanForNewReleaseCalled { use Dispatchable, InteractsWithSockets, SerializesModels; - /** - * @var \App\Models\Group - */ - // public $group; - /** * Create a new event instance. * - * @param \App\Models\Group $group * @return void */ public function __construct() { - // $this->group = $group; + Log::info('ReleaseRadarActivated event dispatched'); } } diff --git a/app/Helpers/Helpers.php b/app/Helpers/Helpers.php index 142d2960..a1e454de 100644 --- a/app/Helpers/Helpers.php +++ b/app/Helpers/Helpers.php @@ -17,4 +17,10 @@ class Helpers { return Str::random(40).'.'.$extension; } + + + public static function cleanVersionNumber(?string $release): string|false + { + return preg_match('/([[0-9][0-9\.]*[0-9])/', $release, $version) ? $version[0] : false; + } } diff --git a/app/Http/Controllers/SinglePageController.php b/app/Http/Controllers/SinglePageController.php index f15a8c58..e85190fd 100644 --- a/app/Http/Controllers/SinglePageController.php +++ b/app/Http/Controllers/SinglePageController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Facades\Settings; use Illuminate\Support\Facades\App; +use App\Events\ScanForNewReleaseCalled; class SinglePageController extends Controller { @@ -15,6 +16,8 @@ class SinglePageController extends Controller */ public function index() { + event(new ScanForNewReleaseCalled()); + return view('landing')->with([ 'appSettings' => Settings::all()->toJson(), 'appConfig' => collect([ diff --git a/app/Http/Controllers/SystemController.php b/app/Http/Controllers/SystemController.php index 4bc40575..b12559ec 100644 --- a/app/Http/Controllers/SystemController.php +++ b/app/Http/Controllers/SystemController.php @@ -2,9 +2,7 @@ namespace App\Http\Controllers; -use App\Events\ReleaseRadarActivated; use App\Services\ReleaseRadarService; -use Illuminate\Support\Facades\App; use App\Http\Controllers\Controller; use App\Facades\Settings; use Illuminate\Http\Request; @@ -20,23 +18,23 @@ class SystemController extends Controller public function infos(Request $request) { $infos = array(); - $infos['Date'] = date(DATE_RFC2822); - $infos['userAgent'] = $request->header('user-agent'); + $infos['Date'] = date(DATE_RFC2822); + $infos['userAgent'] = $request->header('user-agent'); // App info - $infos['Version'] = config('2fauth.version'); - $infos['Environment'] = config('app.env'); - $infos['Debug'] = var_export(config('app.debug'), true); - $infos['Cache driver'] = config('cache.default'); - $infos['Log channel'] = config('logging.default'); - $infos['Log level'] = env('LOG_LEVEL'); - $infos['DB driver'] = DB::getDriverName(); + $infos['Version'] = config('2fauth.version'); + $infos['Environment'] = config('app.env'); + $infos['Debug'] = var_export(config('app.debug'), true); + $infos['Cache driver'] = config('cache.default'); + $infos['Log channel'] = config('logging.default'); + $infos['Log level'] = env('LOG_LEVEL'); + $infos['DB driver'] = DB::getDriverName(); // PHP info - $infos['PHP version'] = PHP_VERSION; - $infos['Operating system'] = PHP_OS; - $infos['interface'] = PHP_SAPI; + $infos['PHP version'] = PHP_VERSION; + $infos['Operating system'] = PHP_OS; + $infos['interface'] = PHP_SAPI; // Auth info if ($request->user()) { - $infos['Auth guard'] = config('auth.defaults.guard'); + $infos['Auth guard'] = config('auth.defaults.guard'); if ($infos['Auth guard'] === 'reverse-proxy-guard') { $infos['Auth proxy header for user'] = config('auth.auth_proxy_headers.user'); $infos['Auth proxy header for email'] = config('auth.auth_proxy_headers.email'); @@ -46,7 +44,7 @@ class SystemController extends Controller } // User info if ($request->user()) { - $infos['options'] = Settings::all()->toArray(); + $infos['options'] = Settings::all()->toArray(); } return response()->json($infos); @@ -58,11 +56,10 @@ class SystemController extends Controller * * @return \Illuminate\Http\JsonResponse */ - public function latestRelease(Request $request) + public function latestRelease(Request $request, ReleaseRadarService $releaseRadar) { - $releaseRadarService = App::make(ReleaseRadarService::class); - $release = $releaseRadarService->scanForRelease(); + $release = $releaseRadar->manualScan(); - return response()->json($release); + return response()->json(['newRelease' => $release]); } -} \ No newline at end of file +} diff --git a/app/Listeners/ReleaseRadar.php b/app/Listeners/ReleaseRadar.php index d9701f9a..a4b20f44 100644 --- a/app/Listeners/ReleaseRadar.php +++ b/app/Listeners/ReleaseRadar.php @@ -2,34 +2,41 @@ namespace App\Listeners; -use App\Events\ReleaseRadarActivated; +use App\Events\ScanForNewReleaseCalled; use App\Services\ReleaseRadarService; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Log; class ReleaseRadar { + /** + * @var ReleaseRadarService $releaseRadar + */ + protected $releaseRadar; + + /** * Create the event listener. + * + * @param \App\Services\ReleaseRadarService $releaseRadar * * @return void */ - public function __construct() + public function __construct(ReleaseRadarService $releaseRadar) { - // + $this->releaseRadar = $releaseRadar; } + /** * Handle the event. * - * @param \App\Events\ReleaseRadarActivated $event + * @param \App\Events\ScanForNewReleaseCalled $event * @return void */ - public function handle(ReleaseRadarActivated $event) + public function handle(ScanForNewReleaseCalled $event) { - Log::info('Release radar activated'); - - $releaseRadarService = App::make(ReleaseRadarService::class); - $releaseRadarService->scanForNewRelease(); + $this->releaseRadar->scheduledScan(); + Log::info('Scheduled release scan complete'); } } \ No newline at end of file diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index a65eca26..84d5e786 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -4,7 +4,7 @@ namespace App\Providers; use App\Events\GroupDeleting; use App\Events\TwoFAccountDeleted; -use App\Events\ReleaseRadarActivated; +use App\Events\ScanForNewReleaseCalled; use App\Listeners\ReleaseRadar; use App\Listeners\CleanIconStorage; use App\Listeners\DissociateTwofaccountFromGroup; @@ -29,7 +29,7 @@ class EventServiceProvider extends ServiceProvider GroupDeleting::class => [ DissociateTwofaccountFromGroup::class, ], - ReleaseRadarActivated::class => [ + ScanForNewReleaseCalled::class => [ ReleaseRadar::class, ], ]; diff --git a/app/Providers/TwoFAuthServiceProvider.php b/app/Providers/TwoFAuthServiceProvider.php index b4a093fd..862be3ed 100644 --- a/app/Providers/TwoFAuthServiceProvider.php +++ b/app/Providers/TwoFAuthServiceProvider.php @@ -56,7 +56,7 @@ class TwoFAuthServiceProvider extends ServiceProvider implements DeferrableProvi { return [ LogoService::class, - LogoSeReleaseRadarServicervice::class, + ReleaseRadarService::class, ]; } } diff --git a/app/Services/ReleaseRadarService.php b/app/Services/ReleaseRadarService.php index 194ce344..2de66fb8 100644 --- a/app/Services/ReleaseRadarService.php +++ b/app/Services/ReleaseRadarService.php @@ -3,33 +3,60 @@ namespace App\Services; use App\Facades\Settings; +use App\Helpers\Helpers; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; class ReleaseRadarService { /** + * Run a scheduled release scan * + * @return void */ - public function scanForNewRelease() : void + public function scheduledScan() : void { - // Only if the last check is old enough - // if ((Settings::get('lastRadarScan') + 604800) < time()) { - if ($latestReleaseData = json_decode($this->GetLatestReleaseData())) - { - if ($latestReleaseData->prerelease == false && $latestReleaseData->draft == false) { + if ((Settings::get('lastRadarScan') + 604800) < time()) { + $this->newRelease(); + } + } - Settings::set('lastRadarScan', time()); - Settings::set('lastRadarScan', time()); - } + + /** + * Run a manual release scan + * + * @return false|string False if no new release, the new release number otherwise + */ + public function manualScan() : false|string + { + return $this->newRelease(); + } + + /** + * Run a release scan + * + * @return false|string False if no new release, the new release number otherwise + */ + protected function newRelease() : false|string + { + if ($latestReleaseData = json_decode($this->getLatestReleaseData())) + { + $githubVersion = Helpers::cleanVersionNumber($latestReleaseData->tag_name); + $installedVersion = Helpers::cleanVersionNumber(config('2fauth.version')); + + if ($githubVersion > $installedVersion && $latestReleaseData->prerelease == false && $latestReleaseData->draft == false) { + Settings::set('latestRelease', $latestReleaseData->tag_name); + + return $latestReleaseData->tag_name; + } + else { + Settings::delete('latestRelease'); } - return $latestReleaseData; - // } + Settings::set('lastRadarScan', time()); + } - // tag_name - // prerelease - // draft + return false; } @@ -38,9 +65,8 @@ class ReleaseRadarService * * @return string|null */ - protected function GetLatestReleaseData() : string|null + protected function getLatestReleaseData() : string|null { - return null; try { $response = Http::retry(3, 100) ->get(config('2fauth.latestReleaseUrl')); diff --git a/config/2fauth.php b/config/2fauth.php index c438bd42..606131f5 100644 --- a/config/2fauth.php +++ b/config/2fauth.php @@ -67,7 +67,7 @@ return [ 'getOfficialIcons' => true, 'checkForUpdate' => true, 'lastRadarScan' => 0, - 'latestRelease' => '', + 'latestRelease' => false, ], ]; \ No newline at end of file diff --git a/resources/js/components/Footer.vue b/resources/js/components/Footer.vue index 5c066f7c..4a3c62b1 100644 --- a/resources/js/components/Footer.vue +++ b/resources/js/components/Footer.vue @@ -13,7 +13,9 @@
- {{ $t('settings.settings') }} + + {{ $t('settings.settings') }} + - diff --git a/resources/js/components/VersionChecker.vue b/resources/js/components/VersionChecker.vue new file mode 100644 index 00000000..6e6f1f49 --- /dev/null +++ b/resources/js/components/VersionChecker.vue @@ -0,0 +1,42 @@ + + + diff --git a/resources/js/views/About.vue b/resources/js/views/About.vue index 5bfd59a9..f30b55f3 100644 --- a/resources/js/views/About.vue +++ b/resources/js/views/About.vue @@ -7,22 +7,9 @@ {{ $t('commons.2fauth_teaser')}}

2FAuth logo -

+

©Bubka AGPL-3.0 license

-
-
- - - -

{{ $t('commons.resources') }}

@@ -66,7 +53,7 @@ {{ $t('commons.environment') }}
-