You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.5 KiB
PHTML
130 lines
3.5 KiB
PHTML
6 years ago
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||
|
*/
|
||
|
|
||
|
class Login {
|
||
|
|
||
|
const BAD_USERPASS = 1;
|
||
|
const BAD_2FA = 2;
|
||
|
const ACCOUNT_DISABLED = 3;
|
||
|
const LOGIN_OK = 4;
|
||
|
|
||
|
public static function auth(string $username, string $password, string $twofa = ""): int {
|
||
|
global $database;
|
||
|
$username = strtolower($username);
|
||
|
|
||
|
$user = User::byUsername($username);
|
||
|
|
||
|
if (!$user->exists()) {
|
||
|
return Login::BAD_USERPASS;
|
||
|
}
|
||
|
if (!$user->checkPassword($password)) {
|
||
|
return Login::BAD_USERPASS;
|
||
|
}
|
||
|
|
||
|
if ($user->has2fa()) {
|
||
|
if (!$user->check2fa($twofa)) {
|
||
|
return Login::BAD_2FA;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch ($user->getStatus()->get()) {
|
||
|
case AccountStatus::TERMINATED:
|
||
|
return Login::BAD_USERPASS;
|
||
|
case AccountStatus::LOCKED_OR_DISABLED:
|
||
|
return Login::ACCOUNT_DISABLED;
|
||
|
case AccountStatus::NORMAL:
|
||
|
default:
|
||
|
return Login::LOGIN_OK;
|
||
|
}
|
||
|
|
||
|
return Login::LOGIN_OK;
|
||
|
}
|
||
|
|
||
|
public static function verifyCaptcha(string $session, string $answer, string $url): bool {
|
||
|
$data = [
|
||
|
'session_id' => $session,
|
||
|
'answer_id' => $answer,
|
||
|
'action' => "verify"
|
||
|
];
|
||
|
$options = [
|
||
|
'http' => [
|
||
|
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
|
||
|
'method' => 'POST',
|
||
|
'content' => http_build_query($data)
|
||
|
]
|
||
|
];
|
||
|
$context = stream_context_create($options);
|
||
|
$result = file_get_contents($url, false, $context);
|
||
|
$resp = json_decode($result, TRUE);
|
||
|
if (!$resp['result']) {
|
||
|
return false;
|
||
|
} else {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check the login server API for sanity
|
||
|
* @return boolean true if OK, else false
|
||
|
*/
|
||
|
public static function checkLoginServer() {
|
||
|
try {
|
||
|
$client = new GuzzleHttp\Client();
|
||
|
|
||
|
$response = $client
|
||
|
->request('POST', PORTAL_API, [
|
||
|
'form_params' => [
|
||
|
'key' => PORTAL_KEY,
|
||
|
'action' => "ping"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
if ($response->getStatusCode() != 200) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$resp = json_decode($response->getBody(), TRUE);
|
||
|
if ($resp['status'] == "OK") {
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
} catch (Exception $e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if the given AccountHub API key is valid by attempting to
|
||
|
* access the API with it.
|
||
|
* @param String $key The API key to check
|
||
|
* @return boolean TRUE if the key is valid, FALSE if invalid or something went wrong
|
||
|
*/
|
||
|
function checkAPIKey($key) {
|
||
|
try {
|
||
|
$client = new GuzzleHttp\Client();
|
||
|
|
||
|
$response = $client
|
||
|
->request('POST', PORTAL_API, [
|
||
|
'form_params' => [
|
||
|
'key' => $key,
|
||
|
'action' => "ping"
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
if ($response->getStatusCode() === 200) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
} catch (Exception $e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|