diff --git a/auth/auth.php b/auth/auth.php index 96bfcdfc..dcf93fd6 100644 --- a/auth/auth.php +++ b/auth/auth.php @@ -242,7 +242,7 @@ var_dump($_GET); var_dump($_POST); if ($_GET["type"] == "login") { - die(checkLogin($_POST["user"], $_POST["pass"])); + die(json_encode(checkLogin($_POST["user"], $_POST["pass"]))); } else if ($_GET["type"] == "logout") { logout(); global $localhost; @@ -253,7 +253,7 @@ setcookie($session->getCookieName(), '', time() - 3600, '/'); setcookie("session", '', time() - 3600, '/'); } else die("unknown type!"); - } else if(isset($_POST)) { + } else if(isset($_POST["action"])) { error_log("Got auth post request!"); if($_POST["action"] === "login") { die(json_encode(checkLogin($_POST["user"], $_POST["pass"]))); diff --git a/client-api/api.php b/client-api/api.php index 05440a69..bf7a7c2e 100644 --- a/client-api/api.php +++ b/client-api/api.php @@ -7,6 +7,7 @@ */ $UI_BASE_PATH = "ui-files/"; + $CLIENT_BASE_PATH = "files/"; if(!isset($_SERVER['REQUEST_METHOD'])) { error_log("This is a web only script!"); @@ -54,80 +55,168 @@ fclose($file); } + function error_exit($message) { + http_response_code(400); + die(json_encode([ + "success" => false, + "msg" => $message + ])); + } + function handle_develop_web_request() { global $UI_BASE_PATH; - if($_GET["type"] === "files") { - header("Content-Type: text/plain"); - header("info-version: 1"); - /* header("mode: develop"); */ + if(isset($_GET) && isset($_GET["type"])) { + if($_GET["type"] === "files") { + header("Content-Type: text/plain"); + header("info-version: 1"); + /* header("mode: develop"); */ - echo ("type\thash\tpath\tname\n"); - foreach (list_dir($UI_BASE_PATH) as $file) { - $type_idx = strrpos($file, "."); - $type = substr($file, $type_idx + 1); - if($type == "php") $type = "html"; + echo ("type\thash\tpath\tname\n"); + foreach (list_dir($UI_BASE_PATH) as $file) { + $type_idx = strrpos($file, "."); + $type = substr($file, $type_idx + 1); + if($type == "php") $type = "html"; - $name_idx = strrpos($file, "/"); - $name = $name_idx > 0 ? substr($file, $name_idx + 1) : $file; - $path = $name_idx > 0 ? substr($file, 0, $name_idx) : "."; + $name_idx = strrpos($file, "/"); + $name = $name_idx > 0 ? substr($file, $name_idx + 1) : $file; + $path = $name_idx > 0 ? substr($file, 0, $name_idx) : "."; - $name_idx = strrpos($name, "."); - $name = substr($name, 0, $name_idx); + $name_idx = strrpos($name, "."); + $name = substr($name, 0, $name_idx); - echo $type . "\t" . sha1_file($UI_BASE_PATH . $file) . "\t" . $path . "\t" . $name . "." . $type . "\n"; - } - die; - } else if($_GET["type"] === "file") { - header("Content-Type: text/plain"); - - $path = realpath($UI_BASE_PATH . $_GET["path"]); - $name = $_GET["name"]; - if($path === False || strpos($path, realpath(".")) === False || strpos($name, "/") !== False) die(json_encode([ - "success" => false, - "error" => "invalid file!" - ])); - - if(!is_file( $path . DIRECTORY_SEPARATOR . $name)) { - if(endsWith($name, ".html")) { - $name = substr($name, 0, strlen($name) - 4); - $name .= "php"; + echo $type . "\t" . sha1_file($UI_BASE_PATH . $file) . "\t" . $path . "\t" . $name . "." . $type . "\n"; } - } - if(!is_file( $path . DIRECTORY_SEPARATOR . $name)) - die(json_encode([ - "success" => false, - "error" => "missing file!" - ])); + die; + } else if($_GET["type"] === "file") { + header("Content-Type: text/plain"); + + $path = realpath($UI_BASE_PATH . $_GET["path"]); + $name = $_GET["name"]; + if($path === False || strpos($path, realpath(".")) === False || strpos($name, "/") !== False) error_exit("Invalid file"); + + if(!is_file( $path . DIRECTORY_SEPARATOR . $name)) { + if(endsWith($name, ".html")) { + $name = substr($name, 0, strlen($name) - 4); + $name .= "php"; + } + } + if(!is_file( $path . DIRECTORY_SEPARATOR . $name)) error_exit("Missing file"); + + fdump( $path . DIRECTORY_SEPARATOR . $name); + die(); + } else if ($_GET["type"] == "update-info") { + global $CLIENT_BASE_PATH; + $raw_versions = file_get_contents($CLIENT_BASE_PATH . "/version.json"); + if($raw_versions === false) error_exit("Missing file!"); + + $versions = json_decode($raw_versions, true); + $versions["success"] = true; + + die(json_encode($versions)); + } else if ($_GET["type"] == "update-download") { + global $CLIENT_BASE_PATH; + + $path = $CLIENT_BASE_PATH . $_GET["channel"] . DIRECTORY_SEPARATOR . $_GET["version"] . DIRECTORY_SEPARATOR; + $raw_release_info = file_get_contents($path . "info.json"); + if($raw_release_info === false) error_exit("missing info file (version and/or channel missing. Path was " . $path . ")"); + $release_info = json_decode($raw_release_info); + + foreach($release_info as $platform) { + if($platform->platform != $_GET["platform"]) continue; + if($platform->arch != $_GET["arch"]) continue; + + http_response_code(200); + header("Cache-Control: public"); // needed for internet explorer + header("Content-Type: application/binary"); + header("Content-Transfer-Encoding: Binary"); + header("Content-Length:".filesize($path . $platform->update)); + header("Content-Disposition: attachment; filename=update.tar.gz"); + readfile($path . $platform->update); + die(); + } + error_exit("Missing platform, arch or file"); + } + } else if($_POST["type"] == "deploy-build") { + global $CLIENT_BASE_PATH; + + if(!isset($_POST["secret"]) || !isset($_POST["version"]) || !isset($_POST["platform"]) || !isset($_POST["arch"]) || !isset($_POST["update_suffix"]) || !isset($_POST["installer_suffix"])) + error_exit("Missing required information!"); + + { + $require_secret = file_get_contents(".deploy_secret"); + if($require_secret === false || strlen($require_secret) == 0) error_exit("Server missing secret!"); + + if(!is_string($_POST["secret"])) error_exit("Invalid secret!"); + if(strcmp(trim($require_secret), trim($_POST["secret"])) !== 0) + error_exit("Secret does not match!"); + } + + if(!isset($_FILES["update"])) error_exit("Missing update file"); + if($_FILES["update"]["error"] !== UPLOAD_ERR_OK) error_exit("Upload for update failed!"); + if(!isset($_FILES["installer"])) error_exit("Missing installer file"); + if($_FILES["installer"]["error"] !== UPLOAD_ERR_OK) error_exit("Upload for installer failed!"); + + $json_version = json_decode($_POST["version"], true); + $version = $json_version["major"] . "." . $json_version["minor"] . "." . $json_version["patch"] . ($json_version["build"] > 0 ? $json_version["build"] : ""); + $path = $CLIENT_BASE_PATH . DIRECTORY_SEPARATOR . $_POST["channel"] . DIRECTORY_SEPARATOR . $version . DIRECTORY_SEPARATOR; + exec("mkdir -p " . $path); + //mkdir($path, 777, true); + + + $filename_update = "TeaClient-" . $_POST["platform"] . "_" . $_POST["arch"] . "." . $_POST["update_suffix"]; + $filename_install = "TeaClient-" . $_POST["platform"] . "_" . $_POST["arch"] . "." . $_POST["installer_suffix"]; + + { + $version_info = file_get_contents($path . "info.json"); + if($version_info === false) $version_info = array(); + else $version_info = json_decode($version_info, true); + + for($index = 0; $index < count($version_info); $index++) { + if($version_info[$index]["platform"] == $_POST["platform"] && $version_info[$index]["arch"] == $_POST["arch"]) { + array_splice($version_info, $index, 1); + break; + } + } + $info = array(); + $info["platform"] = $_POST["platform"]; + $info["arch"] = $_POST["arch"]; + $info["update"] = $filename_update; + $info["install"] = $filename_install; + array_push($version_info, $info); + file_put_contents($path . "info.json", json_encode($version_info)); + } + + { + $filename = $CLIENT_BASE_PATH . DIRECTORY_SEPARATOR . "version.json"; + $indexes = file_get_contents($filename); + if($indexes === false) $indexes = array(); + else $indexes = json_decode($indexes, true); + + $index = &$indexes[$_POST["channel"]]; + if(!isset($index)) + $index = array(); + + for($idx = 0; $idx < count($index); $idx++) { + if($index[$idx]["platform"] == $_POST["platform"] && $index[$idx]["arch"] == $_POST["arch"]) { + array_splice($index, $idx, 1); + break; + } + } + + $info = array(); + $info["platform"] = $_POST["platform"]; + $info["arch"] = $_POST["arch"]; + $info["version"] = $json_version; + array_push($index, $info); + + file_put_contents($filename, json_encode($indexes)); + } + + move_uploaded_file($_FILES["installer"]["tmp_name"],$path . $filename_install); + move_uploaded_file($_FILES["update"]["tmp_name"],$path . $filename_update); - fdump( $path . DIRECTORY_SEPARATOR . $name); - die(); - } else if ($_GET["type"] == "update-info") { - //TODO read real data from update/info.txt die(json_encode([ - "versions" => [ - [ - "channel" => "beta", - "major" => 1, - "minor" => 0, - "patch" => 0, - "build" => 0 - ], - [ - "channel" => "release", - "major" => 1, - "minor" => 0, - "patch" => 0, - "build" => 0 - ] - ], - "updater" => [ - "channel" => "release", - "major" => 1, - "minor" => 0, - "patch" => 0, - "build" => 0 - ], "success" => true ])); } else die(json_encode([ @@ -136,4 +225,4 @@ ])); } - handle_develop_web_request(); \ No newline at end of file + handle_develop_web_request(); diff --git a/client/app-definitions/index.d.ts b/client/app-definitions/index.d.ts index 3bdfdcd4..7087fd6e 100644 --- a/client/app-definitions/index.d.ts +++ b/client/app-definitions/index.d.ts @@ -1,3 +1,4 @@ /* native functions declaration */ +import * as updater from "updater/updater"; declare function displayCriticalError(message: string); \ No newline at end of file diff --git a/shared/js/connection.ts b/shared/js/connection.ts index f55d2009..eb8f1da7 100644 --- a/shared/js/connection.ts +++ b/shared/js/connection.ts @@ -322,15 +322,17 @@ class HandshakeHandler { } else if(this.identity.type() == IdentitifyType.NICKNAME) { //FIXME handle error this should never happen! } - this.connection.sendCommand("handshakeindentityproof", {proof: proof}).then(() => { - this.handshake_finished(); - }).catch(error => { + this.connection.sendCommand("handshakeindentityproof", {proof: proof}).catch(error => { console.error("Got login error"); console.log(error); - }); //TODO handle error + }).then(() => this.handshake_finished()); //TODO handle error } - private handshake_finished() { + private async handshake_finished(version?: string) { + if(window.require && !version) { + version = "?.?.?"; //FIXME findout version! + } + let data = { //TODO variables! client_nickname: this.name ? this.name : this.identity.name(), @@ -342,9 +344,22 @@ class HandshakeHandler { }; if(window.require) { - const os = require('os'); - data.client_version = "TeaClient"; //FIXME get version - data.client_platform = os.platform() + " (" + os.arch() + ")"; + data.client_version = "TeaClient "; + data.client_version += " " + version; + + const os = require("os"); + const arch_mapping = { + "x32": "32bit", + "x64": "64bit" + }; + + data.client_version += " " + (arch_mapping[os.arch()] || os.arch()); + + const os_mapping = { + "win32": "Windows", + "linux": "Linux" + }; + data.client_platform = (os_mapping[os.platform()] || os.platform()); } this.connection.sendCommand("clientinit", data).catch(error => { diff --git a/shared/js/load.ts b/shared/js/load.ts index e67f7f09..0cf475e3 100644 --- a/shared/js/load.ts +++ b/shared/js/load.ts @@ -239,6 +239,10 @@ function loadTemplates() { }); } +interface Window { + $: JQuery; +} + //TODO release config! function loadSide() { if(window.require !== undefined) { diff --git a/tsconfig.json b/tsconfig.json index 264f1419..303a8d80 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "module": "none", "target": "es6", + "module": "none", "sourceMap": true }, "exclude": [