Giter VIP home page Giter VIP logo

suspicious_login's Introduction

🔮 Nextcloud Suspicious Login Detection

Detect and warn about suspicious IPs logging into Nextcloud

Downloads Build Status Dependabot Status

The app is still under development, so it’s time for you to get involved! 👩‍💻

Installation

Nextcloud 25 and newer

The app is shipped and comes with the installation of Nextcloud Server. No additional steps are necessary.

Nextcloud 24 and older

Old versions of this app remain available through the app store. They can be installed through Nextcloud's app management UI.

Note

Newer versions of the app are not included in the app store since it is now a shipped app.

Releases and CHANGELOGs

As a shipped app:

  • changes are posted within the Nextcloud Server changelog.
  • releases are not posted in this GitHub repository, but they are tagged for code perusal.
  • it is automatically kept up-to-date with each Nextcloud Server release.

How it works

Data collection

Once this app is enabled, it will automatically start tracking (IP, uid) tuples from successful logins on the instance and feed them into the login_address table. This insert operation is executed for the majority of requests (client authenticate on almost all requests) and therefore has to be fast. In a background job, these rows will be transformed into an aggregated format that is suitable for the training of the neural net. The (IP, uid) tuple becomes (IP, uid, first_seen, last_seen, seen) so that we know which (IP, uid) tuple has been seen first and last. The aggregated data is a compressed format of the raw data. The original data gets deleted and thus the database does not need much space for the collected login data.

Neural net

When enough data is collected – which by default is 60 days (!) – a first training run can be started.

The app registers a background job that invokes the training once a day. As long as there isn't sufficient data, no trained model is generated.

Manual training

The training can also be invoked via the OCC command line tool:

php -f occ suspiciouslogin:train

This command uses several sensible default that should work for instances of any size. The --stats flag is useful to see the measured performance of the trained model after the training finishes. The duration of the training run depends on the size of the input training set, but is usually between two to 15 minutes.

The full list of parameters, their description and default values can be seen with

php -f occ suspiciouslogin:train --help

Hyper parameter optimization (optional)

To find the best possible parameters for the training it's possible to start a hyper parameter optimization run via the CLI:

php -f occ suspiciouslogin:optimize

This command uses the heuristic simulated annealing algorithm to find optimal parameter sets in the multidimensional parameter space. By default this will do 100 steps consisting of five training runs per step, hence this command might take a few days to execute on large instances. On smaller ones it will also take a few hours.

Login classification

As soon as the first model is trained, the app will start classifying (IP, uid) tuples on login. In contrast to the data collection it won't consider requests authenticated via an app password as suspicious. Should it detect a password login where the (IP, uid) is classified as suspicious by the trained model, it will add an entry to the suspicious_login table, including the timestamp, request id and URL.

Development setup

  1. ☁ Clone the app into the apps folder of your Nextcloud: git clone https://github.com/nextcloud/suspicious_login.git
  2. 💻 Run npm i or krankerl up to install the dependencies
  3. 🏗 To build the Javascript whenever you make changes, run npm run dev
  4. ☁ Enable the app through the app management of your Nextcloud or run krankerl enable
  5. 👍 Partytime! Help fix some issues and review pull requests

suspicious_login's People

Contributors

adi-dev avatar christophwurst avatar come-nc avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar furplag avatar grillguth avatar joshtrichards avatar juliushaertl avatar marcelklehr avatar morrisjobke avatar nextcloud-bot avatar nextcloud-command avatar nickvergessen avatar pvince81 avatar renovate[bot] avatar rullzer avatar skjnldsv avatar st3iny avatar szaimen avatar zocker1999net avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

suspicious_login's Issues

Validate the model with realistic and strict data sets

In (machine learning) theory, there should be no intersection between the training data set and the validation training set. However, in this application the classifier does not only have to classify IPs it hasn't seen before, but also ones it sees again. Therefore I chose to not only validate on data that has only been seen recently but also IPs there have historic and recent appearance.

These results might not be a real representation of the quality of the model, so I'd like to add a second validation that only uses true recent data.

postgres errors during cronjob

I noticed in my nextcloud log that an error is happening during the cronjob. It is happening because at some point the query INSERT INTO "oc_login_address_aggregated" ("uid", "ip", "seen", "first_seen", "last_seen") VALUES($1, $2, $3, $4, $5) tries to insert a duplicate value for (uid, ip) which violates a unique key defined on that table.
Am running nextcloud 16.0.1 on a linux server with nginx and postgres 10.8.

Error	core	Doctrine\DBAL\Exception\DriverException: An exception occurred while executing 'SELECT "seen", "first_seen", "last_seen" FROM "oc_login_address_aggregated" WHERE ("uid" = ?) AND ("ip" = ?)' with params ["***redacted***", "***redacted***"]: SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php - line 184:

    Doctrine\DBAL\Driver\AbstractPostgreSQLDriver->convertException("An exceptio ... k", Doctrine\DBA ... ]})

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php - line 158:

    Doctrine\DBAL\DBALException::wrapException(Doctrine\DBA ... {}, Doctrine\DBA ... ]}, "An exceptio ... k")

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php - line 938:

    Doctrine\DBAL\DBALException::driverExceptionDuringQuery(Doctrine\DBA ... {}, Doctrine\DBA ... ]}, "SELECT \"se ... )", { 1: "***redacted*** ... "})

    /var/www/nextcloud/lib/private/DB/Connection.php - line 195:

    Doctrine\DBAL\Connection->executeQuery("SELECT \"se ... )", [ "***redacted*** ... "], [ 2,2], null)

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php - line 219:

    OC\DB\Connection->executeQuery("SELECT \"se ... )", { uid: "***redacted*** ... "}, [])

    /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php - line 214:

    Doctrine\DBAL\Query\QueryBuilder->execute()

    /var/www/nextcloud/apps/suspicious_login/lib/Service/ETLService.php - line 134:

    OC\DB\QueryBuilder\QueryBuilder->execute()

    /var/www/nextcloud/apps/suspicious_login/lib/BackgroundJob/ETLJob.php - line 51:

    OCA\SuspiciousLogin\Service\ETLService->extractAndTransform()

    /var/www/nextcloud/lib/public/BackgroundJob/Job.php - line 77:

    OCA\SuspiciousLogin\BackgroundJob\ETLJob->run(null)

    /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php - line 59:

    OCP\BackgroundJob\Job->execute(OC\BackgroundJob\JobList {}, OC\Log {})

    /var/www/nextcloud/cron.php - line 123:

    OCP\BackgroundJob\TimedJob->execute(OC\BackgroundJob\JobList {}, OC\Log {})

Cased by Doctrine\DBAL\Driver\PDOException: SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php - line 930:

    Doctrine\DBAL\Driver\PDOStatement->execute()

    /var/www/nextcloud/lib/private/DB/Connection.php - line 195:

    Doctrine\DBAL\Connection->executeQuery("SELECT \"se ... )", [ "***redacted*** ... "], [ 2,2], null)

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php - line 219:

    OC\DB\Connection->executeQuery("SELECT \"se ... )", { uid: "***redacted*** ... "}, [])

    /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php - line 214:

    Doctrine\DBAL\Query\QueryBuilder->execute()

    /var/www/nextcloud/apps/suspicious_login/lib/Service/ETLService.php - line 134:

    OC\DB\QueryBuilder\QueryBuilder->execute()

    /var/www/nextcloud/apps/suspicious_login/lib/BackgroundJob/ETLJob.php - line 51:

    OCA\SuspiciousLogin\Service\ETLService->extractAndTransform()

    /var/www/nextcloud/lib/public/BackgroundJob/Job.php - line 77:

    OCA\SuspiciousLogin\BackgroundJob\ETLJob->run(null)

    /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php - line 59:

    OCP\BackgroundJob\Job->execute(OC\BackgroundJob\JobList {}, OC\Log {})

    /var/www/nextcloud/cron.php - line 123:

    OCP\BackgroundJob\TimedJob->execute(OC\BackgroundJob\JobList {}, OC\Log {})

Cased by PDOException: SQLSTATE[25P02]: In failed sql transaction: 7 ERROR: current transaction is aborted, commands ignored until end of transaction block

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php - line 141:

    PDOStatement->execute(null)

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Connection.php - line 930:

    Doctrine\DBAL\Driver\PDOStatement->execute()

    /var/www/nextcloud/lib/private/DB/Connection.php - line 195:

    Doctrine\DBAL\Connection->executeQuery("SELECT \"se ... )", [ "***redacted*** ... "], [ 2,2], null)

    /var/www/nextcloud/3rdparty/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php - line 219:

    OC\DB\Connection->executeQuery("SELECT \"se ... )", { uid: "***redacted*** ... "}, [])

    /var/www/nextcloud/lib/private/DB/QueryBuilder/QueryBuilder.php - line 214:

    Doctrine\DBAL\Query\QueryBuilder->execute()

    /var/www/nextcloud/apps/suspicious_login/lib/Service/ETLService.php - line 134:

    OC\DB\QueryBuilder\QueryBuilder->execute()

    /var/www/nextcloud/apps/suspicious_login/lib/BackgroundJob/ETLJob.php - line 51:

    OCA\SuspiciousLogin\Service\ETLService->extractAndTransform()

    /var/www/nextcloud/lib/public/BackgroundJob/Job.php - line 77:

    OCA\SuspiciousLogin\BackgroundJob\ETLJob->run(null)

    /var/www/nextcloud/lib/public/BackgroundJob/TimedJob.php - line 59:

    OCP\BackgroundJob\Job->execute(OC\BackgroundJob\JobList {}, OC\Log {})

    /var/www/nextcloud/cron.php - line 123:

    OCP\BackgroundJob\TimedJob->execute(OC\BackgroundJob\JobList {}, OC\Log {})

How reset suspicious login data/model ?

Hello,

On my Nextcloud instance 'trusted_proxies' and 'forwarded_for_headers' wasn't properly configured, so the IP recorded by suspicious login was always the same, the local address of my reverse proxy, and suspicious login have been trained with these wrong data for a while...

Since I fixed the issue, most of login on the instance are detected as suspicious.

Is there a way to reset the model and ignore all the data before a certain date ? Or more simply reset the application ?

Thanks in advance for your support.

occ suspiciouslogin:optimize --stats causes an exception to be thrown

Nextcloud version: 17.0.1
Suspicious login app version: 2.4.1

The app itself seems to works as expected, but the execution of the following command causes an exception to be thrown:

./occ suspiciouslogin:optimize --stats
An unhandled exception has been thrown:
TypeError: Argument 2 passed to OCA\SuspiciousLogin\Service\MLP\Optimizer::optimize() must be an instance of OCA\SuspiciousLogin\Service\IClassificationStrategy, null given, called in NEXTCLOUD_DOC_ROOT/apps2/suspicious_login/lib/Command/Optimize.php on line 56 and defined in NEXTCLOUD_DOC_ROOT/apps2/suspicious_login/lib/Service/MLP/Optimizer.php:151
Stack trace:
#0 NEXTCLOUD_DOC_ROOT/apps2/suspicious_login/lib/Command/Optimize.php(56): OCA\SuspiciousLogin\Service\MLP\Optimizer->optimize(100, NULL, Object(Symfony\Component\Console\Output\ConsoleOutput))
#1 NEXTCLOUD_DOC_ROOT/3rdparty/symfony/console/Command/Command.php(255): OCA\SuspiciousLogin\Command\Optimize->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#2 NEXTCLOUD_DOC_ROOT/3rdparty/symfony/console/Application.php(908): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 NEXTCLOUD_DOC_ROOT/3rdparty/symfony/console/Application.php(269): Symfony\Component\Console\Application->doRunCommand(Object(OCA\SuspiciousLogin\Command\Optimize), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 NEXTCLOUD_DOC_ROOT/3rdparty/symfony/console/Application.php(145): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#5 NEXTCLOUD_DOC_ROOT/lib/private/Console/Application.php(213): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 NEXTCLOUD_DOC_ROOT/console.php(97): OC\Console\Application->run()
#7 NEXTCLOUD_DOC_ROOT/occ(11): require_once('NEXTCLOUD_DOC_ROOT...')

Degraded performance after update from 17.0.0.8 to 17.0.0.9

I just noticed that the model performance got a lot worse with one of the recent updates on my personal production server. Going through the logs tells me the app version was always the same, but the server version changed the same day as the results get worse.

Add a cleanup job for old data

Data sets that are outdated (older than the max age, possible with a bit of padding to allow parameter changes) should be deleted to keep the db small. This can be done in a simple background job.

enhancement: right now the IP in "Neuer Anmeldeort erkannt" info is almost useless

He!

Form time to time i get the "Neuer Anmeldeort erkannt" information with the IP of the device that wanted to login, but for, ruff guess, 98% of all intenet users doesnt even know what an IP is. So the info is almost useless, when you dont know how to handle that info.

but what most people know, most of the time, is the network they belong to right now or their several devices at home, at work, etc.

so what about when having an suspicious login, we know the IP and do a quick whois on that target IP, grep the netname, organisation, org-name and maybe the address of the company and put it into the information email.

so users can better decide "is one of my devices right now logged into this network? and do i have to change my pw?"

regards
sash

Send an email

Notifications can be dismissed. This app should also send an email to the user if possible.

Could not deserialize persisted model

I have a lot of following errors on NC protocol:

"Could not deserialize persisted model 254: Missing class definition for unserialized object."

Here are the raw data:
{"reqId":"tDWLs8oLa6wApE1uFe9r","level":4,"time":"2021-04-12T10:19:43+00:00","remoteAddr":"192.168.1.101","user":"sync","app":"suspicious_login","method":"REPORT","url":"/remote.php/dav/addressbooks/users/sync/gemeinsam/","message":"Could not deserialize persisted model 254: Missing class definition for unserialized object.","userAgent":"macOS/11.2.3 (20D91) AddressBookCore/2452.4","version":"21.0.1.1","id":"60741ec2b4442"}

Steps to reproduce

Expected behaviour

Contact sync is ok. I have very much denied http request regarding to contact/calendar sync. I dont know, if this have something to do with each other.

Actual behaviour

This error in nc protocol

Server configuration

**Operating system: linuxserver/nextcloud docker image

**Web server: nginx (linuxserver/nextcloud docker image)

**Database: MariaDB (linuxserver/nextcloud docker image)

**PHP version: 7.4.15

**Nextcloud version: 21.0.1

**Updated from an older Nextcloud/ownCloud or fresh install: Updated from 20.xx

**Where did you install Nextcloud from: docker image

Signing status:

Signing status
No errors have been found.

List of activated apps:

