Bubka / 2FAuth

A Web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes
https://docs.2fauth.app/
GNU Affero General Public License v3.0
2.21k stars 146 forks source link

Base table or view not found: 1146 Table '2fauth.jobs' doesn't exist #397

Closed masterzxz closed 1 week ago

masterzxz commented 1 week ago

Version

530

Details & Steps to reproduce

Migrate from 5.2.0 to 5.3.0 Try to login Get "Server error" Check logs

Expectation

Not getting errors

Error & Logs

[previous exception] [object] (PDOException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table '2fauth.jobs' doesn't exist at /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php:47)
[stacktrace]
#0 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(47): PDO->prepare()
#1 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/Connection.php(812): Illuminate\\Database\\MySqlConnection->Illuminate\\Database\\{closure}()
#2 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/Connection.php(779): Illuminate\\Database\\Connection->runQueryCallback()
#3 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(42): Illuminate\\Database\\Connection->run()
#4 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/MySqlProcessor.php(35): Illuminate\\Database\\MySqlConnection->insert()
#5 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3796): Illuminate\\Database\\Query\\Processors\\MySqlProcessor->processInsertGetId()
#6 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php(185): Illuminate\\Database\\Query\\Builder->insertGetId()
#7 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php(96): Illuminate\\Queue\\DatabaseQueue->pushToDatabase()
#8 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Queue/Queue.php(342): Illuminate\\Queue\\DatabaseQueue->Illuminate\\Queue\\{closure}()
#9 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php(90): Illuminate\\Queue\\Queue->enqueueUsing()
#10 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(254): Illuminate\\Queue\\DatabaseQueue->push()
#11 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(230): Illuminate\\Bus\\Dispatcher->pushCommandToQueue()
#12 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(77): Illuminate\\Bus\\Dispatcher->dispatchToQueue()
#13 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(229): Illuminate\\Bus\\Dispatcher->dispatch()
#14 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Notifications/NotificationSender.php(76): Illuminate\\Notifications\\NotificationSender->queueNotification()
#15 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Notifications/ChannelManager.php(39): Illuminate\\Notifications\\NotificationSender->send()
#16 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Notifications/RoutesNotifications.php(18): Illuminate\\Notifications\\ChannelManager->send()
#17 /var/www/2fauth/app/Listeners/Authentication/LoginListener.php(67): App\\Models\\User->notify()
#18 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(478): App\\Listeners\\Authentication\\LoginListener->handle()
#19 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(286): Illuminate\\Events\\Dispatcher->Illuminate\\Events\\{closure}()
#20 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(266): Illuminate\\Events\\Dispatcher->invokeListeners()
#21 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php(771): Illuminate\\Events\\Dispatcher->dispatch()
#22 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php(539): Illuminate\\Auth\\SessionGuard->fireLoginEvent()
#23 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php(401): Illuminate\\Auth\\SessionGuard->login()
#24 /var/www/2fauth/vendor/laragear/webauthn/src/Http/Requests/AssertedRequest.php(57): Illuminate\\Auth\\SessionGuard->attempt()
#25 /var/www/2fauth/app/Http/Controllers/Auth/WebAuthnLoginController.php(117): Laragear\\WebAuthn\\Http\\Requests\\AssertedRequest->login()
#26 /var/www/2fauth/app/Http/Controllers/Auth/WebAuthnLoginController.php(90): App\\Http\\Controllers\\Auth\\WebAuthnLoginController->attemptLogin()
#27 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\Auth\\WebAuthnLoginController->login()
#28 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction()
#29 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Route.php(262): Illuminate\\Routing\\ControllerDispatcher->dispatch()
#30 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Route.php(208): Illuminate\\Routing\\Route->runController()
#31 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Router.php(808): Illuminate\\Routing\\Route->run()
#32 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#33 /var/www/2fauth/app/Http/Middleware/RejectIfSsoOnlyAndNotForAdmin.php(40): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#34 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\RejectIfSsoOnlyAndNotForAdmin->handle()
#35 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(161): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#36 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(92): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequest()
#37 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle()
#38 /var/www/2fauth/app/Http/Middleware/RejectIfAuthenticated.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#39 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\RejectIfAuthenticated->handle()
#40 /var/www/2fauth/vendor/laravel/passport/src/Http/Middleware/CreateFreshApiToken.php(63): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#41 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Laravel\\Passport\\Http\\Middleware\\CreateFreshApiToken->handle()
#42 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(51): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#43 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#44 /var/www/2fauth/app/Http/Middleware/SetLanguage.php(70): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#45 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\SetLanguage->handle()
#46 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(88): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#47 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#48 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#49 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#50 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle()
#51 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#52 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#53 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(75): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#54 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#55 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#56 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Router.php(807): Illuminate\\Pipeline\\Pipeline->then()
#57 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Router.php(786): Illuminate\\Routing\\Router->runRouteWithinStack()
#58 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Router.php(750): Illuminate\\Routing\\Router->runRoute()
#59 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Routing/Router.php(739): Illuminate\\Routing\\Router->dispatchToRoute()
#60 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(201): Illuminate\\Routing\\Router->dispatch()
#61 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#62 /var/www/2fauth/app/Http/Middleware/ForceJsonResponse.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#63 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\ForceJsonResponse->handle()
#64 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#65 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#66 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#67 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#68 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(51): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#69 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#70 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#71 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
#72 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(110): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#73 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#74 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#75 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle()
#76 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(58): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#77 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#78 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#79 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Pipeline\\Pipeline->then()
#80 /var/www/2fauth/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(145): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#81 /var/www/2fauth/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle()
#82 {main}
"}

Execution environment

Apache 2.4.58 with PHP 8.2 and MariaDB 10.11.8 on Ubuntu 24.04.1 Accessing the application via the 2FAuth app and Chrome using OAuth

Containerization

Additional information

Tried to roll back to 5.2.0 (just gives server error), upgrade to 5.3.0 again (still gives the error), created the table 2fauth.jobs manually (still gives the error).

Bubka commented 1 week ago

Hi, I think the error is happening because you have enabled the On failed login notification or the On new device notification in your user preferences. I've just realized that queuing is set on notifications while the queue jobs table is not created during install, so they fail.

It's weird, by the way, the error never occurred in my tests. Did you set any env var related to queue/jobs ? => Edit: I have reproduce the error, no need to set any env vars

I will push a fix asap, but in the meantime you can quickly fix this by disabling the notifications directly in your database. Open the user table, then edit your user account. You simply need to remove notifyOnNewAuthDevice: true and/or notifyOnFailedLogin: true from the value of the preference field. Save the record and refresh your browser, the error should be gone.

Bubka commented 1 week ago

Another quick fix if you feel more comfortable with code source editing:

Remove the line use Queueable; from \[2FAuth_source_dir]\app\Notifications\FailedLoginNotification.php and \[2FAuth_source_dir]\app\Notifications\SignedInWithNewDeviceNotification.php

masterzxz commented 1 week ago

Hi, I think the error is happening because you have enabled the On failed login notification or the On new device notification in your user preferences. I've just realized that queuing is set on notifications while the queue jobs table is not created during install, so they fail.

It's weird, by the way, the error never occurred in my tests. Did you set any env var related to queue/jobs ? => Edit: I have reproduce the error, no need to set any env vars

I will push a fix asap, but in the meantime you can quickly fix this by disabling the notifications directly in your database. Open the user table, then edit your user account. You simply need to remove notifyOnNewAuthDevice: true and/or notifyOnFailedLogin: true from the value of the preference field. Save the record and refresh your browser, the error should be gone.

I can confirm that both of those notifications were enabled, and that disabling them has solved the issue for now. Thanks.