AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./*** Helpers for authenticating mobile users through tokens** @package mod_hvp* @copyright 2019 Joubel AS* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace mod_hvp;defined('MOODLE_INTERNAL') || die();class mobile_auth {const VALID_TIME = 60;/*** Generate embed auth token** @param string $secret Secret phrase added to the hash* @param int $validfor Time factor that determines how long the token is valid** @return array Login token and secret* @throws \Exception*/public static function create_embed_auth_token($secret = null, $validfor = null) {if (!$validfor) {$validfor = self::get_time_factor();}if (empty($secret)) {if (function_exists('random_bytes')) {$secret = base64_encode(random_bytes(15));} else if (function_exists('openssl_random_pseudo_bytes')) {$secret = base64_encode(openssl_random_pseudo_bytes(15));} else {$secret = uniqid('', true);}}return [hash('md5', 'embed_auth' . $validfor . $secret),$secret];}/*** Validate embed auth token** @param string $token* @param string $secret** @return bool True if valid token was supplied* @throws \Exception*/public static function validate_embed_auth_token($token, $secret) {$timefactor = self::get_time_factor();// Splitting into two halves and allowing both allows for fractions roundup in the time factor.list($generatedtoken) = self::create_embed_auth_token($secret, $timefactor);list($generatedtoken2) = self::create_embed_auth_token($secret, $timefactor - 1);return $token === $generatedtoken || $token === $generatedtoken2;}/*** Check if provided user_id and token are valid for authenticating the user** @param string $userid* @param string $token** @return bool True if token and user_id is valid* @throws \dml_exception*/public static function has_valid_token($userid, $secret) {global $DB;if (!$userid || !$secret) {return false;}$auth = $DB->get_record('hvp_auth', array('user_id' => $userid,));if (!$auth) {return false;}$isvalid = self::validate_embed_auth_token($auth->secret, $secret);// Cleanup user's token when used.if ($isvalid) {$DB->delete_records('hvp_auth', array('user_id' => $userid));}return $isvalid;}/*** Get time factor for how long the token is valid** @return float*/public static function get_time_factor() {return ceil(time() / self::VALID_TIME);}}