$profile) { $profiles_whitelist[$key] = strtolower(pathinfo($profile)["filename"]); } if (!in_array(strtolower($username), $profiles_whitelist)) { echo login_form("Error: username not found."); exit(0); } $index = array_search(strtolower($username), $profiles_whitelist); $raw_json = file_get_contents($glob[$index]); $json = json_decode($raw_json, true); if ($json["username"] !== $username) { echo login_form("Error: wrong username."); exit(0); } if ($json["password"] !== $password) { echo login_form("Error: wrong password."); exit(0); } if ($json["username"] === $username && $json["password"] === $password) // just to be safe, the if is here { $model = $json; } } else { echo login_form(); exit(0); } // actual if (isset($_POST["backup"]) || isset($_GET["backup"])) { $time_part = "-" . time(); $backup_filename = $backup_path . strtolower($model["username"]) . $time_part . $profile_extension; file_put_contents($backup_filename, json_encode($model)); redirect("./"); exit(0); } else if (!empty($_POST["restore"]) || !empty($_GET["restore"])) { $timestamp = 0; if (!empty($_POST["restore"])) { $timestamp = $_POST["restore"]; } else if (!empty($_GET["restore"])) { $timestamp = $_GET["restore"]; } $backup_prefix = $backup_path . strtolower($model["username"]) . "-"; $backup_filename = $backup_prefix . strval($timestamp) . $profile_extension; $backups = glob($backup_prefix . "*" . $profile_extension); if (in_array($backup_filename, $backups) && file_exists($backup_filename)) { $backup_json = json_decode(file_get_contents($backup_filename), true); $model["list"] = $backup_json["list"]; } $file = $model["file"]; $raw_json = json_encode($model); file_put_contents($file, $raw_json); redirect("./"); exit(0); } else if (isset($_POST["delete-restore"]) || isset($_GET["delete-restore"])) { $timestamp = 0; if (!empty($_POST["delete-restore"])) { $timestamp = $_POST["delete-restore"]; } else if (!empty($_GET["delete-restore"])) { $timestamp = $_GET["delete-restore"]; } $backup_prefix = $backup_path . strtolower($model["username"]) . "-"; $backup_filename = $backup_prefix . strval($timestamp) . $profile_extension; $backup_new_filename = $backup_path . "deleted-" . strtolower($model["username"]) . "-" . strval($timestamp) . $profile_extension; $backups = glob($backup_prefix . "*" . $profile_extension); if (in_array($backup_filename, $backups) && file_exists($backup_filename)) { rename($backup_filename, $backup_new_filename); } redirect("./?restore-list"); exit(0); } else if (isset($_POST["restore-list"]) || isset($_GET["restore-list"])) { $backups = array(); $backup_prefix = $backup_path . strtolower($model["username"]) . "-"; $glob = glob($backup_prefix . "*" . $profile_extension); natcasesort($glob); $glob = array_reverse($glob); foreach ($glob as $backup) { $timestamp_and_ext = str_replace($backup_prefix, "", $backup); $timestamp = intval(str_replace($profile_extension, "", $timestamp_and_ext)); $datestamp = date("r", $timestamp); $backups[] = array( "timestamp" => $timestamp, "date" => $datestamp, "file" => $backup, ); } echo restore_form($backups); exit(0); } else if (!empty($_POST["action"])) { $action = $_POST["action"]; $modified = false; if ($action === "add" || $action == "edit") { if (!empty($_POST["todo_item_id"])) { $id_to_edit = $_POST["todo_item_id"]; } if (!empty($_POST["todo_title"])) { $title = $_POST["todo_title"]; $description = ""; if (!empty($_POST["todo_description"])) { $description = $_POST["todo_description"]; } $deadline = ""; if (!empty($_POST["todo_deadline"])) { $deadline = strtotime($_POST["todo_deadline"]); } $category = ""; if (!empty($_POST["todo_category"])) { $category = $_POST["todo_category"]; } $now = time(); if (empty($model["list"])) { $model["list"] = array(); } $new_item = array( "title" => $title, "description" => $description, "deadline" => $deadline, "category" => $category, "created" => $now, "modified" => $now, ); if (!empty($id_to_edit) && !empty($model["list"][$id_to_edit])) { $model["list"][$id_to_edit] = $new_item; } else { $model["list"][] = $new_item; } $modified = true; } } else if ($action === "remove") { if (isset($_POST["todo_item_id"])) { $id = $_POST["todo_item_id"]; if (isset($model["list"][$id])) { unset($model["list"][$id]); $model["list"] = array_values($model["list"]); // renumber $modified = true; } } } else if ($action === "delay" && !empty($_POST["delay_by"])) { $delay_by = $_POST["delay_by"]; if (isset($_POST["todo_item_id"])) { $id = $_POST["todo_item_id"]; if (isset($model["list"][$id]) && !empty($model["list"][$id]["deadline"])) { $now = time(); $deadline = strtotime("@".$model["list"][$id]["deadline"]); $deadline_new = strtotime($delay_by, $deadline); $model["list"][$id]["deadline"] = $deadline_new; $model["list"][$id]["modified"] = $now; $modified = true; } } } if ($modified) { if (!empty($model["file"]) && file_exists($model["file"])) { $file = $model["file"]; $raw_json = json_encode($model); file_put_contents($file, $raw_json); redirect("./"); exit(0); } else { login_form("Internal error!"); exit(0); exit(0); exit(0); exit(0); } } } else { echo todo_list($model); } // renderers function todo_list(array $model = []) : string { $list = array(); if (!empty($model["list"])) { $list = $model["list"]; } $te = new template_engine(); $te->set_block("TITLE", $model["username"] . "'s to-do List"); $te->append_block_template("CONTENT", "MAIN_LIST"); $te->append_block_template("CONTENT", "ADD_FORM"); $te->append_block_template("CONTENT", "NAVBAR"); $categories = array(); $now = time(); $now_dayth = intval(date("z", $now)); if (!empty($list)) { foreach ($list as $key => $item) { if (!empty($item["category"])) { $category = strtolower($item["category"]); $category_name = $item["category"]; $category_basis = "custom"; } else if (!empty($item["deadline"])) { $deadline = $item["deadline"]; $ymd = date("y-m-d", $deadline); $day = date("l", $deadline); $dayth = intval(date("z", $deadline)); $category = $ymd; if ($dayth - $now_dayth == 0) { $category_name = "Today ({$day})"; } else if ($dayth - $now_dayth == 1) { $category_name = "Tomorrow ({$day})"; } else if ($dayth - $now_dayth == -1) { $category_name = "Yesterday ({$day})"; } else if ($dayth - $now_dayth < -7) { $category_name = "{$day} ({$ymd})"; } else if ($dayth - $now_dayth < 0) { $category_name = "Last " . $day; } else if ($dayth - $now_dayth < 7) { $category_name = $day; } else if ($dayth - $now_dayth < 14) { $category_name = "Next " . $day; } else { $category_name = "{$day} ({$ymd})"; } $category_basis = "date"; } else { $category = "uncategorized"; $category_name = "Uncategorized"; $category_basis = "default"; } if (empty($categories[$category])) { $categories[$category] = array( "title" => $category_name, "basis" => $category_basis, "list" => array(), ); } $categories[$category]["list"][$key] = $item; } } if (!empty($categories)) { $te->set_block("MAIN_ITEMS", ""); } $te->set_block("DATALIST_AUTOFILLS", ""); ksort($categories); $titles = array(); foreach ($categories as $category_key => $category) { $category_name = $category["title"]; $category_basis = $category["basis"]; $te->set_block("MAIN_CATEGORY_ITEMS", ""); if ($category_basis == "custom") { $te->append_argumented_block("DATALIST_AUTOFILLS", "DATALIST_AUTOFILL", [ "DATALIST_AUTOFILL_DATA" => $category_name, ]); } foreach ($category["list"] as $key => $item) { $titles[] = $item["title"]; if (empty($item["description"])) { $te->set_block_template("MAIN_ITEM_SUMMARY", "MAIN_ITEM_SUMMARY_NODESC"); } else { $te->set_block_template("MAIN_ITEM_SUMMARY", "MAIN_ITEM_SUMMARY_DESC"); } $te->append_argumented_block("MAIN_CATEGORY_ITEMS", "MAIN_ITEM", [ "MAIN_ITEM_ID" => $key, "MAIN_ITEM_TITLE" => $item["title"], "MAIN_ITEM_DESCRIPTION" => $item["description"], ]); } $te->append_argumented_block("MAIN_ITEMS", "MAIN_CATEGORY", [ "MAIN_CATEGORY_ID" => $category_key, "MAIN_CATEGORY_TITLE" => $category_name, ]); } $te->append_argumented_block("DATALISTS", "DATALIST", [ "DATALIST_ID" => "todo_categories", ]); $te->set_block("DATALIST_AUTOFILLS", ""); foreach (array_unique($titles) as $title) { $te->append_argumented_block("DATALIST_AUTOFILLS", "DATALIST_AUTOFILL", [ "DATALIST_AUTOFILL_DATA" => $title, ]); } $te->append_argumented_block("DATALISTS", "DATALIST", [ "DATALIST_ID" => "todo_titles", ]); // $te->append_block("MAIN_ITEMS", "
"); // $te->append_block("MAIN_ITEMS", "dump
".print_r($model, true)."
"); return $te->get_html(); exit(0); } function restore_form(array $backups = array()) : string { $te = new template_engine(); $number = count($backups); foreach($backups as $key => $backup) { $title = "#" . $backup["timestamp"] . ": " . $backup["date"]; $te->append_argumented_block("RESTORE_ITEMS", "RESTORE_ITEM", [ "RESTORE_ITEM_TIMESTAMP" => $backup["timestamp"], "RESTORE_ITEM_TITLE" => $title, ]); } $te->set_block("TITLE", "Zovguran: To-Do"); $te->append_block_template("CONTENT", "RESTORE_CONTAINER"); return $te->get_html(); exit(0); } function login_form(string $notice = "") : string { $te = new template_engine(); $te->set_block("TITLE", "Zovguran: To-Do"); $te->set_block("LOGIN_NOTICE", $notice); $te->append_block_template("CONTENT", "LOGIN_FORM"); return $te->get_html(); exit(0); } function register_form(string $notice = "") : string { $te = new template_engine(); $te->set_block("TITLE", "Sign Up"); $te->set_block("REGISTER_NOTICE", $notice); $te->append_block_template("CONTENT", "REGISTER_FORM"); return $te->get_html(); exit(0); } function redirect($path) { header('Location: ' . $path); exit(0); // TERMINATE! }dump
".print_r($categories, true)."