App list
Enabled:
  - accessibility: 1.7.0
  - activity: 2.14.3
  - admin_audit: 1.11.0
  - bruteforcesettings: 2.1.0
  - calendar: 2.2.0
  - cloud_federation_api: 1.4.0
  - contacts: 3.5.1
  - contactsinteraction: 1.2.0
  - dashboard: 7.1.0
  - dav: 1.17.1
  - federatedfilesharing: 1.11.0
  - files: 1.16.0
  - files_pdfviewer: 2.1.0
  - files_rightclick: 1.0.0
  - files_sharing: 1.13.1
  - files_trackdownloads: 1.10.0
  - files_trashbin: 1.11.0
  - files_versions: 1.14.0
  - files_videoplayer: 1.10.0
  - firstrunwizard: 2.10.0
  - forms: 2.2.4
  - logreader: 2.6.0
  - lookup_server_connector: 1.9.0
  - mail: 1.9.5
  - nextcloud_announcements: 1.10.0
  - notifications: 2.9.0
  - oauth2: 1.9.0
  - password_policy: 1.11.0
  - photos: 1.3.0
  - previewgenerator: 3.1.1
  - privacy: 1.5.0
  - provisioning_api: 1.11.0
  - recommendations: 1.0.0
  - serverinfo: 1.11.0
  - settings: 1.3.0
  - support: 1.4.0
  - suspicious_login: 4.0.0
  - systemtags: 1.11.0
  - tasks: 0.13.6
  - text: 3.2.0
  - theming: 1.12.0
  - twofactor_backupcodes: 1.10.0
  - twofactor_totp: 6.0.0
  - updatenotification: 1.11.0
  - user_status: 1.1.1
  - viewer: 1.5.0
  - weather_status: 1.1.0
  - workflowengine: 2.3.0
Disabled:
  - comments
  - encryption
  - federation
  - files_external
  - sharebymail
  - spreed
  - survey_client
  - user_ldap

Nextcloud configuration:

Config report
{
    "system": {
        "memcache.local": "\\OC\\Memcache\\APCu",
        "datadirectory": "***REMOVED SENSITIVE VALUE***",
        "instanceid": "***REMOVED SENSITIVE VALUE***",
        "passwordsalt": "***REMOVED SENSITIVE VALUE***",
        "secret": "***REMOVED SENSITIVE VALUE***",
        "trusted_domains": [
            "local_name:9443",
            "my_domain.me"
        ],
        "trusted_proxies": "***REMOVED SENSITIVE VALUE***",
        "dbtype": "mysql",
        "version": "21.0.1.1",
        "overwrite.cli.url": "https:\/\/local_name:9443",
        "dbname": "***REMOVED SENSITIVE VALUE***",
        "dbhost": "***REMOVED SENSITIVE VALUE***",
        "dbport": "",
        "dbtableprefix": "oc_",
        "mysql.utf8mb4": true,
        "dbuser": "***REMOVED SENSITIVE VALUE***",
        "dbpassword": "***REMOVED SENSITIVE VALUE***",
        "installed": true,
        "maintenance": false,
        "twofactor_enforced": "false",
        "twofactor_enforced_groups": [],
        "twofactor_enforced_excluded_groups": [],
        "theme": "",
        "loglevel": 0,
        "mail_from_address": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpmode": "smtp",
        "mail_sendmailmode": "smtp",
        "mail_domain": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpauthtype": "LOGIN",
        "mail_smtpsecure": "tls",
        "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpport": "587",
        "mail_smtpauth": 1,
        "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
        "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
        "app_install_overwrite": [
            "calendar",
            "bruteforcesettings"
        ],
        "default_phone_region": "DE"
    }
}

**Are you using external storage, if yes which one: no

**Are you using encryption: no

**Are you using an external user-backend, if yes which one: no

Client configuration

**Browser: Brave

**Operating system: MacOS

Logs

Web server error log

Web server error log
Insert your webserver log here

Nextcloud log (data/nextcloud.log)

Nextcloud log
{"reqId":"9bA52GmunmHWrJpsINnX","level":4,"time":"2021-04-12T10:31:17+00:00","remoteAddr":"192.168.1.101","user":"my_second_user","app":"suspicious_login","method":"REPORT","url":"/remote.php/dav/addressbooks/users/my_second_user/gemeinsam/","message":"Could not deserialize persisted model 254: Missing class definition for unserialized object.","userAgent":"macOS/11.2.3 (20D91) AddressBookCore/2452.4","version":"21.0.1.1"}
{"reqId":"9bA52GmunmHWrJpsINnX","level":2,"time":"2021-04-12T10:31:17+00:00","remoteAddr":"192.168.1.101","user":"my_second_user","app":"suspicious_login","method":"REPORT","url":"/remote.php/dav/addressbooks/users/my_second_user/gemeinsam/","message":"Could not predict suspiciousness: Could not load model  to classify UID sync and IP 192.168.1.101: Missing class definition for unserialized object.","userAgent":"macOS/11.2.3 (20D91) AddressBookCore/2452.4","version":"21.0.1.1"}
{"reqId":"bmpsLJ0UpDOFP1Rq8qKM","level":0,"time":"2021-04-12T10:31:20+00:00","remoteAddr":"192.168.1.101","user":"my_user","app":"suspicious_login","method":"PROPFIND","url":"/remote.php/dav/files/my_user/","message":"/appinfo/app.php is deprecated, use \\OCP\\AppFramework\\Bootstrap\\IBootstrap on the application class instead.","userAgent":"Mozilla/5.0 (Macintosh) mirall/3.1.3git (build 4850) (Nextcloud)","version":"21.0.1.1"}
{"reqId":"bmpsLJ0UpDOFP1Rq8qKM","level":0,"time":"2021-04-12T10:31:20+00:00","remoteAddr":"192.168.1.101","user":"my_user","app":"contacts","method":"PROPFIND","url":"/remote.php/dav/files/my_user/","message":"/appinfo/app.php is deprecated, use \\OCP\\AppFramework\\Bootstrap\\IBootstrap on the application class instead.","userAgent":"Mozilla/5.0 (Macintosh) mirall/3.1.3git (build 4850) (Nextcloud)","version":"21.0.1.1"}
{"reqId":"bmpsLJ0UpDOFP1Rq8qKM","level":0,"time":"2021-04-12T10:31:20+00:00","remoteAddr":"192.168.1.101","user":"my_user","app":"files_sharing","method":"PROPFIND","url":"/remote.php/dav/files/my_user/","message":"/appinfo/app.php is deprecated, use \\OCP\\AppFramework\\Bootstrap\\IBootstrap on the application class instead.","userAgent":"Mozilla/5.0 (Macintosh) mirall/3.1.3git (build 4850) (Nextcloud)","version":"21.0.1.1"}

Lots of warnings for IPv6 addresses on local subnet

I installed version 1.0.0 on nextcloud 16 recently and I get a lot warnings all from the same IPv6 subnet, which happens to the local subnet the server is in:

fd5b:db8:beef:0::/64

This is rather annoying, because clients change their "interface identifier" part of their address frequently for privacy reasons.

Is there an option for whitelisting IP ranges (although this might have security implications if attackers get access to that net)?

Show feedback for admins

As noted by @MorrisJobke at #31 (comment), it would be great to show a bit of feedback to the admin.

This can include

  • Is sufficient data available?
  • How much (aggregated) data is available?
  • When was the last training?
  • How good is the latest/current model?
  • Were there any alerts today/this week?

Can't enable the app

Hi Christoph,

I've got the same problem as described in #415.
I tried to install the app on NC 21 with a version below 4.0 and ran into an error (Error: There is no table with name 'xxx.oc_suspicious_login_model' in the schema.)

After waiting for version 4.0 and trying to remove and/or reinstall now, it throws the same error.
No difference between the browser-based installation or the cli-way with occ.

Do you have an idea how to fix this?

Kidn regards
Michael

Error: Undefined index: settings at /var/www/html/lib/private/AppFramework/Bootstrap/RegistrationContext.php#404
/var/www/html/lib/private/AppFramework/Bootstrap/RegistrationContext.php - line 404:

OC\Log\ErrorHandler::onError(8, "Undefined index: settings", "/var/www/ht ... p", 404, { apps: [],r ... "})

/var/www/html/lib/private/AppFramework/Bootstrap/Coordinator.php - line 143:

OC\AppFramework\Bootstrap\RegistrationContext->delegateContainerRegistrations([])

/var/www/html/lib/private/AppFramework/Bootstrap/Coordinator.php - line 86:

OC\AppFramework\Bootstrap\Coordinator->registerApps([ "suspicious_login"])

/var/www/html/lib/private/Installer.php - line 146:

OC\AppFramework\Bootstrap\Coordinator->runLazyRegistration("suspicious_login")

/var/www/html/core/Command/App/Install.php - line 68:

OC\Installer->installApp("suspicious_login")

/var/www/html/3rdparty/symfony/console/Command/Command.php - line 255:

OC\Core\Command\App\Install->execute(Symfony\Comp ... {}, Symfony\Comp ... {})

/var/www/html/3rdparty/symfony/console/Application.php - line 1009:

Symfony\Component\Console\Command\Command->run(Symfony\Comp ... {}, Symfony\Comp ... {})

/var/www/html/3rdparty/symfony/console/Application.php - line 273:

Symfony\Component\Console\Application->doRunCommand(OC\Core\Command\App\Install {}, Symfony\Comp ... {}, Symfony\Comp ... {})

/var/www/html/3rdparty/symfony/console/Application.php - line 149:

Symfony\Component\Console\Application->doRun(Symfony\Comp ... {}, Symfony\Comp ... {})

/var/www/html/lib/private/Console/Application.php - line 215:

Symfony\Component\Console\Application->run(Symfony\Comp ... {}, Symfony\Comp ... {})

/var/www/html/console.php - line 100:

OC\Console\Application->run()

/var/www/html/occ - line 11:

require_once("/var/www/html/console.php")

App raises fatal error about missing model on recent activations

On new installs, the app will raises a fatal error about it missing a model:

{"reqId":"ksqdCUucdhnLY2UHkYM1","level":4,"time":"2019-05-17T15:16:15+00:00","remoteAddr":"10.8.10.6","user":"admin","app":"suspicious_login","method":"POST","url":"\/index.php\/login?redirect_url=\/index.php\/settings\/admin\/logging","message":"No models found. Can't load latest","userAgent":"Mozilla\/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko\/20100101 Firefox\/66.0","version":"16.0.1.1"}
{"reqId":"ksqdCUucdhnLY2UHkYM1","level":2,"time":"2019-05-17T15:16:15+00:00","remoteAddr":"10.8.10.6","user":"admin","app":"suspicious_login","method":"POST","url":"\/index.php\/login?redirect_url=\/index.php\/settings\/admin\/logging","message":"Could not predict suspiciousness: No models found","userAgent":"Mozilla\/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko\/20100101 Firefox\/66.0","version":"16.0.1.1"}

This is obviously expected since there has not been enough time to amass data. Would it not make sense to adapt the severity of the message based on the presence of "young" training data ? Eg. something like:

  1. detect the presence of data and its age
  2. if no data or data is < 60 days old
    => warn
  3. else (if no model and data is >= 60 days old)
    => assume that a model should have been trained and raise a (fatal) error.

This would be consistent when the "severity" of the message if the admin console:

No classifier model has been trained yet. This most likely means that you just enabled the app recently. Because the training of a model requires good data, the app waits until logins of at least 60 days have been captured.

Time of login ?

Is there a way to view the table of the suspicious login IP + Date + Time ?

reports invalid IP address

I installed the app today. I just got a warning about a suspicious login from 2003:d3:c719:5c00.95f2:6fbc:e6f:9da4, which doesn't seem to be a valid ipv6 address

Screenshot_2019-09-27 Einstellungen - Nextcloud

Insufficient data: No recent data available

I did install the plugin on 2 sites. One did work as expected, but the second one is stuck.

  • the plugin was installed about 6 months ago (should be long enough)
  • Training data statistics: So far the app has captured 30013533 logins (including client connections), of which 37 are distinct (IP, UID) tuples.
  • php -f occ suspiciouslogin:train => Not enough data, try again later (Insufficient data: No recent data available)

Any help how to get out of this would be welcome. Any file or db table to delete ?

Clarify use case of app & recall/precision; ML model seems bad

Hi,
I have had this app installed for a while now, but cannot really figure out what it is supposed to be used for, for multiple reasons.

as far as I can tell, the app

i) collects (ip, uid) tuples of sucessful logins and trains a ML model from that
ii) checks if the login is classified as suspicious
iii) if yes, sends a notification to the account in question

However, really, what is the point of (iii)?
It does not block logins. And in fact, once an attacker gets into the account, they can just delete that notification. Which will then also disappear on all other devices. The only useful thing about it would be if 'suspicious'-classified logins could not delete any notifications from suspicious_login or could not login at all without 2FA or something.

2nd, about point ii). In my case it seems to flag basically EVERY* log-in with a new IP as suspicious, even if it comes from an IP address very close (numerically) to previous IP addresses. If I want it to do that, there is no need for any sort machine learning. It seems the model may not be 100% fit for purpose. I assume it also uses neither geographical information nor internet topology information, which would be very useful for a classification model pipeline (i.e. turn (ip, uid) into (ip, uid, lat, long) for training with geographic info), and would drastically reduce the amount of data required. Is there a command with which I can test the classifier on an (ip, uid) tuple of my choosing?

3rd, again about point ii). The security page lists two stats, first, recall ('fraction of all suspicious logins captured', TP/(TP+FN), precision ('fraction of logins classified as suspicious that are indeed suspicious', TP/(TP+FP). How can you make these stats? I would wager that 100% of the successful logins on my instance are legitmate so there are zero "actually suspicious" logins, so the real precision is zero. According to the repository description you are also not using failed logins. So where do you get authoritative/"supervised" information from? All you really know is (TP+FP) and (TN+FN).
So, what exactly do TP, FP, FN mean here? My best guess:

Assume G is the full address space, M: (ip,uid) -> {0, 1} is your classifier model.
My best guess is that you 1) assume all captured (successful) logins L are legitimate, and that 2) all** G \ L are suspicious, of which you pick a random set. You then run M(t) on the non-training part of set L (and get FP & TN), and run M(t) on a random sample of G \ L (and get TP & FN).

Again, is there a command with which I can test just the trained classifier on an (ip, uid) tuple of my choosing?

*"So far the app has captured 555049 logins (including client connections), of which 829 are distinct (IP, UID) tuples."

**or a certain subset with minimum distance to L according to some metric?

AddressBookCore - Missing class definition for unserialized object.

How to use GitHub

  • Please use the 👍 reaction to show that you are affected by the same issue.
  • Please don't comment if you have no relevant information to add. It's just extra noise for everyone subscribed to this issue.
  • Subscribe to receive notifications on status change and new comments.

I have a lot of following errors on NC protocol:
"Could not deserialize persisted model 254: Missing class definition for unserialized object."

