From e5294bbecd3e7a34255aec0e7639eb98a91e2f72 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Mon, 18 Dec 2017 01:44:53 -0700 Subject: [PATCH] Add mobile code login for Station client --- api.php | 8 ++++++++ database.mwb | Bin 18648 -> 19616 bytes database.sql | 20 +++++++++++++++++++- database_upgrade/1.0.1_1.1.sql | 14 ++++++++++++++ lang/en_us.php | 1 + mobile/index.php | 12 ++++++++++++ nbproject/mplheader.txt | 9 +++++++++ nbproject/project.properties | 1 + 8 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 database_upgrade/1.0.1_1.1.sql create mode 100644 nbproject/mplheader.txt diff --git a/api.php b/api.php index ddfc1a5..5fc55c8 100644 --- a/api.php +++ b/api.php @@ -288,6 +288,14 @@ switch ($VARS['action']) { exit(json_encode(["status" => "OK"])); } exit(json_encode(["status" => "ERROR", "msg" => $result])); + case "codelogin": + $database->delete("onetimekeys", ["expires[<]" => date("Y-m-d H:i:s")]); // cleanup + if ($database->has("onetimekeys", ["key" => $VARS['code'], "expires[>]" => date("Y-m-d H:i:s")])) { + $user = $database->get("onetimekeys", ["[>]accounts" => ["uid" => "uid"]], ["username", "realname", "accounts.uid"], ["key" => $VARS['code']]); + exit(json_encode(["status" => "OK", "user" => $user])); + } else { + exit(json_encode(["status" => "ERROR", "msg" => lang("no such code or code expired", false)])); + } default: http_response_code(404); die(json_encode("404 Not Found: the requested action is not available.")); diff --git a/database.mwb b/database.mwb index 64bacb1c47fc4adc7873df6714701d702ebac016..1b0386020041fc89d6c169dafd1e282a41b44aaf 100644 GIT binary patch literal 19616 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

sG=YpUu|GZW>yaRmU*v!dJURRvE>i=&Av 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 literal 18648 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 sLDzL~QGxi-*dQG<7+m@^BV9Q~2*d}4;|S+z>% diff --git a/database.sql b/database.sql index 38ec6b7..b6c140c 100644 --- a/database.sql +++ b/database.sql @@ -1,5 +1,5 @@ -- MySQL Script generated by MySQL Workbench --- Mon 20 Nov 2017 08:36:18 PM MST +-- Mon 18 Dec 2017 12:56:23 AM MST -- Model: New Model Version: 1.0 -- MySQL Workbench Forward Engineering @@ -275,6 +275,24 @@ CREATE TABLE IF NOT EXISTS `accounthub`.`rate_limit` ( ENGINE = MEMORY; +-- ----------------------------------------------------- +-- Table `accounthub`.`onetimekeys` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `accounthub`.`onetimekeys` ( + `key` VARCHAR(10) NOT NULL, + `uid` INT NOT NULL, + `expires` DATETIME NOT NULL, + INDEX `fk_onetimekeys_accounts1_idx` (`uid` ASC), + PRIMARY KEY (`key`), + UNIQUE INDEX `key_UNIQUE` (`key` ASC), + CONSTRAINT `fk_onetimekeys_accounts1` + FOREIGN KEY (`uid`) + REFERENCES `accounthub`.`accounts` (`uid`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/database_upgrade/1.0.1_1.1.sql b/database_upgrade/1.0.1_1.1.sql new file mode 100644 index 0000000..5da1945 --- /dev/null +++ b/database_upgrade/1.0.1_1.1.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS `onetimekeys` ( + `key` VARCHAR(10) NOT NULL, + `uid` INT(11) NOT NULL, + `expires` DATETIME NOT NULL, + INDEX `fk_onetimekeys_accounts1_idx` (`uid` ASC), + PRIMARY KEY (`key`), + UNIQUE INDEX `key_UNIQUE` (`key` ASC), + CONSTRAINT `fk_onetimekeys_accounts1` + FOREIGN KEY (`uid`) + REFERENCES `accounthub`.`accounts` (`uid`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8 diff --git a/lang/en_us.php b/lang/en_us.php index b81effd..e9a2687 100644 --- a/lang/en_us.php +++ b/lang/en_us.php @@ -95,4 +95,5 @@ $STRINGS = [ "secret key" => "Secret key", "label" => "Label", "issuer" => "Issuer", + "no such code or code expired" => "That code is incorrect or expired." ]; diff --git a/mobile/index.php b/mobile/index.php index dc2298d..63616a9 100644 --- a/mobile/index.php +++ b/mobile/index.php @@ -117,6 +117,18 @@ switch ($VARS['action']) { } } exit(json_encode(["status" => "OK", "apps" => $apps])); + case "gencode": + engageRateLimit(); + $uid = $database->get("accounts", "uid", ["username" => $username]); + $code = ""; + do { + $code = random_int(100000, 999999); + } while ($database->has("onetimekeys", ["key" => $code])); + + $database->insert("onetimekeys", ["key" => $code, "uid" => $uid, "expires" => date("Y-m-d H:i:s", strtotime("+1 minute"))]); + + $database->delete("onetimekeys", ["expires[<]" => date("Y-m-d H:i:s")]); // cleanup + exit(json_encode(["status" => "OK", "code" => $code])); default: http_response_code(404); die(json_encode(["status" => "ERROR", "msg" => "The requested action is not available."])); diff --git a/nbproject/mplheader.txt b/nbproject/mplheader.txt new file mode 100644 index 0000000..f7703e8 --- /dev/null +++ b/nbproject/mplheader.txt @@ -0,0 +1,9 @@ +<#if licenseFirst??> +${licenseFirst} + +${licensePrefix}This Source Code Form is subject to the terms of the Mozilla Public +${licensePrefix}License, v. 2.0. If a copy of the MPL was not distributed with this +${licensePrefix}file, You can obtain one at http://mozilla.org/MPL/2.0/. +<#if licenseLast??> +${licenseLast} + \ No newline at end of file diff --git a/nbproject/project.properties b/nbproject/project.properties index 911a7b8..3215614 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -1,5 +1,6 @@ include.path=${php.global.include.path} php.version=PHP_70 +project.licensePath=./nbproject/mplheader.txt source.encoding=UTF-8 src.dir=. tags.asp=false