Here are the raw data:
{"reqId":"tDWLs8oLa6wApE1uFe9r","level":4,"time":"2021-04-12T10:19:43+00:00","remoteAddr":"192.168.1.101","user":"sync","app":"suspicious_login","method":"REPORT","url":"/remote.php/dav/addressbooks/users/sync/gemeinsam/","message":"Could not deserialize persisted model 254: Missing class definition for unserialized object.","userAgent":"macOS/11.2.3 (20D91) AddressBookCore/2452.4","version":"21.0.1.1","id":"60741ec2b4442"}

Steps to reproduce

Expected behaviour

Contact sync is ok. I have very much denied http request regarding to contact/calendar sync. I dont know, if this have something to do with each other.

Actual behaviour

This error in nc protocol

Server configuration

**Operating system: linuxserver/nextcloud docker image

**Web server: nginx (linuxserver/nextcloud docker image)

**Database: MariaDB (linuxserver/nextcloud docker image)

**PHP version: 7.4.15

**Nextcloud version: 21.0.1

**Updated from an older Nextcloud/ownCloud or fresh install: Updated from 20.xx

**Where did you install Nextcloud from: docker image

Signing status:

Signing status
No errors have been found.

List of activated apps:

App list
Enabled:
  - accessibility: 1.7.0
  - activity: 2.14.3
  - admin_audit: 1.11.0
  - bruteforcesettings: 2.1.0
  - calendar: 2.2.0
  - cloud_federation_api: 1.4.0
  - contacts: 3.5.1
  - contactsinteraction: 1.2.0
  - dashboard: 7.1.0
  - dav: 1.17.1
  - federatedfilesharing: 1.11.0
  - files: 1.16.0
  - files_pdfviewer: 2.1.0
  - files_rightclick: 1.0.0
  - files_sharing: 1.13.1
  - files_trackdownloads: 1.10.0
  - files_trashbin: 1.11.0
  - files_versions: 1.14.0
  - files_videoplayer: 1.10.0
  - firstrunwizard: 2.10.0
  - forms: 2.2.4
  - logreader: 2.6.0
  - lookup_server_connector: 1.9.0
  - mail: 1.9.5
  - nextcloud_announcements: 1.10.0
  - notifications: 2.9.0
  - oauth2: 1.9.0
  - password_policy: 1.11.0
  - photos: 1.3.0
  - previewgenerator: 3.1.1
  - privacy: 1.5.0
  - provisioning_api: 1.11.0
  - recommendations: 1.0.0
  - serverinfo: 1.11.0
  - settings: 1.3.0
  - support: 1.4.0
  - suspicious_login: 4.0.0
  - systemtags: 1.11.0
  - tasks: 0.13.6
  - text: 3.2.0
  - theming: 1.12.0
  - twofactor_backupcodes: 1.10.0
  - twofactor_totp: 6.0.0
  - updatenotification: 1.11.0
  - user_status: 1.1.1
  - viewer: 1.5.0
  - weather_status: 1.1.0
  - workflowengine: 2.3.0
Disabled:
  - comments
  - encryption
  - federation
  - files_external
  - sharebymail
  - spreed
  - survey_client
  - user_ldap

Nextcloud configuration:

Config report
{
    "system": {
        "memcache.local": "\\OC\\Memcache\\APCu",
        "datadirectory": "***REMOVED SENSITIVE VALUE***",
        "instanceid": "***REMOVED SENSITIVE VALUE***",
        "passwordsalt": "***REMOVED SENSITIVE VALUE***",
        "secret": "***REMOVED SENSITIVE VALUE***",
        "trusted_domains": [
            "local_name:9443",
            "my_domain.me"
        ],
        "trusted_proxies": "***REMOVED SENSITIVE VALUE***",
        "dbtype": "mysql",
        "version": "21.0.1.1",
        "overwrite.cli.url": "https:\/\/local_name:9443",
        "dbname": "***REMOVED SENSITIVE VALUE***",
        "dbhost": "***REMOVED SENSITIVE VALUE***",
        "dbport": "",
        "dbtableprefix": "oc_",
        "mysql.utf8mb4": true,
        "dbuser": "***REMOVED SENSITIVE VALUE***",
        "dbpassword": "***REMOVED SENSITIVE VALUE***",
        "installed": true,
        "maintenance": false,
        "twofactor_enforced": "false",
        "twofactor_enforced_groups": [],
        "twofactor_enforced_excluded_groups": [],
        "theme": "",
        "loglevel": 0,
        "mail_from_address": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpmode": "smtp",
        "mail_sendmailmode": "smtp",
        "mail_domain": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpauthtype": "LOGIN",
        "mail_smtpsecure": "tls",
        "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpport": "587",
        "mail_smtpauth": 1,
        "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
        "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
        "app_install_overwrite": [
            "calendar",
            "bruteforcesettings"
        ],
        "default_phone_region": "DE"
    }
}

**Are you using external storage, if yes which one: no

**Are you using encryption: no

**Are you using an external user-backend, if yes which one: no

Client configuration

**Browser: Brave

**Operating system: MacOS

Logs

Web server error log

Web server error log
2021/04/12 12:13:31 [error] 3163#3163: *200267 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.1.101, server: my_domain.me, request: "PROPFIND /remote.php/dav/files/my_user/ HTTP/1.1", upstream: "https
://192.168.1.3:9443/remote.php/dav/files/ruba/", host: "nc.rbnet.me"
2021/04/12 12:13:35 [error] 3163#3163: *200396 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.1.101, server: my_domain.me, request: "OPTIONS /remote.php/dav/principals/users/sync/ HTTP/1.1", upstream: "https://192.168.1.3:9443/remote.php/dav/principals/users/my_second_user/", host: "my_domain.me"

Nextcloud log (data/nextcloud.log)

Nextcloud log
{"reqId":"9bA52GmunmHWrJpsINnX","level":4,"time":"2021-04-12T10:31:17+00:00","remoteAddr":"192.168.1.101","user":"my_second_user","app":"suspicious_login","method":"REPORT","url":"/remote.php/dav/addressbooks/users/my_second_user/gemeinsam/","message":"Could not deserialize persisted model 254: Missing class definition for unserialized object.","userAgent":"macOS/11.2.3 (20D91) AddressBookCore/2452.4","version":"21.0.1.1"}
{"reqId":"9bA52GmunmHWrJpsINnX","level":2,"time":"2021-04-12T10:31:17+00:00","remoteAddr":"192.168.1.101","user":"my_second_user","app":"suspicious_login","method":"REPORT","url":"/remote.php/dav/addressbooks/users/my_second_user/gemeinsam/","message":"Could not predict suspiciousness: Could not load model  to classify UID sync and IP 192.168.1.101: Missing class definition for unserialized object.","userAgent":"macOS/11.2.3 (20D91) AddressBookCore/2452.4","version":"21.0.1.1"}
{"reqId":"bmpsLJ0UpDOFP1Rq8qKM","level":0,"time":"2021-04-12T10:31:20+00:00","remoteAddr":"192.168.1.101","user":"my_user","app":"suspicious_login","method":"PROPFIND","url":"/remote.php/dav/files/my_user/","message":"/appinfo/app.php is deprecated, use \\OCP\\AppFramework\\Bootstrap\\IBootstrap on the application class instead.","userAgent":"Mozilla/5.0 (Macintosh) mirall/3.1.3git (build 4850) (Nextcloud)","version":"21.0.1.1"}
{"reqId":"bmpsLJ0UpDOFP1Rq8qKM","level":0,"time":"2021-04-12T10:31:20+00:00","remoteAddr":"192.168.1.101","user":"my_user","app":"contacts","method":"PROPFIND","url":"/remote.php/dav/files/my_user/","message":"/appinfo/app.php is deprecated, use \\OCP\\AppFramework\\Bootstrap\\IBootstrap on the application class instead.","userAgent":"Mozilla/5.0 (Macintosh) mirall/3.1.3git (build 4850) (Nextcloud)","version":"21.0.1.1"}
{"reqId":"bmpsLJ0UpDOFP1Rq8qKM","level":0,"time":"2021-04-12T10:31:20+00:00","remoteAddr":"192.168.1.101","user":"my_user","app":"files_sharing","method":"PROPFIND","url":"/remote.php/dav/files/my_user/","message":"/appinfo/app.php is deprecated, use \\OCP\\AppFramework\\Bootstrap\\IBootstrap on the application class instead.","userAgent":"Mozilla/5.0 (Macintosh) mirall/3.1.3git (build 4850) (Nextcloud)","version":"21.0.1.1"}

Add the expected date, when the app is going to be active

Hi,

it would be nice if you could add the expected date, when the app is going to be active in the admin settings. (When the 60 days are going to be reached)

This would tell the admin the date when she should have a look on the security settings again.

Suggestion of the message (bold):

Ein Kriterienmodell wurde bis jetzt noch nicht erstellt. Dies bedeutet, dass die Anwendung höchstwahrscheinlich erst kürzlich aktiviert wurde. Um ein Kriterienmodell erstellen zu können, wird eine verlässliche Datenbasis benötigt. Aus diesem Grund wartet die Anwendung, bis Anmeldungen von mindestens 60 Tagen (voraussichtlich am 01.01.2021) erfasst wurden.

Many thanks

PHP Fatal error: causes update from 18.0.7 to 18.0.8 to fail

Nextcloud system becomes unusable:

A occ -h returns:
cf394fd77aca:/var/www/html$ occ -h -sh: occ: not found cf394fd77aca:/var/www/html$ ./occ -h PHP Fatal error: Declaration of Symfony\Component\Console\Input\ArrayInput::hasParameterOption($values, bool $onlyParams = false) must be compatible with Symfony\Component\Console\Input\InputInterface::hasParameterOption($values, $onlyParams = false) in /var/www/html/custom_apps/suspicious_login/vendor/symfony/console/Input/ArrayInput.php on line 202
Data log shows:
{"reqId":"UU9bPOOz4PvChBABRmpU","level":3,"time":"2020-08-31 17:35:21","remoteAddr":"","user":"--","app":"PHP","method":"","url":"--","message":"Declaration of Symfony\\Component\\Console\\Input\\ArrayInput::hasParamet erOption($values, bool $onlyParams = false) must be compatible with Symfony\\Component\\Console\\Input\\InputInterface::hasParameterOption($values, $onlyParams = false) at /var/www/html/custom_apps/suspicious_login/ven dor/symfony/console/Input/ArrayInput.php#202","userAgent":"--","version":"18.0.8.2"}
Going into the docker-session, one can disable the app with:
cf394fd77aca:/var/www/html$ ./occ app:disable suspicious_login suspicious_login disabled

what does mean this graphic and where are the configuration option?

problem_nextcloud_suspiciousactivity_Annotation 2020-02-24 013645
I'm sorry but this is unclear to me.
What's recall?
precision is mentionned between '()' so I guess that points to a possible definition. But how is the graphic made exactly? There are apparently no options to configure what's a suspicious activity and what a normal activity.
The x axis is clear, it's date. But what's the y axis? %? if yes then it is crazy that my external instance of this screenshot is classifying everything as suspicious....

Make sure not to send out numerous notifications for the very same IP within a certain time span

As described in #38, there are cases where a user might have a client connected that uses the login password instead of the app password. Most likely, that account has been set up ages ago, because new client version will use app passwords now.

Anyway, we must not spam the user with notifications in the case of a (large) number of requests. One notification per IP and time span (two hours? a day?) is sufficient.

cc @rullzer as discussed

No login possible

Today i can't login with any my device, without changing anything.

I use the plugin since last year now and never get problems. Last weekend i update to latest version and to latest Nextcloud (19)

Edit: using the train command looks like fixed it

"Could not load model 143" warning flooding the logs

I have a similar issue to #158 with model 143. I can't find a model 143 in /appdata_xxxx/suspicious_login/models/143., but there is a 144 and 145.

Using the model in the console:

$ occ suspiciouslogin:predict -v llucax 192.168.10.10 143

In ModelPersistenceService.php line 138:
                                                    
  [OCA\SuspiciousLogin\Exception\ServiceException]  
  Could not load model 143                          
                                                    

Exception trace:
  at /var/www/nextcloud/apps/suspicious_login/lib/Service/ModelPersistenceService.php:138
 OCA\SuspiciousLogin\Service\ModelPersistenceService->load() at /var/www/nextcloud/apps/suspicious_login/lib/Service/EstimatorService.php:63
 OCA\SuspiciousLogin\Service\EstimatorService->predict() at /var/www/nextcloud/apps/suspicious_login/lib/Command/Predict.php:77
 OCA\SuspiciousLogin\Command\Predict->execute() at /var/www/nextcloud/3rdparty/symfony/console/Command/Command.php:255
 Symfony\Component\Console\Command\Command->run() at /var/www/nextcloud/3rdparty/symfony/console/Application.php:1012
 Symfony\Component\Console\Application->doRunCommand() at /var/www/nextcloud/3rdparty/symfony/console/Application.php:272
 Symfony\Component\Console\Application->doRun() at /var/www/nextcloud/3rdparty/symfony/console/Application.php:148
 Symfony\Component\Console\Application->run() at /var/www/nextcloud/lib/private/Console/Application.php:215
 OC\Console\Application->run() at /var/www/nextcloud/console.php:100
 require_once() at /var/www/nextcloud/occ:11

In Root.php line 205:
                                                     
  [OCP\Files\NotFoundException]                      
  /appdata_xxxxx/suspicious_login/models/143  
                                                     

Exception trace:
  at /var/www/nextcloud/lib/private/Files/Node/Root.php:205
 OC\Files\Node\Root->get() at /var/www/nextcloud/lib/private/Files/Node/Folder.php:138
 OC\Files\Node\Folder->get() at /var/www/nextcloud/lib/private/Files/SimpleFS/SimpleFolder.php:76
 OC\Files\SimpleFS\SimpleFolder->getFile() at /var/www/nextcloud/apps/suspicious_login/lib/Service/ModelPersistenceService.php:135
 OCA\SuspiciousLogin\Service\ModelPersistenceService->load() at /var/www/nextcloud/apps/suspicious_login/lib/Service/EstimatorService.php:63
 OCA\SuspiciousLogin\Service\EstimatorService->predict() at /var/www/nextcloud/apps/suspicious_login/lib/Command/Predict.php:77
 OCA\SuspiciousLogin\Command\Predict->execute() at /var/www/nextcloud/3rdparty/symfony/console/Command/Command.php:255
 Symfony\Component\Console\Command\Command->run() at /var/www/nextcloud/3rdparty/symfony/console/Application.php:1012
 Symfony\Component\Console\Application->doRunCommand() at /var/www/nextcloud/3rdparty/symfony/console/Application.php:272
 Symfony\Component\Console\Application->doRun() at /var/www/nextcloud/3rdparty/symfony/console/Application.php:148
 Symfony\Component\Console\Application->run() at /var/www/nextcloud/lib/private/Console/Application.php:215
 OC\Console\Application->run() at /var/www/nextcloud/console.php:100
 require_once() at /var/www/nextcloud/occ:11

suspiciouslogin:predict [--v6] [--] <uid> <ip> [<model>]

(the xxxxxx is the masked ID, not sure if it would be a security or privacy issue if I share it)

I had some out of space issues just a few days ago, and I have the suspicion (pun intended) that it might have happened that the model had to be created in the disk but couldn't because of the lack of space (inodes in reality).

Could this have happened? And if so, would it be OK to remove the model from the DB (from table suspicious_login_model, something else?) or to just copy another model file as a hack? Or the non-existence of that file is normal and I should wait 60 days and that should be all?

In any case is not ideal to have the logs flooded with a warning that is not really a warning if it's expected behavior, so in any case I think there is something that can be improved here.

Can't download: curl timeout

Hello,

I'm trying to download this app, but this is the result:

cURL error 28: Operation timed out after 30000 milliseconds with 452166 out of 1195120 bytes received (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

I think the reason for this is the restricted way the targeted machine is connected to the net. Is there any other way to download this app, maybe as a zip file?

Thanks in advance.

Make Suspicious Login a Featured App

I've been using this app on my nextcloud server and I love it. Personally I think this app should be a "Featured App"
Big plus on the security side of things. Plus a lot of other campiness like Google, Microsoft, Instagram have this enabled by default.

Blocking Next cloud bookmark android app add bookmark API

Hi There,
Suspicious Login App is blocking Bookmark API call from the Android app. Below is the configuration:

  • android 9 (EMUI9.1.0)
  • Device Huawei p20.
  • Nextcloudpi v1.24.0
  • nextcloud 18.0.6
  • Runnning in docker container on raspbian lite on Rasberry Pi 4 4GB.

The error is given below:

{"reqId":"Xue@rz@O60kwebLtVEhNAwAAAAw","level":2,"time":"2020-06-15T18:32:16+00:00","remoteAddr":"192.168.1.1","user":"lukebeart","app":"suspicious_login","method":"GET","url":"/index.php/apps/bookmarks/public/rest/v2/bookmark?page=-1","message":"Could not predict suspiciousness: No models found","userAgent":"Dalvik/2.1.0 (Linux; U; Android 9; EML-L09 Build/HUAWEIEML-L09)","version":"18.0.6.0"}

I have checked for other devices its not blocking but some how raspbian lite on Rasberry Pi 4 4GB next cloud instance it is blocking that particular API call. Any reason you can find? App Code: Repo & Android App code: Repo. Create Bookmark API: Docs. I need to close this issue. Any help will be appriciated.
Cheers
Biswajit.

Allow users to opt-out from login alerts

I can imagine that not all users care about these events and might want to disable the notifications for their account.

There is also the case where a user has clients connected that use the login password. In that case the classifier might very often warn about a login, though there was none. For flawless security we can't duck type a connection to being a client because attackers can also just use a Nextcloud client to access the victim's data. Hence the separation of web login and client access does not help here.

The proposed solution is a simple checkbox on the user's personal settings page that default to checked. If unchecked, the app will never send out notifications.

cc @rullzer as discussed

No models found

Steps to reproduce

Run ./occ suspiciouslogin:predict <uid> <ip>

In ModelPersistenceService.php line 91:
                   
  No models found  
                   

In QBMapper.php line 248:
                                                                                                                                                   
  Did expect one result but found none when executing: query "SELECT * FROM `*PREFIX*suspicious_login_model` ORDER BY `created_at` desc LIMIT 1";  
                                                                                                                                                   

suspiciouslogin:predict <uid> <ip> [<model>]

Expected behaviour

No idea, but not this.

Actual behaviour

In ModelPersistenceService.php line 91:
                   
  No models found  
                   

In QBMapper.php line 248:
                                                                                                                                                   
  Did expect one result but found none when executing: query "SELECT * FROM `*PREFIX*suspicious_login_model` ORDER BY `created_at` desc LIMIT 1";  
                                                                                                                                                   

suspiciouslogin:predict <uid> <ip> [<model>]

Server configuration detail

Operating system: Linux 5.0.21-1-pve #1 SMP PVE 5.0.21-2 (Wed, 28 Aug 2019 15:12:18 +0200) x86_64

Webserver: Apache/2.4.38 (Debian) (apache2handler)

Database: mysql 10.3.17

PHP version:

7.3.4-2
Modules loaded: Core, date, libxml, openssl, pcre, zlib, filter, hash, Reflection, SPL, session, sodium, standard, apache2handler, pdlib, mysqlnd, PDO, xml, apcu, bz2, calendar, ctype, curl, dom, mbstring, fileinfo, ftp, gd, gettext, gmp, iconv, igbinary, imagick, imap, intl, json, exif, msgpack, mysqli, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, apc, posix, readline, redis, shmop, SimpleXML, smbclient, sockets, sqlite3, ssh2, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xmlreader, xmlrpc, xmlwriter, xsl, zip, Phar, memcached, libsmbclient, Zend OPcache

Nextcloud version: 16.0.4 - 16.0.4.1

Updated from an older Nextcloud/ownCloud or fresh install:

Where did you install Nextcloud from: unknown

Signing status

Array
(
[core] => Array
(
[INVALID_HASH] => Array
(
[core/js/mimetypelist.js] => Array
(
[expected] => dc48de7ad4baa030c5e563350c9a80b274bad783f6f5adbf1595ecef6c6a32e52890a24cb26cddb0aa20193ba52c001150c68d8bfb567f0aed566f4029a190a3
[current] => 6a05a7a2bd52651177dc54170f94c7ccf1966c421f30540be49d64770d71c71731052565c2f8e00406a579e7c78dad16673202051231626f1e6d4e656046e6fc
)

            )

        [EXTRA_FILE] => Array
            (
                [composer.lock] => Array
                    (
                        [expected] => 
                        [current] => 00e7566851a3b7c76b6a16f4425c31c42dfacfc6d93206dbdfba403b4655ae5c7672db3fcb11d2add955eab3d4ca2a750ec13753f576e9e6f6a9397de539a1a3
                    )

                [vendor/autoload.php] => Array
                    (
                        [expected] => 
                        [current] => 0682b77f2d751aed2a88c532c6644b3a4c6406862babc82ca8ae5d7ed550646dabcb57167ae25c93a5c6719a122e838dc06ec468e655f9f78997dd9fd015834a
                    )

                [vendor/php-ai/php-ml/composer.lock] => Array
                    (
                        [expected] => 
                        [current] => 59d00971ad1c219aa1f47e870dfabaab73ea1a1dbba7f2ad9e1292b701764f346d31cc70bff54340ace283797a6a6021e485f5e5b36a270f33ca19d4b83ceeb6
                    )

                [vendor/php-ai/php-ml/.editorconfig] => Array
                    (
                        [expected] => 
                        [current] => 366744f34c7adf27b97147dd9b03f3929900f0807bb1cf7066a19bb6058994d1a16da69fe6cd398aa55b7b07c31aaa7de3c2d16514816a9f9e8cde86cc4ce31f
                    )

                [vendor/php-ai/php-ml/README.md] => Array
                    (
                        [expected] => 
                        [current] => 9a56c2e9081e683bcbd2ffa22ce02a55de95d5e8c780d18a8f31ebddaedbe4efd0420f2e3cffcdc791d754d80a1bd5d9fd5e3f763474759d4494730c88ac64bc
                    )

                [vendor/php-ai/php-ml/composer.json] => Array
                    (
                        [expected] => 
                        [current] => 1387ee2f550b3a7e238c89a5bbac330522738722a63e4b838d8ee72f6e086cf3840b99adbea4a1aa3aa3620904395f4b246ddb14be122b5370e64ec98daeab31
                    )

                [vendor/php-ai/php-ml/LICENSE] => Array
                    (
                        [expected] => 
                        [current] => 2a4dfe699c27ef888c242f153c2f397e99d1b3e9234cfd3de1bab5b009b4cb3b14e77624f7d0c6659ae7bd1eb1f9374f062ee478293d2a5f52fca7079cedcad2
                    )

                [vendor/php-ai/php-ml/src/Association/Associator.php] => Array
                    (
                        [expected] => 
                        [current] => 144d6c5c41b8d38de13c49ea5b6a075828b8d82a2e1f1062abe6c713503055bb5d0e71f9b44e735bb7f43e7d10b3cec05f18671ced4ce46b7977f87fd1207745
                    )

                [vendor/php-ai/php-ml/src/Association/Apriori.php] => Array
                    (
                        [expected] => 
                        [current] => d1b5fe61122d3d21062b9da0a3cff4682e507ec86f1788419b47db185e44dfffd2af6826444f60c5ee1cc4a019041966002c148d0996e7c7a176975f1579d952
                    )

                [vendor/php-ai/php-ml/src/Dataset/MnistDataset.php] => Array
                    (
                        [expected] => 
                        [current] => dc2eafdd8337ff82458ba46d8c941b33e866300b31caf3b24ce2cb0b3e13092b29fbedbe17a918d3ac9189e2486f5ca9848ecf68d81f6d48e2f75ce03525d511
                    )

                [vendor/php-ai/php-ml/src/Dataset/ArrayDataset.php] => Array
                    (
                        [expected] => 
                        [current] => 340e84896c4113a869ff6155af3104df8fcfea4c27cd93e77278dc8e9a0c539b59398c45dc9a4cff0aa7ed895e46915994d675b07e6654f6c3c1e42a8a6138aa
                    )

                [vendor/php-ai/php-ml/src/Dataset/FilesDataset.php] => Array
                    (
                        [expected] => 
                        [current] => 718d8b4d94552b99e0a92cac7f1b667c86281af17e610bfdf98722f9e7d9395394a0158d7b88ef45098664072b6896a37dc96a226d2eaab278a40b6553b89769
                    )

                [vendor/php-ai/php-ml/src/Dataset/CsvDataset.php] => Array
                    (
                        [expected] => 
                        [current] => dfb11d09a78cca135c923fdce0f9fcabe62af54a98d38bfcce21032f51fdb36a56c1b84562c9357059dfc46964b1323afd5ff1ed61d1690ca647a678ddd437a8
                    )

                [vendor/php-ai/php-ml/src/Dataset/SvmDataset.php] => Array
                    (
                        [expected] => 
                        [current] => 9ca09865833a6af36703abbdbe9781a23fc41c138ea40e53ea7c98dd110a8d0b3e4a78ae582b381044b8b175506e500ff22413e7fe61c06d24b9fb5b6e3b6ad0
                    )

                [vendor/php-ai/php-ml/src/Dataset/Demo/GlassDataset.php] => Array
                    (
                        [expected] => 
                        [current] => 1c973654a19290a57fa6a5e0b0fe4c030c5b823b4e8762524d7f87335b5d7a46232486cbf5ebc5b9f226fab84f97ac43fd81ff570375382c9f56ea6c143a2d47
                    )

                [vendor/php-ai/php-ml/src/Dataset/Demo/IrisDataset.php] => Array
                    (
                        [expected] => 
                        [current] => 07c1e25af9039a505cb7ede3373fc48aa17bb2e9e14b009cc654664cdea8695e88b90a67a8ae674a1f713773a941b417bb92bea827b572b9d5ba32458ee4e861
                    )

                [vendor/php-ai/php-ml/src/Dataset/Demo/WineDataset.php] => Array
                    (
                        [expected] => 
                        [current] => 50083ff05cbfaca2f59f91c7a7f134f9e99033accb488ddf09c2f126354d9690417b51ed48c8dd3a530010b224334246e9610109ea9d071541813fe0346345b5
                    )

                [vendor/php-ai/php-ml/src/Dataset/Dataset.php] => Array
                    (
                        [expected] => 
                        [current] => eb61778de58ce85c47bd06cfe68a2b19752b90fe75b24ce96b8c23e0553f3933e7b7e109043f5befa8d3c21f374f8c80398a97dd44b7ccb4f271fc9427832edb
                    )

                [vendor/php-ai/php-ml/src/Metric/ConfusionMatrix.php] => Array
                    (
                        [expected] => 
                        [current] => 0960436b5cc5722be7aab7fbba51a9da0b5b64173f5d9bd20350751ae47e2037ce98b41035b59149ecfb25ca06baa84c7a8104197cf555ae60bb3edf63334ea9
                    )

                [vendor/php-ai/php-ml/src/Metric/ClassificationReport.php] => Array
                    (
                        [expected] => 
                        [current] => ce94fdbd33b5487ca3141da9571d623d74d752a6531da1a0c246bcb4eef7cac9ade34b90cbdc56f6642c56fb4ff73130b8afa02032bb2ee8ed32b2e99de46635
                    )

                [vendor/php-ai/php-ml/src/Metric/Accuracy.php] => Array
                    (
                        [expected] => 
                        [current] => 632d7a9acaaa0a996f5f90c64c9a69d340b3570426abec7758bf02d78500c108c168320338013d7e2a6d933becaebf7bd9fc635b58eb4266f2ce469bd3661820
                    )

                [vendor/php-ai/php-ml/src/FeatureSelection/ScoringFunction.php] => Array
                    (
                        [expected] => 
                        [current] => a9b88b9a66dd917bffe0a9adaff7d6bff8823216122141fd33be11d013bb5b6bf07029131cdfe9d757053938e7aa954c74162bd7e887cace2fd1d86998b0db06
                    )

                [vendor/php-ai/php-ml/src/FeatureSelection/ScoringFunction/ANOVAFValue.php] => Array
                    (
                        [expected] => 
                        [current] => 08cc7b997356aec90891d6b913c89456f9ded04f8dc3b78dc552a4f1e63cafa0a2b885bcde52565a2879dd31f348ae8f4693bd4db3236c485c5b1e4fc0d301d0
                    )

                [vendor/php-ai/php-ml/src/FeatureSelection/ScoringFunction/UnivariateLinearRegression.php] => Array
                    (
                        [expected] => 
                        [current] => 7be88ee9209ad983ca21d7c916a32e4188e9acb2287f7d91b68b2301983ffd56f39d70c968e26c01137c105ae0477ee86ed65694cfcf3adb34cef9b8a12d3793
                    )

                [vendor/php-ai/php-ml/src/FeatureSelection/SelectKBest.php] => Array
                    (
                        [expected] => 
                        [current] => 57de540b21832670dfa3158528fe864a601627b7a6088bdeb87d768b0b2bcd1e1ee0d9d92a8f4e395625f3fe44823c5f275498614deb7463371d4f4ed50ee44b
                    )

                [vendor/php-ai/php-ml/src/FeatureSelection/VarianceThreshold.php] => Array
                    (
                        [expected] => 
                        [current] => 9d9564a954faf43e8e0f473589fad7019e546b3e42e7aadd1369c4b602e081fb6804fcb30e38d1d54416d03f6c97364d0e68f596c73cc8b25a5059423bbc1fea
                    )

                [vendor/php-ai/php-ml/src/Math/LinearAlgebra/LUDecomposition.php] => Array
                    (
                        [expected] => 
                        [current] => 6845035dfbf5c073ab023f58b37260d9c9192c67517890bf9190c0f2e61bfb02bf5d7e43677c750f053fc78a7a45fd78fa56de3eebc2ba4492235bea4a842033
                    )

                [vendor/php-ai/php-ml/src/Math/LinearAlgebra/EigenvalueDecomposition.php] => Array
                    (
                        [expected] => 
                        [current] => f358934f6c1028e0c9a26b1b0b7f6e2334908a33c81dad4e5c99212ac436cb80ca5425df32d7a02a832b78a19f43ebb3415c8b00bbaa73d52d183124716b19c3
                    )

                [vendor/php-ai/php-ml/src/Math/Distance.php] => Array
                    (
                        [expected] => 
                        [current] => 716fa0ff7c72188ffec71163cc470e51b3c16b79d49337809948ace867c8af4ad8750d4020b6da8af0f2ce1836a3c9e127538270b9282305b7703f798595528c
                    )

                [vendor/php-ai/php-ml/src/Math/Matrix.php] => Array
                    (
                        [expected] => 
                        [current] => 5e3d385acdd7374e6bf5d43afb2f3b3eeb96cf06aca4995404f310891a1bcc68c87e6c41d6cc7e9af4e3b226482cfd860341969da773866daeb1bb4e6fccc821
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/ANOVA.php] => Array
                    (
                        [expected] => 
                        [current] => 6cadc6ed3dcebadfc0c0999da7e8bb28213b762985affe9cb5216052859a1ed36f60ae938ca54eb7875e79d32734feae4f0e0a43d5cd8a00c62e4371db6af38c
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/Gaussian.php] => Array
                    (
                        [expected] => 
                        [current] => daceaaf90f9ce19aa4aff560e421f6efea2485a01b816d812fe60b5061c011cf0f58a02a8c1fa6aaa25dbdbc5a0055e745504b38d3eac39454f6d20021bef4ab
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/Covariance.php] => Array
                    (
                        [expected] => 
                        [current] => 7c0df8c652d0a8c778245b2099e96350cc536599aa2d9ec6b5e56a12eaddf7caa11affb7f90b89d9dc9703e24bc8400b05b061c8ce523cf9b38dc56f76cc0fef
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/Mean.php] => Array
                    (
                        [expected] => 
                        [current] => 6a86d90903f9dccabce81c46acdede309f10e5a116cf78ca16234493c0e65d668cae453e491a29f6684941ee1defafe4256c081d0b9ec21853700baffda546fe
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/StandardDeviation.php] => Array
                    (
                        [expected] => 
                        [current] => ac7d0d063cacf953b4e15aae18a06a17946b0f2fa1acdaafde52e31e6020c084b82ce157293f09912c312c7563bb41ac6a6fc22284ccabe7a9c571016fe15860
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/Correlation.php] => Array
                    (
                        [expected] => 
                        [current] => 8af2529cd86d5bb1055b29e82cc96deb4d52b013ada48b43095f9829a4cf3ba27c14381a955c4bd736e333d009f9bdfa544897d148868d7ced5f4ca2d5d36c00
                    )

                [vendor/php-ai/php-ml/src/Math/Statistic/Variance.php] => Array
                    (
                        [expected] => 
                        [current] => 347d8b71de404c4ad83b467a2814bbeee9b18858638d79f5202f445763c73c9be08b6c7a91ea99270143fb992b4ace4ccbfa121118583378c6582039e1f4cb0b
                    )

                [vendor/php-ai/php-ml/src/Math/Product.php] => Array
                    (
                        [expected] => 
                        [current] => 5a8ec11c3f6ff94b0ac2ae635aa26cc270dd42bc891b1eb2ac973afd8ea6471392e14c3ae349a9fb76a9fd62e7fb2eeb6093f70e57f27e2a6c3c14c7eee14d40
                    )

                [vendor/php-ai/php-ml/src/Math/Kernel.php] => Array
                    (
                        [expected] => 
                        [current] => b0d23fecab0ff965416fff9041310d74e4f0adfc927fbd5decdb198598415603b42b194233af5d75b87092171a40afd9865bad54876313d2574f71d4c240cb9b
                    )

                [vendor/php-ai/php-ml/src/Math/Kernel/RBF.php] => Array
                    (
                        [expected] => 
                        [current] => c7a9b2969812796e758b588c2eda3d9c8b4a190bf60249e2ce3ee95e46559a39d16a96bc14601d4e3e0b85b58bdc847bfb9d8d45f48e0d7d4e4d89983ab0a80f
                    )

                [vendor/php-ai/php-ml/src/Math/Set.php] => Array
                    (
                        [expected] => 
                        [current] => 67cd65a00c141a2f034d2933f4fd7bc8a65af541252d008d8c7ef907fdd68561e2196261aac76db6c909b1dea881ad8c1c40d23d3109dfa0be12213f79768418
                    )

                [vendor/php-ai/php-ml/src/Math/Distance/Manhattan.php] => Array
                    (
                        [expected] => 
                        [current] => ab712ec12ad2561758a89e695b8d8d768cf1b840bc2fd77b1ad275b61c7d77078712fcc20b9e29a87b50538988d37b4ee43a8d93ea34a91af461b6353c598a02
                    )

                [vendor/php-ai/php-ml/src/Math/Distance/Euclidean.php] => Array
                    (
                        [expected] => 
                        [current] => 6c4d92b2cbd734a33e1f335af6852a10ec78a4592227c6585ff1c51a43e8e57517bfd5b4601378c7469d36f1c7902b1bf28946adeed0ae1ee4f69ea146c39b0e
                    )

                [vendor/php-ai/php-ml/src/Math/Distance/Distance.php] => Array
                    (
                        [expected] => 
                        [current] => 79bc155a971fd345d750e8dcf0b48b6b9289113855326356b6fe4e95c92ebbb119809dfcd17d2f73106e899a898fbc4c3b351c589d99d9a657df128a74eb1e50
                    )

                [vendor/php-ai/php-ml/src/Math/Distance/Minkowski.php] => Array
                    (
                        [expected] => 
                        [current] => c15a19e1baf0ba26b904604a2b7b1dd6900595bd40c9faa6772c406ae18769387d84328251c78ff434c6247d3dedd840beae34d3cdafacd1cb705c74dcf3b6d7
                    )

                [vendor/php-ai/php-ml/src/Math/Distance/Chebyshev.php] => Array
                    (
                        [expected] => 
                        [current] => b41f379c0fd016865b959077871fd99aead39609dd05ff52fcc141479479e25fc9b5cde8a2517a8686a1764ef66c52b8184753215d3a18d34366afcce222ee7e
                    )

                [vendor/php-ai/php-ml/src/Math/Comparison.php] => Array
                    (
                        [expected] => 
                        [current] => 53ef921c610d2db987241788c3906be63561398990d370c2204499e3f948b291ed8039674237c73a836c2ecdad8a2c13e4d7a4629fae949d091668e433b7befa
                    )

                [vendor/php-ai/php-ml/src/Exception/NormalizerException.php] => Array
                    (
                        [expected] => 
                        [current] => b8a7e119ffd9c629290e0437c75ff85ff3cc2368c30d50d76bed652632eeb5900cb80563ab38d162dc7171f35d9f13f08391532e4f44463e677a4a29632cef10
                    )

                [vendor/php-ai/php-ml/src/Exception/LibsvmCommandException.php] => Array
                    (
                        [expected] => 
                        [current] => 4924b7e8e38b87bc12e72eb9b4d07532221507c478f193805cc230d45c65ba4d5af7d6e31d9ddf93a9a605bbba89fa28f8f6e04f85009e514f74d661f700c4ed
                    )

                [vendor/php-ai/php-ml/src/Exception/SerializeException.php] => Array
                    (
                        [expected] => 
                        [current] => 1ae57fa21e4ef770a398a97699157e7cfca39945148181a05ac29dea94b0c0a94b8cf04f170cc4019ff291c679dd7cb2ddd6cf28541633fc7f3c4ddfea99a995
                    )

                [vendor/php-ai/php-ml/src/Exception/InvalidArgumentException.php] => Array
                    (
                        [expected] => 
                        [current] => 48088997d59dbb2e388a85cf13427cdc8f5ea897f94893c76b883b7f9ca1692060cd41e709b8a56e955f2d7835ea69805f963357f71ab36dd48b032f37908af9
                    )

                [vendor/php-ai/php-ml/src/Exception/InvalidOperationException.php] => Array
                    (
                        [expected] => 
                        [current] => 6fae1f3d80c04bf4d3329ca71d1a75eb526e9cfe44ce5ddc0e46b96350f5af4638d6c18acea0583abc6491a219028446f340e634c67e4f583820653bd90365a1
                    )

                [vendor/php-ai/php-ml/src/Exception/MatrixException.php] => Array
                    (
                        [expected] => 
                        [current] => 65645c2325602578ceaa5592d604df776f613937694c56e1d7de808c1bb28e966523e28d8bdfedbf84f3fbbea328071b11ecc761b05c0bdc5c69a9596d733a64
                    )

                [vendor/php-ai/php-ml/src/Exception/DatasetException.php] => Array
                    (
                        [expected] => 
                        [current] => 153c2b75a064be6a6b2f424fabced173e846b8318eb6ed55a6429eca99459eda5dff1160cf91b7cc524a8756f936c4c924ae467525047adf3643f08378a40b01
                    )

                [vendor/php-ai/php-ml/src/Exception/FileException.php] => Array
                    (
                        [expected] => 
                        [current] => 2c04a6898ab25dc702848b695917e7d02ed81fc6e80fbb042d21942e69ad1e4f2e65e3ab78476a097c4483b9a79f9e23898d4487896cdeafd2a2654cc8e308ed
                    )

                [vendor/php-ai/php-ml/src/Estimator.php] => Array
                    (
                        [expected] => 
                        [current] => 2a4aed934fc3bb754e905f9b6aa37a75197fcaa743dfd11b14bf0a142ec4d9bb8eaba1fe01ee76e5a0994faf03d00a7111fff446a074b13b21ce6e6c78c9c7fa
                    )

                [vendor/php-ai/php-ml/src/Pipeline.php] => Array
                    (
                        [expected] => 
                        [current] => e7482b2324f126b0b662ee021ae70c52616ebe83cedab88cff676c63d1ef3eee0cef24ce82ce1e3000f24bdcf19acb645b3c9e8e6c9de2d7e5ff172059565404
                    )

                [vendor/php-ai/php-ml/src/ModelManager.php] => Array
                    (
                        [expected] => 
                        [current] => 05a86e54cb264e7aacb2a6c47ed6e17ad9c79070d81d5f98e8a1b5cd39621d9a502615d730ef98753629fca9d91f24014d7929251d9cf089e28a1321945c228c
                    )

                [vendor/php-ai/php-ml/src/Clustering/FuzzyCMeans.php] => Array
                    (
                        [expected] => 
                        [current] => 901b153560112d35051cdcdc5810f3df844eda0ad026c3abd03e2e1b212bf045efe3b613f14b6f9f5f5d71974bc7b64d86da63ea34ae0f119c7bb9f3040918db
                    )

                [vendor/php-ai/php-ml/src/Clustering/KMeans/Cluster.php] => Array
                    (
                        [expected] => 
                        [current] => d1a08a72fe06b9527cd51ebf20bbc12f37b088308943aed682493a6a89660c00b51b2d982e7d45680afdd754ce515fd036c66053742aaf4ed90d317d6a356362
                    )

                [vendor/php-ai/php-ml/src/Clustering/KMeans/Point.php] => Array
                    (
                        [expected] => 
                        [current] => 4eab20ca06b0f6ce4d15ef83fc3d64f162166d148590dbe071789b69ef42b1e64c7145b0b68afd0f649168319e73106e8573860bc703c18b41c9b4572c5ff1a0
                    )

                [vendor/php-ai/php-ml/src/Clustering/KMeans/Space.php] => Array
                    (
                        [expected] => 
                        [current] => 1fcb1643e8f5fb8f5e0ce39b9a8e00de298c3f0e96940e677249a0b5a78e76af2f2b728552a38a7ddf83229be2090d47fdfd6ceb709e74da691f7965292cc3e9
                    )

                [vendor/php-ai/php-ml/src/Clustering/Clusterer.php] => Array
                    (
                        [expected] => 
                        [current] => 9e819398353e7863157c5ed077f2aba1671b51bac6867b3a0d4b34d929267d8eb013cb9fbfa7d6f2f1dd7305981c711b9c8d5124622aa3ac0409405b234c8f90
                    )

                [vendor/php-ai/php-ml/src/Clustering/DBSCAN.php] => Array
                    (
                        [expected] => 
                        [current] => d327782ac03a8a71ab2ef6905848fb170a67e5d52efc564ec781a9b1ad666253238b49cbadb1bc4dc17089b834755df25c4b42201225f9431d7cc9ea0a27a799
                    )

                [vendor/php-ai/php-ml/src/Clustering/KMeans.php] => Array
                    (
                        [expected] => 
                        [current] => 0fd29f65accc63f31700a8d2d6e60e01a67280b65721890ca581db4ea82e05939792f9ca8a81dcf2fa806bc876fa8e42cbd5ec80f95255aeab98e91f60366fa1
                    )

                [vendor/php-ai/php-ml/src/Classification/Classifier.php] => Array
                    (
                        [expected] => 
                        [current] => ed7aaddd39232c3612d3a7c0a377411a5a1763de288de380c031f2f94b0baa62d844de0facef1db1b77da03ec1a1d9a98cec6014f4d6a991d5c17b4dd99765f9
                    )

                [vendor/php-ai/php-ml/src/Classification/DecisionTree.php] => Array
                    (
                        [expected] => 
                        [current] => 61556f5c970963d43518599fe96ddcdfca394de322f52e70c926b37a97a3786ae963e85f4154d803945797180da8677d220eb698a88e262e6bfac9a2bd3df718
                    )

                [vendor/php-ai/php-ml/src/Classification/WeightedClassifier.php] => Array
                    (
                        [expected] => 
                        [current] => 91293c53c06bd8b30b8911a5853f72ba37713df98767f0dc9daf3d2effc6354cb5f921c566d817e73e994f2322a854ccf3e0fc3d2277939f4d777a08a7663985
                    )

                [vendor/php-ai/php-ml/src/Classification/MLPClassifier.php] => Array
                    (
                        [expected] => 
                        [current] => 651193e34521256aedde090e423b0f4d2b0356c249fa2b75f8d75175570496b311e3ad1f97e751d873445f067d9b1167d92fd270a7eeda605e9fa0c7d3793b63
                    )

                [vendor/php-ai/php-ml/src/Classification/SVC.php] => Array
                    (
                        [expected] => 
                        [current] => b3f6ba58aae16478e3a826057a7765ae9f9780979f5905ef103167cd3ebc3d55a16a761818d4776faac58658e7ec9e8f0e929c2f6784d03b529c719fb94065c1
                    )

                [vendor/php-ai/php-ml/src/Classification/Ensemble/RandomForest.php] => Array
                    (
                        [expected] => 
                        [current] => 1ca41091822741763743b8326306bb4b79d2a2f4e3b0a84f31e84ce25c1fce674a9742c3cd0e52fbde9d067b31eeb65005ded02037e2dd166c3e5e3a513e6f15
                    )

                [vendor/php-ai/php-ml/src/Classification/Ensemble/AdaBoost.php] => Array
                    (
                        [expected] => 
                        [current] => 43444178c4bfd12aaa82a56a8812e4871f818d9e92276843ee97e4450d154e282171c665505d867135189bcdc9a732a1e9c3e26279c56da29713de112de73e84
                    )

                [vendor/php-ai/php-ml/src/Classification/Ensemble/Bagging.php] => Array
                    (
                        [expected] => 
                        [current] => 836cc4559b2f63f5e27801157eb0428bc786a6d76d172f016484633f2b8e3d9b84638444aa859838d7635652a29f518f2c8256b47f182728ddd87f57c857102a
                    )

                [vendor/php-ai/php-ml/src/Classification/DecisionTree/DecisionTreeLeaf.php] => Array
                    (
                        [expected] => 
                        [current] => 0df7511a9c3a6d92014b152fa5620b240b87c2fe94cf124205b79f4d40520f50e16473033a1c28075661737ae3a2e2544295b20a6a2e118f093c04d75734af01
                    )

                [vendor/php-ai/php-ml/src/Classification/KNearestNeighbors.php] => Array
                    (
                        [expected] => 
                        [current] => 3e2c7cf50f38f3d11145582ece9efdd99344e7127c473c589cafb20734e234f3c272aef329fd29aa65666bae7b46a8c01778a7e361a6f57e10a86fe99523a823
                    )

                [vendor/php-ai/php-ml/src/Classification/Linear/Adaline.php] => Array
                    (
                        [expected] => 
                        [current] => 2ad927050bfe3a77954ea6150705c41b109d1aad88222c5ad63b4d7c2fb409f694e190d3a973553d43375346779641a73237baa570affeb4ec22581d4f1ea192
                    )

                [vendor/php-ai/php-ml/src/Classification/Linear/Perceptron.php] => Array
                    (
                        [expected] => 
                        [current] => c8e1b3b7edb0e100ccabc1baae611a58b4ce934baaf503e9193b941cb124b8ea2fde7f2538502de8d5bca79a4931082f837e9edd0fb192af6f5b8eb9ff09f3fe
                    )

                [vendor/php-ai/php-ml/src/Classification/Linear/DecisionStump.php] => Array
                    (
                        [expected] => 
                        [current] => b67a828f60ea380d62bdc5ac3c9c2082c7f9f2c91ca7396e3bd4a91d950072b30aaa4cdfe8884f67f8731f91c802cfb84a1c69e52bcf3aeb2b593cdcce7138c2
                    )

                [vendor/php-ai/php-ml/src/Classification/Linear/LogisticRegression.php] => Array
                    (
                        [expected] => 
                        [current] => db17db7291542568cdd1c6e42b52a94b83f6561d9202c266e6f9d9fa3c34cddd8afcb0fe575506fa05e8e925b824d9544bc2387a11a7027b0357b8338f6007d4
                    )

                [vendor/php-ai/php-ml/src/Classification/NaiveBayes.php] => Array
                    (
                        [expected] => 
                        [current] => 396e98344d78077d00c64b576580506c4d59d9712321b2ac11f44e4322f4480349276e565ee7791b13bb50e19ad0510b38613dd774f889f9a270c697c2b04bf3
                    )

                [vendor/php-ai/php-ml/src/IncrementalEstimator.php] => Array
                    (
                        [expected] => 
                        [current] => d4f276fe63092c0818dee01547f7cdf84120de69fc5ecc790f1d3408c1ef1885570c50a6a025608a4f30c376f7e5d52fc86137c9ee76e2b216f805b9583a6d32
                    )

                [vendor/php-ai/php-ml/src/Tokenization/Tokenizer.php] => Array
                    (
                        [expected] => 
                        [current] => 94c41d65445003851176f6b1927055bff560b016af9e07416bdc3447bb2919f2abdc61f951b8c735449e99f68a560d96721c85a44a55567646f71d08c1b9491a
                    )

                [vendor/php-ai/php-ml/src/Tokenization/WordTokenizer.php] => Array
                    (
                        [expected] => 
                        [current] => f722b3063c88b7d5d50058e3cfd76da4865455fdb2031a38ac84aa8d3e42a4e7771e6575271ceccefd44c34e9b9d3264f81dc9d2733d49e8c15edf0986c4db17
                    )

                [vendor/php-ai/php-ml/src/Tokenization/WhitespaceTokenizer.php] => Array
                    (
                        [expected] => 
                        [current] => 80c55055c5943615bbed9aba62202be522bfb02c01427a01f7168c3549f3cdd52473325a5068715a1db7d687c252461a27ae6032ca20bfe80e375e93a5284347
                    )

                [vendor/php-ai/php-ml/src/Tokenization/NGramTokenizer.php] => Array
                    (
                        [expected] => 
                        [current] => 63cf4ba78d7b263dbfef0f389d5e5160ddcfd7857194af4d5df315943b400161c4e9cc9081d69f9ed83cb7f7f664a123cdb9fb4852029d8ce4b0e56a85a518df
                    )

                [vendor/php-ai/php-ml/src/Transformer.php] => Array
                    (
                        [expected] => 
                        [current] => 36f8026d9814e3beaf17ed0cb5a5f49d9ffd592f0aa41d469adc5f9c4d95836468e54ea28cd885f2d5ee5dcd940465dae5de47c6dfe759bee0bafbd87360fe79
                    )

                [vendor/php-ai/php-ml/src/DimensionReduction/LDA.php] => Array
                    (
                        [expected] => 
                        [current] => c9b826c16e92a49eaf0856c4c410de360a90c69764cee1b24572bdbddbb8bbc55f45624e0881945311e793edfe02039dd043a6b1f843ed2e5a3f3d048c290632
                    )

                [vendor/php-ai/php-ml/src/DimensionReduction/KernelPCA.php] => Array
                    (
                        [expected] => 
                        [current] => 9983bd3fb2b22fcc7f18b67b48ae24903c5f9df9ce4554d31db53780c5e1f932d46f9d0810b8a4a44c356cd8df98aee6a1e9b29ae3580b2182b37122c7365346
                    )

                [vendor/php-ai/php-ml/src/DimensionReduction/PCA.php] => Array
                    (
                        [expected] => 
                        [current] => 4b3ceb0fba010f7098f98ca8a8a1b3669681bf100f0905e85d51427eca9018b66347803b5a058620cad615cda3d13b2df0247b60ea221f86d2f9e5403d40fd3a
                    )

                [vendor/php-ai/php-ml/src/DimensionReduction/EigenTransformerBase.php] => Array
                    (
                        [expected] => 
                        [current] => 680547b7225f9e8eb7bbd3510928656a997e28d5dc7f56c1d1aac2fe0b9fab6cc6efa9cd126ee0672a5bf619315df06af9f7e8e5fc86a61d0b083d1801cf51f2
                    )

                [vendor/php-ai/php-ml/src/SupportVectorMachine/SupportVectorMachine.php] => Array
                    (
                        [expected] => 
                        [current] => 487916f4e372e3e9b006abbcacf1145ee633c7fb5b3d4b01b9c371a604e5e5846ca7e52623badc4a16296da1e971821317152afac607ecd84e89b4e1e58fde51
                    )

                [vendor/php-ai/php-ml/src/SupportVectorMachine/Kernel.php] => Array
                    (
                        [expected] => 
                        [current] => 67623ab490a422d6aa4c10d5659980525224108d429fd866de289641b007813c0772f1d685a98e752f05ee496600060e4e7cf772d148aaa77236c1e63a0f3c77
                    )

                [vendor/php-ai/php-ml/src/SupportVectorMachine/Type.php] => Array
                    (
                        [expected] => 
                        [current] => c9ea6b8f5c4117144b04c26c3a435b8c8630ce6f4f9aa210ea1b8116f9a58cae735aaee33119ef4ce98b60c078293dcf40ad901d5bcaeaef5d79f6d69657c817
                    )

                [vendor/php-ai/php-ml/src/SupportVectorMachine/DataTransformer.php] => Array
                    (
                        [expected] => 
                        [current] => 2056014fb717b34277b1c2f1e8785dac0307e7a9a93b001fd2eccd34965c05d9aae6cbe62ec8e9af050ac25c740ec8cab605ef141f93c98bab5436e3b763de9a
                    )

                [vendor/php-ai/php-ml/src/Helper/Optimizer/Optimizer.php] => Array
                    (
                        [expected] => 
                        [current] => 37b63f4f6e141f3852202fd15469b7c187a527fc7e3bb850b72723270e4a87d30288cacf7a7e6d4042a1f91dca2970592a4fb041232e9b59b542d544d28cac75
                    )

                [vendor/php-ai/php-ml/src/Helper/Optimizer/GD.php] => Array
                    (
                        [expected] => 
                        [current] => 0d19bff50531be26a64a5e39e518a73a76cccfb7583e63d609b0ad05ac59caf8b11dfc5bd0f7911678f0a215c88d1512b7e9e430cea10390a8f9c1d0e4cd9cee
                    )

                [vendor/php-ai/php-ml/src/Helper/Optimizer/ConjugateGradient.php] => Array
                    (
                        [expected] => 
                        [current] => d9a455fed56a722ab54a1cace39085e72623c20307c5375d9a3bef0940ffdef98820f8c27a099247ef2666abf8c7a0ab1146291d384b6bde8971b3142c7c8f05
                    )

                [vendor/php-ai/php-ml/src/Helper/Optimizer/StochasticGD.php] => Array
                    (
                        [expected] => 
                        [current] => 27b8ca21067d92eec458c1ba2753e9384570562903eba7fea80abf64d72ec22c508d81ca508b7dd5aecc7c808e08be79964711a2289054f93191c035f51a9ff8
                    )

                [vendor/php-ai/php-ml/src/Helper/Trainable.php] => Array
                    (
                        [expected] => 
                        [current] => e84c1fae18302f27c0d0030b4006532bcce8f2373fc76579ea8f5f27f2324c29abd22526b05b36013e9f59fc48870874e5a31e0baa91594c4fa3bf21864d7ac8
                    )

                [vendor/php-ai/php-ml/src/Helper/OneVsRest.php] => Array
                    (
                        [expected] => 
                        [current] => 42ea90645a753ba4d636fbb5667f39b83da61394c1fe1e3c1ec31b1a4ae2f6dcc6c1d599b6ee1a7397edbb071b84a5760653e7e165920f8225553d9a27f0a1c4
                    )

                [vendor/php-ai/php-ml/src/Helper/Predictable.php] => Array
                    (
                        [expected] => 
                        [current] => ade90bef3a9f702544e217898924b2e21ade92e18ef6b28bceb2fd8da88de7d498a9928343a9ab2cf582b26bf64fca76961e0ed78eccec75547a1fde50019ed1
                    )

                [vendor/php-ai/php-ml/src/FeatureExtraction/StopWords/French.php] => Array
                    (
                        [expected] => 
                        [current] => 51d3f246232a42371251acbffd91ada3ca1d27cea4e8b4c2feebba63ab45c3616d71f62cbad7f9f4824136fdb078a966ece16f37bfb014a6d7727825109fabdc
                    )

                [vendor/php-ai/php-ml/src/FeatureExtraction/StopWords/Polish.php] => Array
                    (
                        [expected] => 
                        [current] => 3602eaea449df0644bb419510464aa007de66bbb465cc4a1da72030513d73b279f271da2c839c40a9a6ed8fc5e9bacc0ff51c865fa7e6b34bfa01be0c4ef047e
                    )

                [vendor/php-ai/php-ml/src/FeatureExtraction/StopWords/English.php] => Array
                    (
                        [expected] => 
                        [current] => 4bbfbbbd80e8e62cab3c32c245ca1d9cf694d8a8e155b3128306ef26c43149e551f3a245df37015368e2d7a96452d66144a99c9f5d5b4504ec6d089e0f98b0f3
                    )

                [vendor/php-ai/php-ml/src/FeatureExtraction/TfIdfTransformer.php] => Array
                    (
                        [expected] => 
                        [current] => 4ee510d7b65504c375ef0372932ef79f0a3ab622295d9d111161e08d9f1d9fe6ed70a5e9ff9049b5f3c7e4a207e417467f67936bacc104adbea70a99a156e9ed
                    )

                [vendor/php-ai/php-ml/src/FeatureExtraction/StopWords.php] => Array
                    (
                        [expected] => 
                        [current] => f14ec4b32600189eb465dc8990c3de11df8c40a5bca8fa186fc7daf71357365595ab61318d0f3fdb4b54eb4b0dfe4244eb4e91948fb6ecb68667cfe5a9730abf
                    )

                [vendor/php-ai/php-ml/src/FeatureExtraction/TokenCountVectorizer.php] => Array
                    (
                        [expected] => 
                        [current] => c76bf43a1090d8bfd71b84ea9f08703322608339e4a4e35f4365b821933b422630e3fd3a9288a7d421fcb4bc520263e647c36b75e6e4e6eeef59031374653ed0
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Layer.php] => Array
                    (
                        [expected] => 
                        [current] => d2e8630e1f57b762ac552461bd5ce19a85dd2c65916ffc4284aa657fc14bbaf5e062561567cb560a2d6bcf6f9950ad2d365b92a0f52281ae18c550a9561dd23f
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction/HyperbolicTangent.php] => Array
                    (
                        [expected] => 
                        [current] => 92afb6cc522d3a8b2b6bf7e6eaa26138decd37147553eee904a786b695de81e6624deedea4cb2a677a4d07e6759b7c9ef22cd10be33b86eda9c61f445767be42
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction/ThresholdedReLU.php] => Array
                    (
                        [expected] => 
                        [current] => fbde1b2c3814cde0fdd26c8461fd794ec39a3ea179f7740e372695d8d1ad656a295ade5ebe39b998cb79abadd238913bb5ba1ef618a97a51ea6e313e4f40d760
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction/BinaryStep.php] => Array
                    (
                        [expected] => 
                        [current] => c14a5d6dc31483aa1e2f27375c64dbcdbc327e8bf3f9936892018d05a1c02943c41f68f34d3aec2d59e7e9bed1792121920b232dee425b296b3d9f7ac5bf54a1
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction/Gaussian.php] => Array
                    (
                        [expected] => 
                        [current] => a88f6535706902709bfb5636fe448907ee8ef889f1c0a638fbe0eabab4357ae2a00c48a8aa208588b58a569aa739ef8605aaf4bac2d91cb79e2050a2e566c5ad
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction/PReLU.php] => Array
                    (
                        [expected] => 
                        [current] => f9d5b3cd8c90a2b9bd93843386b3a493e1427dfa60a29a15b8a63b5bb4de00c8175f5e1ddbd5a1cf807b9c05caa96e6377eacd3b3b85a9568e7304ae3ef28880
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction/Sigmoid.php] => Array
                    (
                        [expected] => 
                        [current] => 1bcbff0347611c1c249426a1a9be4af52837f106dba5f25b20fa5d89dd34c36945026a65ac87f472ee8def9589a501dd630af0773547086422f8d19215f6364e
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Node.php] => Array
                    (
                        [expected] => 
                        [current] => b0843894c5ef3e946800ac32f6765a04061152a979f9f9f0bac8d19043fd80b17b5e51f50d0317be068925e13aa3a63b3c6de163962385975adbd72e60cdeb36
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Training/Backpropagation.php] => Array
                    (
                        [expected] => 
                        [current] => 8de4cb2e831334ee730611f7a9dd01ab300157820653a137ef84645deab42ea66d57f478a4806389a075b5739391c655aa3a6c4c1cc0a12bffa18f0284526eed
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Training/Backpropagation/Sigma.php] => Array
                    (
                        [expected] => 
                        [current] => c3a60bd3b06ca55c1c56c9df80bafa50edcfba1d49a579961f6403dc3b6790d80e5eae71e7cf74fe0c3890b913a424f36843fac25d7f02da00827bd2cc4e7b20
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Network/MultilayerPerceptron.php] => Array
                    (
                        [expected] => 
                        [current] => 323cca0444aac63348a2a14e887c0fa9a8a14c064f31d43bfd5c158999559d964c021d67223523613d660d921965f9c3b82a517d482735586c93cc6b87c43f86
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Network/LayeredNetwork.php] => Array
                    (
                        [expected] => 
                        [current] => 6c7c9f91acd9abf229e34bbdfc13d0629054448683fabc34f657a004f6903e60d1945f0fee4e32e3f9ca40be5eca04c875a4c285152845821945fb7aa8fa9443
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/ActivationFunction.php] => Array
                    (
                        [expected] => 
                        [current] => c1f2c4b1a7ae94d982537a1f9ec476ab15bd620259a95335803ba1ad24a27e0b2c31895c20b7f334c7747cb3ff390994abd60d639c566fdab57995a9941eb3bf
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Node/Neuron.php] => Array
                    (
                        [expected] => 
                        [current] => 0e1f71ba8fdd57f8d9ee8f38220de3196477ef78fc3e5611e3c85a98197e2f580027316fbf07f7a0d09ac46fe12c0b5b8d630cb2cc70bda58d60f6c42f128cf3
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Node/Bias.php] => Array
                    (
                        [expected] => 
                        [current] => 38c37c5180071386706ffcd7861149896e24ba91aa69409f9075eb6e91d7290b1942c284a53459d0f061952e1b7f11cd06d857297c5e8c06dc26dcdd279da11f
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Node/Input.php] => Array
                    (
                        [expected] => 
                        [current] => 121cf3c5a4b856a03869153f3fe6abeffd75be3f368a8c102e346e2b221020ebe7d713708911da5c465bae664a466f60c12171fdce68c6fd32945fae49ef54fc
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Node/Neuron/Synapse.php] => Array
                    (
                        [expected] => 
                        [current] => fa55c504d4e09f052f4fe7952ca8e3a5676ada359e2ecfefebd15ee68af0553bc79b1fc20ce87661d54589186db3e36ca4113ed94a5c9259c259d60ad1ef6adf
                    )

                [vendor/php-ai/php-ml/src/NeuralNetwork/Network.php] => Array
                    (
                        [expected] => 
                        [current] => d86a04d1d0f80a171c70120021f271e0cdfa5ecbec42266d59bb9967bfbd43c6f9f3959d6cf9211f2cf7b7292e5a535788dd950e3e9fff851fb0aa4cda95c07b
                    )

                [vendor/php-ai/php-ml/src/Regression/Regression.php] => Array
                    (
                        [expected] => 
                        [current] => 600488d940778f7219903aab29ab3be3f17bee7bcbd2a11b1a30e56952bb8bd42d8549f668f76dbcd644566ae94570b9812427491d9fd23215718e651f77c87d
                    )

                [vendor/php-ai/php-ml/src/Regression/LeastSquares.php] => Array
                    (
                        [expected] => 
                        [current] => 4f9ceebb235bc5a13978b7b8a4da1f9ce8df3f5351062e176478a5c8c58c8d1dfc84e9d92742393990b0322dd01c1084d2c32bad3c31e146cc5791146d66a179
                    )

                [vendor/php-ai/php-ml/src/Regression/SVR.php] => Array
                    (
                        [expected] => 
                        [current] => c22b17047c8bdda19e4ac116721069eb8199626e618ddeab71fd14ccad1a684789ca609dd4d01ea45865f3463f5c972430fe9dfc5231056809e1de6d472d0e37
                    )

                [vendor/php-ai/php-ml/src/CrossValidation/RandomSplit.php] => Array
                    (
                        [expected] => 
                        [current] => 86b617fb26e762df8f875c99fbc5d47da27288f4ec99b51eed4c96ecfb463274f6942127de066c2cfaeaa6b71baed49fd264085ac296288e68197c56804363bd
                    )

                [vendor/php-ai/php-ml/src/CrossValidation/StratifiedRandomSplit.php] => Array
                    (
                        [expected] => 
                        [current] => 617120e2007efa649973002694cc42c5511529e3a0b3b3a3c34119d078078b0350ae1c83f9b91010d6f955271898d2bc84a78e1b54e1fe4d5fae6893bef180be
                    )

                [vendor/php-ai/php-ml/src/CrossValidation/Split.php] => Array
                    (
                        [expected] => 
                        [current] => 041d470019d9e428dff6d6be53c3209bff541d0fc515f1922423c582288e01a75366d7937017debd595993d46b6eda809d572ae2aa494e13154caa1f84d7225c
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Imputer/Strategy.php] => Array
                    (
                        [expected] => 
                        [current] => b482d508916bd58ff725b33a29626d29cfb84fbc0556788c38449a763a89e6fc6385bd51b74132982e4cf3ef9207221c82e868ba8e710425db7bee3fd81e7167
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Imputer/Strategy/MeanStrategy.php] => Array
                    (
                        [expected] => 
                        [current] => ace6eaedfd228d3563664c2cc1b3430722db27735f3322c3660b7e7ea7a1d02acbb298ef4e06ce6e30103f0fc559a8740777cac85b2d229b204dcc04f0bb8ca5
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Imputer/Strategy/MedianStrategy.php] => Array
                    (
                        [expected] => 
                        [current] => 7226ec1fdbc7a1e844175e93bc3e36f04e107443ffa25bb56dbe932d60fd356359444bb416296971dccd8f815105ae4c1ea5b1123592c810a08f8dc4a2e57db5
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Imputer/Strategy/MostFrequentStrategy.php] => Array
                    (
                        [expected] => 
                        [current] => 05023b5c122da9f04cd8ad9957ec24be3c6606fbaeeb958c11334291bc021fa2396f2b2c13bf6df51e0cb6d509f22ae0b0bb10684fbe8192737d1a1634f23659
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Normalizer.php] => Array
                    (
                        [expected] => 
                        [current] => a6c2e00d530f368e58cac8ec82f7294bf87cccb05be2aebf2e79417aa78e371ccac931539e7715d303ec551f671627bafadafe302f054c30883685b6384157d5
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Imputer.php] => Array
                    (
                        [expected] => 
                        [current] => 9f5a306351cb0ab871fc9713007dbbf44425a9cf540f5d8b9fc8081633b61f3a3f491860a652057b3e6f0b0b05c5b70bf618f911dbef1cfbb7afea3e0df80851
                    )

                [vendor/php-ai/php-ml/src/Preprocessing/Preprocessor.php] => Array
                    (
                        [expected] => 
                        [current] => 6171ab9b4f74aa03305880fc2d612ded2337823ca131bbe0ab5fdb43bbe927dabb30014f14d45308893860c7314dcf024057811ffb8f8e70cce9b8f0365ae78c
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-predict] => Array
                    (
                        [expected] => 
                        [current] => f21c46ba7f2895c2a7d65aed56c5000f504f5c7a9ea94fd0a3a49bb9f93d515a56a36d929e147010ec8b12fe657826a05d9d6c10a8c0e4a6ebe697d6c163eb8e
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-predict.exe] => Array
                    (
                        [expected] => 
                        [current] => cb72d8a8ee953e487cd5dc39fac5793fe6e3290d2d30bcd18918f7f63326a756e9126bde29d6daa3a44cc9e93dec13326b85221fb89a25130d21c6384d5168fc
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-scale-osx] => Array
                    (
                        [expected] => 
                        [current] => 09ca8a7c329ceac949aa79233ecbe57e801d8d022eecfcf8204f42aa36efa967cd684f31e4e653ccccdd8ed4e7a06caf55788ec91aa8f560829d82cb8db31b3a
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-train.exe] => Array
                    (
                        [expected] => 
                        [current] => df94dc112350c5a625014773f527b3cb791c674d60625e958afdbe93dd9da07c96e446489cdd48b8f46f2ab4e3689d2806eadf2846ad74c41797cb3b92cbdd42
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-train-osx] => Array
                    (
                        [expected] => 
                        [current] => 71c713a2f2ee70b61e1af68bd92ff788a77ed5ff1e22d5b7dda2efda914559afa7ae2ba64524c0fbdf374f8e884571004cade608942314b9e159deb90917488e
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-scale.exe] => Array
                    (
                        [expected] => 
                        [current] => efd1e50c199595e43d8a5fb68042ef150e2f2e7cc170cb68df5091cee29650cfea2306353a1c9b4bbf9ce3eda66d811e7b7aad46a406e2e7e891291d2a63a61c
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-scale] => Array
                    (
                        [expected] => 
                        [current] => 4cd2e33a04835489b38f44f391adfe05ba3f74a766992b54d5b72bad9ed7cac217f451ede46957d045db5604c9e0574d1e509c1f4407fd6f53a98e3d2c5a3017
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-predict-osx] => Array
                    (
                        [expected] => 
                        [current] => ab1b10c2571dcb294ada293e22b5ab65b8a2cd26801675e3bbb40f5b98cf2102964bb9b8c7c7efa48ab9c62fe72f50157ec84bdd1faceb1a1f7a04e1ad7a669f
                    )

                [vendor/php-ai/php-ml/bin/libsvm/svm-train] => Array
                    (
                        [expected] => 
                        [current] => 25d9c7c720fc8e4dcbb9c32fcaa99ebcfbe6185cc8103b388368c2bc2bd087f6f0097144c43b3414b75e720b3f81345b3e93a418ae1f383b9ca9a70691c6fef8
                    )

                [vendor/php-ai/php-ml/bin/code-coverage.sh] => Array
                    (
                        [expected] => 
                        [current] => 17f94c00e9bc11a884208dcdbd9882618db5a8281482ac95f7269fbec54c82e0d821d7a8743658da6cb3f60f1a4b39ed3ae72c87ab4ac897e1d1799b03df9e78
                    )

                [vendor/php-ai/php-ml/data/wine.csv] => Array
                    (
                        [expected] => 
                        [current] => 29b4c9e6aa8d8c157f1a6a6f7173da63b83f62181548b91cef55350a41b04ac561860f3f93f2b4c9bb227d9b57c807180532489c575b609ee196d0ee65395c0c
                    )

                [vendor/php-ai/php-ml/data/glass.csv] => Array
                    (
                        [expected] => 
                        [current] => b6e1ab406230c3b20634332294ba98c9d4dda089d2829ea6c2c117b8d92a5150565107930d9a561334f7b1ae6dd36c24017f909e09848d58edc96eec943cf3c8
                    )

                [vendor/php-ai/php-ml/data/iris.csv] => Array
                    (
                        [expected] => 
                        [current] => 214616be2bd3637f821ca2f9e911980021fc3c9d915503d7636f3d065c4cd638a8653ab22ec8b120668ac198ba3d506222d784b43c0b48b77a5ad67902e1ed17
                    )

                [vendor/composer/autoload_static.php] => Array
                    (
                        [expected] => 
                        [current] => b928bed75fafcdd864219483aa17db393dd7da75ec84c14938b98d5554fe95693f73f5e6c4146b18c686adff8634e871a48b2bd39175bd1837daa535632d581e
                    )

                [vendor/composer/autoload_classmap.php] => Array
                    (
                        [expected] => 
                        [current] => ff3569de18e23492e69892a07361e3716fc95bc2ab1afc111039997c5815a0652c8d7c660a2fb6c6978feddfe6041cd98d1fc90e5b277960d7274ea669b04a40
                    )

                [vendor/composer/autoload_psr4.php] => Array
                    (
                        [expected] => 
                        [current] => fefa0beb91e3c532552c1ef61ef0af0603aeee82ff0eb3483bafe8f548bbe52538396bef415e590fde814fec75ce3b8821edac34a51200b0c1be4ea2c39cd5ab
                    )

                [vendor/composer/autoload_real.php] => Array
                    (
                        [expected] => 
                        [current] => 9e69bc267517f9f58e926c410e31bc320284c69c44c15d7423aa35177001fcd8cc6aa2e31aaf2aad19794142cb66e5542dd02a1f613b7b8dcf318d81ad88f277
                    )

                [vendor/composer/autoload_namespaces.php] => Array
                    (
                        [expected] => 
                        [current] => 0ac6bde683c053d62b7024686ecced083ca1a326d5346a248b1a058ac74a5af71d515d311ce76df799a518027f734b80b9e7f6e8022a9556c0f24ce90240d822
                    )

                [vendor/composer/LICENSE] => Array
                    (
                        [expected] => 
                        [current] => 6775b332c93b6eb64934b6c86bfd1619a3021d976bfdf1bcfebd4bd1c0c821aaf7165644cc72c1175ed2c6e1b88a1840c7e1f266cef8ca64caadaee8f575bcf9
                    )

                [vendor/composer/installed.json] => Array
                    (
                        [expected] => 
                        [current] => 0ae3fd7d205c98f022caee4211cf156903d1c5b1aeaa4a84179cd821995d54157c3c8d275ca39328e0cd4728729c04b1a975e62391abb234c8e434f5a1fd109d
                    )

                [composer.json] => Array
                    (
                        [expected] => 
                        [current] => 22b8453dffaa8ef3ab3fce3f681e738cf298fbe93f2e569202fab50f13befc40883a6bda8c222132ecf532212e9284665a3ede2ba30cf7ca32de60b97fa237d1
                    )

            )

    )

)

List of activated apps
Enabled:
 - accessibility: 1.2.0
 - activity: 2.9.1
 - admin_audit: 1.6.0
 - admin_notifications: 1.0.2
 - announcementcenter: 3.5.1
 - apporder: 0.7.1
 - audioplayer: 2.8.4
 - audioplayer_editor: 0.1.0
 - bookmarks: 2.1.1
 - calendar: 1.7.1
 - camerarawpreviews: 0.7.0
 - carnet: 0.17.0
 - checksum: 0.4.3
 - circles: 0.17.7
 - cloud_federation_api: 0.2.0
 - cms_pico: 0.9.8
 - comments: 1.6.0
 - contacts: 3.1.3
 - cospend: 0.1.0
 - dashboard: 6.0.0
 - data_request: 1.3.0
 - dav: 1.9.2
 - deck: 0.6.6
 - dicomviewer: 1.2.0
 - drawio: 0.9.3
 - drop_account: 0.1.0
 - dropit: 0.2.1
 - encryption: 2.4.0
 - event_update_notification: 0.3.4
 - external: 3.3.0
 - extract: 1.2.0
 - facerecognition: 0.5.7
 - federatedfilesharing: 1.6.0
 - federation: 1.6.0
 - files: 1.11.0
 - files_3d: 0.1.0
 - files_antivirus: 2.1.1
 - files_automatedtagging: 1.6.0
 - files_clipboard: 0.7.1
 - files_downloadactivity: 1.5.0
 - files_ebookreader: 0.0.1
 - files_external: 1.7.0
 - files_linkeditor: 1.0.10
 - files_markdown: 2.1.0
 - files_mindmap: 0.0.15
 - files_pdfviewer: 1.5.0
 - files_readmemd: 1.1.1
 - files_retention: 1.5.1
 - files_rightclick: 0.15.1
 - files_sharing: 1.8.0
 - files_texteditor: 2.8.0
 - files_trackdownloads: 1.5.0
 - files_trashbin: 1.6.0
 - files_versions: 1.9.0
 - files_videoplayer: 1.5.0
 - firstrunwizard: 2.5.0
 - flowupload: 0.1.2
 - forms: 1.0.3
 - gallery: 18.3.0
 - gpxedit: 0.0.11
 - gpxmotion: 0.0.9
 - gpxpod: 4.0.5
 - groupfolders: 4.1.0
 - hsts: 0.3.0
 - issuetemplate: 0.5.0
 - keeweb: 0.5.1
 - logreader: 2.1.0
 - lookup_server_connector: 1.4.0
 - mail: 0.17.0
 - maps: 0.1.2
 - metadata: 0.9.0
 - mindmaps: 0.1.0
 - music: 0.10.1
 - myscan: 0.0.1
 - news: 13.1.6
 - nextcloud_announcements: 1.5.0
 - notes: 3.0.2
 - notifications: 2.4.1
 - oauth2: 1.4.2
 - ocdownloader: 1.7.2
 - ocr: 4.4.6
 - ocsms: 2.1.3
 - ownpad: 0.6.13
 - passman: 2.3.2
 - password_policy: 1.6.0
 - passwords: 2019.9.0
 - phonetrack: 0.5.2
 - piwik: 0.5.3
 - polls: 0.10.2
 - preferred_providers: 1.4.0
 - previewgenerator: 2.1.0
 - printer: 0.0.1
 - privacy: 1.0.0
 - privatedata: 1.0.1
 - provisioning_api: 1.6.0
 - quickaccesssorting: 1.0.1
 - quicknotes: 0.1.9
 - quota_warning: 1.5.0
 - radio: 0.6.5
 - ransomware_protection: 1.4.0
 - recommendations: 0.4.0
 - registration: 0.4.7
 - scanner: 0.1.4
 - serverinfo: 1.6.0
 - sharebymail: 1.6.0
 - sharelisting: 0.2.0
 - sharerenamer: 2.7.1
 - sharingpath: 0.0.1
 - social: 0.2.101
 - socialsharing_diaspora: 1.0.4
 - socialsharing_email: 1.0.5
 - socialsharing_facebook: 1.0.4
 - socialsharing_googleplus: 1.0.4
 - socialsharing_twitter: 1.0.4
 - spreed: 6.0.4
 - survey_client: 1.4.0
 - suspicious_login: 1.0.0
 - systemtags: 1.6.0
 - tasks: 0.11.2
 - telephoneprovider: 1.0.2
 - terms_of_service: 1.2.2
 - text: 1.0.2
 - theming: 1.7.0
 - twofactor_admin: 0.4.1
 - twofactor_backupcodes: 1.5.0
 - twofactor_email: 1.0.0
 - twofactor_gateway: 0.14.1
 - twofactor_nextcloud_notification: 1.1.2
 - twofactor_totp: 3.0.1
 - updatenotification: 1.6.0
 - uploaddetails: 0.1.1
 - user_usage_report: 1.1.2
 - video_converter: 0.1.0
 - viewer: 1.1.0
 - workflow_pdf_converter: 1.1.0
 - workflowengine: 1.6.0
Disabled:
 - end_to_end_encryption
 - files_accesscontrol
 - files_inotify
 - files_snapshots
 - folderplayer
 - githubmergetracker
 - ojsxc
 - ownbackup
 - ransomware_detection
 - sociallogin
 - support
 - theming_customcss
 - twofactor_yubikey
 - user_ldap
 - w2g2
 - weather
 - workflow_script

Configuration (config/config.php)
{
    "log_type": "syslog",
    "logfile": "",
    "loglevel": 0,
    "instanceid": "***REMOVED SENSITIVE VALUE***",
    "passwordsalt": "***REMOVED SENSITIVE VALUE***",
    "secret": "***REMOVED SENSITIVE VALUE***",
    "trusted_proxies": "***REMOVED SENSITIVE VALUE***",
    "trusted_domains": [
        "nc.waimanu.io"
    ],
    "datadirectory": "***REMOVED SENSITIVE VALUE***",
    "overwrite.cli.url": "https:\/\/nc.waimanu.io",
    "overwritehost": "nc.waimanu.io",
    "overwriteprotocol": "https",
    "overwritewebroot": "",
    "dbtype": "mysql",
    "version": "16.0.4.1",
    "dbname": "***REMOVED SENSITIVE VALUE***",
    "dbhost": "***REMOVED SENSITIVE VALUE***",
    "dbport": "",
    "dbtableprefix": "oc_",
    "dbuser": "***REMOVED SENSITIVE VALUE***",
    "dbpassword": "***REMOVED SENSITIVE VALUE***",
    "installed": true,
    "memcache.local": "\\OC\\Memcache\\APCu",
    "memcache.distributed": "\\OC\\Memcache\\Redis",
    "memcache.locking": "\\OC\\Memcache\\Redis",
    "memcached_servers": [
        [
            "127.0.0.1",
            11211
        ]
    ],
    "redis": {
        "host": "***REMOVED SENSITIVE VALUE***",
        "port": 6379
    },
    "htaccess.RewriteBase": "\/",
    "mail_smtpmode": "smtp",
    "mail_smtpauthtype": "LOGIN",
    "mail_smtpsecure": "tls",
    "mail_from_address": "***REMOVED SENSITIVE VALUE***",
    "mail_domain": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpauth": 1,
    "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
    "mail_smtpport": "25",
    "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
    "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
    "theme": "",
    "mysql.utf8mb4": true,
    "log_rotate_size": 1073741824,
    "logtimezone": "Europe\/Berlin",
    "updater.release.channel": "stable",
    "maintenance": false,
    "trashbin_retention_obligation": "30,auto",
    "versions_retention_obligation": "365,auto",
    "enable_previews": true,
    "enabledPreviewProviders": [
        "OC\\Preview\\PNG",
        "OC\\Preview\\JPEG",
        "OC\\Preview\\GIF",
        "OC\\Preview\\BMP",
        "OC\\Preview\\XBitmap",
        "OC\\Preview\\Movie",
        "OC\\Preview\\PDF",
        "OC\\Preview\\MP3",
        "OC\\Preview\\TXT",
        "OC\\Preview\\MarkDown",
        "OC\\Preview\\Image",
        "OC\\Preview\\Photoshop",
        "OC\\Preview\\TIFF",
        "OC\\Preview\\SVG",
        "OC\\Preview\\OpenDocument"
    ],
    "ldapIgnoreNamingRules": false,
    "ldapProviderFactory": "OCA\\User_LDAP\\LDAPProviderFactory",
    "data-fingerprint": "14f9373638db7e4c620b53251289ac68",
    "preview_libreoffice_path": "\/usr\/bin\/libreoffice",
    "filesystem_check_changes": 1,
    "has_rebuilt_cache": true,
    "app_install_overwrite": [
        "files_downloadactivity",
        "admin_notifications",
        "mindmaps",
        "privatedata",
        "files_clipboard",
        "githubmergetracker",
        "folderplayer",
        "documents",
        "defaultgroup",
        "myscan",
        "twofactor_email"
    ]
}

Are you using external storage, if yes which one: local/smb/sftp/...

Are you using encryption: false

Are you using an external user-backend, if yes which one: LDAP/ActiveDirectory/Webdav/...

Client configuration

Browser: Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0

Operating system: Arch Linux

Logs

Web server error log
2019-09-16T23:48:46.610 819698600530 apache2.service Nextcloud[12700] CRITICAL {suspicious_login} No models found. Can't load latest
2019-09-16T23:48:46.610 819698601274 apache2.service Nextcloud[12700] WARNING {suspicious_login} Could not predict suspiciousness: No models found
Nextcloud log
In ModelPersistenceService.php line 91:
                   
  No models found  
                   

In QBMapper.php line 248:
                                                                                                                                                   
  Did expect one result but found none when executing: query "SELECT * FROM `*PREFIX*suspicious_login_model` ORDER BY `created_at` desc LIMIT 1";  
                                                                                                                                                   

suspiciouslogin:predict <uid> <ip> [<model>]

Browser log

View list of IPs

This may be a dumb question, but, how do you view a list of the IPs listed as suspicious or not suspicious from the app?

Integrate IP geolocation into notifications

For now, my users are rather irritated than helped by the suspicious login notifications. It would be somewhat more useful if the notification cloud integrate geolocation and say something like "we detected a new login from location XXX" than just the raw IP address, or at least provide a link to a geolocation service that resolves the IP address to a location for you.

thausends over thausends messeseges for suspicios_login

I have a connection from a synologic nas over webdav to the nextcloud server both have a fixed IP (IPv4) I have level 2 and level 4 messages?

What is the way to secure this IP from external or stop the million messages ?

Thanks for a answer
Günther

Use the initial state API to load admin stats

When implementing #37 I deliberately didn't use the Nextcloud 16 initial state API in order to make it possible to run the app on (patched) Nextcloud 15's. However, that API should be used once 16 is a hard requirement.

Same IPs marked as suspicious over several months

Hello,

My logs are getting spammed with warnings because of (legitimate) logins from the same user/ip over the course of several months.
I checked that new models are being trained and also trained them manually with no changes.

From the graphs the classifier believes that it has a recall of 100% and precision of 81%, when that is actually false given that no real suspicious login has happened (yet at least).

How can I ensure that the app recognises legitimate logins over suspicious ones? There are no links in the warning emails asking whether that was a legitimate login or not. How does the app learn which suspicious logins are actually suspicious?

Cache the trained model

For the classification – especially on login – we have to retrieve the trained model from the app data. This is an expensive operation. Since the model is immutable and small (a few kBs), we can just cache it locally and improve the login performance.

Add PHP 8 compatibility

The application is not compatible with PHP 8 and cannot be activated in the store:
PHP with a version lower than 7.4 is required.

Please add PHP 8 compatibility.

Note: The text is misleading. The application works with PHP 7.4 and not only with the lower version 7.3

GDPR Compliance, use hashed IP addresses / user names

Congratulations to another very interesting and sophisticated app in the nextcloud ecosystem! Thank you for your efforts.

But it might be objected that this app is not GDPR compliant at the actual development stage, regarding Art. 5(1)(c).

After what I could see from the database entries, this app saves usernames, IP addresses (both unhashed) and login dates. As long as it is technically possible to work with hashed IP addresses and probably hashed usernames, too, I do not think it is legally compliant in the means of ‘data minimisation’.

Give frequent but static IPs more weight

Expected behavior

This app should classify my (almost) static IP of my office as not suspicious.

Actual behavior

On my test instance, the trained model reaches a very high precision on IPs classifier as not suspicious. But since of all the rows it uses for training only a few have my static IP, it does not seem to optimize for that. While logins from my phone are treated as non-suspicious, logins from the static office IP are.

The training data (aggregated) looked like this:

  • two rows for the static IP (two distinct users)
  • ~250 rows for the other IPs

-> hence it's not surprising that the neural net will more likely learn the patterns of the other IPs than the static one. I manually compare the IPs and the dynamic ones are indeed "different" to my static one.

Possible solution

I have to read up on this but I think we can give frequently seen IPs more weight so the net develops a bias for those.

Support IPv6

Right now the classifier only support IPv4. For IPv6 we'll probably need a second classifier as the structure (and thus bit vector size) is different.

Everything is flagged as suspicious

Hi,

I'm currently experiencing the issue, that every single connection is flagged as suspicious!
Even:

  • 127.0.0.1
  • The IP of the initial setup
  • The Servers own IP

My logfile is literally multiple gigabytes large and almost exclusively full of lines like this:
{"reqId":"o20VWlrQIU1OTT0n90QI","level":2,"time":"2020-08-07T12:52:09+00:00","remoteAddr":"127.0.0.1","user":"server","app":"suspicious_login","method":"MKCOL","url":"/remote.php/dav/files/<redacted>","message":"Detected a login from a suspicious login. user=server ip=127.0.0.1 strategy=ipv4","userAgent":"curl/7.68.0","version":"18.0.7.1"}

The Graph in the security section telling me: "Yay 99% of my detected suspicious logins are actually suspicious" is so next to useless as it is literally telling me: 99% of your users get an unnecessary notification and have to reload the website just to continue doing their job (the amount of "warnings" causes nextcloud to invalidate the current token) ...

Nextcloud Version: 18.0.7
Addon Version: 3.1.0

Greetings

PS: this is not limited to curl! Chrome and firefox have the same issues.

Can't enable the app

When I click Enable I get the following error:

An error occured during the request. Unable to proceed
There is no table with name 'oc_spoody.oc_suspicious_login_model' in the schema

PS: spoody is my username on Nextcloud

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.