F diff --git a/css/style.css b/css/style.css --- a/css/style.css +++ b/css/style.css#header {background: white;margin: 0;- padding: 1rem;+ padding: 0;+ height: 3rem;font-size: 2em;+ display: flex;+ align-items: stretch;+ user-select: none;+ -webkit-user-select: none;+ -ms-user-select: none;+ }++ #topmenu {+ font-size: 1.3rem;+ list-style-type: none;+ display: flex;+ margin: 0;+ padding: 0;+ }++ #topmenu > li {+ cursor: pointer;+ padding: 10px;+ }++ #topmenu > li:hover {+ background: #eee;}.logo {font-family: monospace;margin: 0;+ align-self: center;+ padding-left: 2rem;}#hero {font-weight: bold;}-form {background: white;margin: 4.5rem;justify-content: center;}+ .filesystem > h2,form > h2 {color: #4d4d4d;margin: 0;from { opacity: 0; }to { opacity: 1; }}- input {++ input:not([type=file]) {min-width: 300px;border: 1px solid #bbb;padding: 0.5rem;bottom: 0;z-index: -200;}++ #loginform {+ display: none;+ }++ .filesystem {+ background: #fafafa;+ margin: 1rem;+ padding: 0;+ box-shadow: 0 0.8rem 1.3rem rgba(0,0,0,0.2);+ border-radius: 0.5rem;+ border-radius: 0.5rem;+ border: 1px solid #b9b9b9;++ display: block;+ }++ .files {+ padding: 1rem;+ display: grid;++ grid-gap: 20px;+ grid-auto-rows: 10rem;+ grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));+ }++ .file {+ padding: 0.5rem;+ cursor: pointer;+ color: #333;+ user-select: none;+ -webkit-user-select: none;+ -ms-user-select: none;++ display: flex;+ flex-direction: column;+ align-items: center;+ border: 1px solid #fafafa;+ border-radius: 0.3rem;+ }++ .file:hover {+ padding: 0.5rem;+ background: white;+ color: black;+ border-color: #ddd;+ }++ .file:hover > img {+ filter: brightness(150%);+ }++ .path {+ font-size: 1.5rem;+ }++ .path > a {+ color: #333;+ text-decoration: none;+ }++ .path > a:hover {+ text-decoration: underline;+ }++ .filesystem > h2 {+ display: flex;+ align-items: baseline;+ font-weight: normal;+ }F diff --git a/index.html b/index.html deleted file mode 100644 --- a/index.html +++ /dev/null- <!DOCTYPE html>- <html>- <head>- <meta charset="utf-8">- <title>shady file upload</title>- <link rel="stylesheet" type="text/css" href="css/style.css">- </head>-- <body>- <div class="overlay" style="height: 100%;">- <div class="vert2">- <div id="header">- <p class="logo">shady_file_upload</p>- </div>-- <div id="page">- <div id="hero" class="overlay">- <div id="arrows">- <img src="svg/arrow.svg" id="protoarrow" style="display: none">- </div>-- <div class="vcenter">- <p>file upload service</p>- <p class="big">that <span class="blue">just about works</span></p>- <p>most of the time</p>- </div>- </div>-- <div class="vcenter">- <form name="hero_form" action="/php/register.php" method="post" onsubmit="return validate_hero_form()">- <h2>Get started</h2>- <div class="content">- <p>Username</p>- <input type="text" id="username" name="username">- <p id="username-length-error" class="hero_form_error" hidden>Please specify a username</p>-- <p>Email address</p>- <input type="text" id="email" name="email">- <p id="email-error" class="hero_form_error" hidden>Invalid email address</p>-- <p>Password</p>- <input type="password" id="password" name="password">- <p id="password-length-error" class="hero_form_error" hidden>Please provide a password</p>-- <p>Repeat Password</p>- <input type="password" id="password2" name="password2">- <p id="password-match-error" class="hero_form_error" hidden>Passwords didn't match</p>- <input type="submit" value="Sign up">- <p style="font-size: 1.1em;">Don't have an account? <a href="login.html">Log in</a>- </div>- </form>- </div>--- </div>- </div>-- <img src="svg/bottom.svg" class="bgbottom">- </div>-- <script src="js/arrows.js"></script>- <script src="js/validate_hero.js"></script>-- </body>- <html>F diff --git a/index.php b/index.php new file mode 100644 --- /dev/null +++ b/index.php+ <?php+ session_start();+ ?>+ <!DOCTYPE html>+ <html>+ <head>+ <meta charset="utf-8">+ <title>shady file upload</title> <link rel="stylesheet" type="text/css" href="css/style.css">+ </head>++ <body>+ <div class="overlay" style="height: 100%;">+ <div class="vert2">+ <div id="header">+ <p class="logo">shady_file_upload</p>++ <div style="flex: 1 0 0;"></div>+ <ul id="topmenu">++ <?php if (array_key_exists("username", $_SESSION)) { ?>++ <li><?php echo $_SESSION['username'];?></li>+ <li onclick="window.location.href='/php/logout.php'">Sign out</li>++ <?php } else {?>++ <li onclick="showLogin(false)">Sign up</li>+ <li onclick="showLogin(true)">Log in</li>++ <?php }?>+ </ul>++ </div>++ <div id="page">++ <?php+ if (array_key_exists("username", $_SESSION)) {+ require_once("loggedin.php");+ } else {+ require_once("loginregister.php");+ }+ ?>++ </div>+ </div>+ <img src="svg/bottom.svg" class="bgbottom">+ </div>+ </body>+ <html>F diff --git a/js/arrows.js b/js/arrows.js deleted file mode 100644 --- a/js/arrows.js +++ /dev/null-- arrows = [];-- const minSpeed = 3;- const maxSpeed = 8;- const delay = 1500;- const lifetime = 20000;-- function make_arrow() {- const svg = document.getElementById("protoarrow").cloneNode();- svg.style.left = Math.random() * 100 + '%';- svg.style.display = 'block';- document.getElementById('arrows').append(svg);- const ob = {- y: -800,- svg: svg,- speed: Math.random() * (maxSpeed - minSpeed) + minSpeed- };- arrows.push(ob);- setTimeout(make_arrow, delay);- setTimeout(() => {- svg.remove();- arrows.shift();- }, lifetime);- }-- function update() {- for (const arrow of arrows) {- arrow.y += arrow.speed;- arrow.svg.style.bottom = arrow.y + 'px';- }-- window.requestAnimationFrame(update);- }-- make_arrow();- update();F diff --git a/js/validate_hero.js b/js/validate_hero.js deleted file mode 100644 --- a/js/validate_hero.js +++ /dev/null-- function clear_hero_errors()- {- let errors = document.getElementsByClassName("hero_form_error");- let i;- for (i = 0; i < errors.length; i++)- {- errors[i].hidden = true;- }- }- function validate_hero_login_form()- {- let username=document.forms["hero_form"]["username"].value;- let flag=true;- clear_hero_errors();-- if(username.length==0)- {- document.getElementById("username-length-error").hidden=false;- flag=false;- }- document.activeElement.blur();- return flag;- }- function validate_hero_form()- {- let username=document.forms["hero_form"]["username"].value;- let email=document.forms["hero_form"]["email"].value;- let password=document.forms["hero_form"]["password"].value;- let password2=document.forms["hero_form"]["password2"].value;-- let flag=true;- clear_hero_errors();-- if(username.length==0)- {- document.getElementById("username-length-error").hidden=false;- flag=false;- }- if(!email.match(/\S+@\S+/))- {- document.getElementById("email-error").hidden=false;- flag=false;- }- if(password.length==0)- {- document.getElementById("password-length-error").hidden=false;- flag=false;- }- if(password !== password2)- {- document.getElementById("password-match-error").hidden=false;- flag=false;- }- document.activeElement.blur();- return flag;-- }F diff --git a/loggedin.php b/loggedin.php new file mode 100644 --- /dev/null +++ b/loggedin.php+ <div>+ <div class="filesystem">++ <h2>+ <div class="path">+ <a class="pathentry" href="#"> <?php echo $_SESSION['username'] ?>'s files/</a><a class="pathentry" href="#">foo/</a><a class="pathentry" href="#">bar</a></div>+ <input type="button" value="New Folder">+ </h2>++ <div class="files">+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ <div class="file">+ <img src="/mimeicons/application-pdf.png">+ <div class="filename">asdf</div>+ </div>+ </div>+ </div>+++ </div>+++F diff --git a/login.html b/login.html deleted file mode 100644 --- a/login.html +++ /dev/null- <!DOCTYPE html>- <html>- <head>- <meta charset="utf-8">- <title>shady file upload</title>- <link rel="stylesheet" type="text/css" href="css/style.css">- </head>-- <body>- <div class="overlay" style="height: 100%;">- <div class="vert2">- <div id="header">- <p class="logo">shady_file_upload</p>- </div>-- <div id="page">- <div id="hero" class="overlay">- <div id="arrows">- <img src="svg/arrow.svg" id="protoarrow" style="display: none">- </div>-- <div class="vcenter">- <p>file upload service</p>- <p class="big">that <span class="blue">just about works</span></p>- <p>most of the time</p>- </div>- </div>-- <div class="vcenter">- <form name="hero_form" action="/php/login.php" method="post" onsubmit="return validate_hero_login_form()">- <h2>Login</h2>- <div class="content">- <p>Username</p>- <input type="text" id="username" name="username">- <p id="username-length-error" class="hero_form_error" hidden>Please enter a username</p>- <p>Password</p>- <input type="password" id="password" name="password">- <input type="submit" value="Login">- <p style="font-size: 1.1em;">Already have an account? <a href="index.html">Sign up</a>- </div>- </form>- </div>--- </div>- </div>-- <img src="svg/bottom.svg" class="bgbottom">- </div>-- <script src="js/arrows.js"></script>- <script src="js/validate_hero.js"></script>-- </body>- <html>F diff --git a/loginregister.js b/loginregister.js new file mode 100644 --- /dev/null +++ b/loginregister.js+ arrows = [];++ const minSpeed = 3;+ const maxSpeed = 8;+ const delay = 1500;+ const lifetime = 20000;++ function make_arrow() {+ const svg = document.getElementById("protoarrow").cloneNode();+ svg.style.left = Math.random() * 100 + '%';+ svg.style.display = 'block';+ document.getElementById('arrows').append(svg);+ const ob = {+ y: -800,+ svg: svg,+ speed: Math.random() * (maxSpeed - minSpeed) + minSpeed+ };+ arrows.push(ob);+ setTimeout(make_arrow, delay);+ setTimeout(() => {+ svg.remove();+ arrows.shift();+ }, lifetime);+ }++ function update() {+ for (const arrow of arrows) {+ arrow.y += arrow.speed;+ arrow.svg.style.bottom = arrow.y + 'px';+ }++ window.requestAnimationFrame(update);+ }++ make_arrow();+ update();+++++ function clear_hero_errors()+ {+ let errors = document.getElementsByClassName("hero_form_error");+ for (let i = 0; i < errors.length; i++)+ {+ errors[i].hidden = true;+ }+ }+ function validate_hero_login_form()+ {+ let username=document.forms["login_form"]["username"].value;+ let flag=true;+ clear_hero_errors();++ if(username.length==0)+ {+ document.getElementById("username-length-error").hidden=false;+ flag=false;+ }+ document.activeElement.blur();+ return flag;+ }+ function validate_hero_form()+ {+ let username=document.forms["register_form"]["username"].value;+ let email=document.forms["register_form"]["email"].value;+ let password=document.forms["register_form"]["password"].value;+ let password2=document.forms["register_form"]["password2"].value;++ let flag=true;+ clear_hero_errors();++ if(username.length==0)+ {+ document.getElementById("username-length-error").hidden=false;+ flag=false;+ }+ if(!email.match(/\S+@\S+/))+ {+ document.getElementById("email-error").hidden=false;+ flag=false;+ }+ if(password.length==0)+ {+ document.getElementById("password-length-error").hidden=false;+ flag=false;+ }+ if(password !== password2)+ {+ document.getElementById("password-match-error").hidden=false;+ flag=false;+ }+ document.activeElement.blur();+ return flag;++ }++ function showLogin(l) {+ document.getElementById("loginform").style.display = l ? "flex" : "none";+ document.getElementById("signupform").style.display = l ? "none" : "flex";+ }F diff --git a/loginregister.php b/loginregister.php new file mode 100644 --- /dev/null +++ b/loginregister.php+ <div id="hero" class="overlay">+ <div id="arrows">+ <img src="svg/arrow.svg" id="protoarrow" style="display: none">+ </div>++ <div class="vcenter">+ <p>file upload service</p>+ <p class="big">that <span class="blue">just about works</span></p>+ <p>most of the time</p>+ </div>+ </div>++ <div class="vcenter" id="signupform">+ <form name="register_form" action="/php/register.php" method="post" onsubmit="return validate_hero_form()">+ <h2>Get started</h2>+ <div class="content">+ <p>Username</p>+ <input type="text" id="username" name="username">+ <p id="username-length-error" class="hero_form_error" hidden>Please specify a username</p>++ <p>Email address</p>+ <input type="text" id="email" name="email">+ <p id="email-error" class="hero_form_error" hidden>Invalid email address</p>++ <p>Password</p>+ <input type="password" id="password" name="password">+ <p id="password-length-error" class="hero_form_error" hidden>Please provide a password</p>++ <p>Repeat Password</p>+ <input type="password" id="password2" name="password2">+ <p id="password-match-error" class="hero_form_error" hidden>Passwords didn't match</p>+ <input type="submit" value="Sign up">+ <p style="font-size: 1.1em;">Already have an account? <a href="#" onclick="showLogin(true)">Log in</a>+ </div>+ </form>+ </div>++ <div class="vcenter" id="loginform">+ <form name="login_form" action="/php/login.php" method="post" onsubmit="return validate_hero_login_form()">+ <h2>Login</h2>+ <div class="content">+ <p>Username</p>+ <input type="text" id="username" name="username">+ <p id="username-length-error" class="hero_form_error" hidden>Please enter a username</p>+ <p>Password</p>+ <input type="password" id="password" name="password">+ <input type="submit" value="Login">+ <p style="font-size: 1.1em;">Don't have an account? <a href="#" onclick="showLogin(false)">Sign up</a>+ </div>+ </form>+ </div>++ <script src="loginregister.js"></script>F diff --git a/mimeicons/application-octet-stream.png b/mimeicons/application-octet-stream.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-octet-stream.png differF diff --git a/mimeicons/application-pdf.png b/mimeicons/application-pdf.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-pdf.png differF diff --git a/mimeicons/application-rss_xml.png b/mimeicons/application-rss_xml.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-rss_xml.png differF diff --git a/mimeicons/application-x-bittorrent.png b/mimeicons/application-x-bittorrent.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-x-bittorrent.png differF diff --git a/mimeicons/application-x-cd-image.png b/mimeicons/application-x-cd-image.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-x-cd-image.png differF diff --git a/mimeicons/application-x-executable.png b/mimeicons/application-x-executable.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-x-executable.png differF diff --git a/mimeicons/application-x-object.png b/mimeicons/application-x-object.png new file mode 100644B Binary files /dev/null and b/mimeicons/application-x-object.png differF diff --git a/mimeicons/audio-x-generic.png b/mimeicons/audio-x-generic.png new file mode 100644B Binary files /dev/null and b/mimeicons/audio-x-generic.png differF diff --git a/mimeicons/font-x-generic.png b/mimeicons/font-x-generic.png new file mode 100644B Binary files /dev/null and b/mimeicons/font-x-generic.png differF diff --git a/mimeicons/image-x-generic.png b/mimeicons/image-x-generic.png new file mode 100644B Binary files /dev/null and b/mimeicons/image-x-generic.png differF diff --git a/mimeicons/package-x-generic.png b/mimeicons/package-x-generic.png new file mode 100644B Binary files /dev/null and b/mimeicons/package-x-generic.png differF diff --git a/mimeicons/text-html.png b/mimeicons/text-html.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-html.png differF diff --git a/mimeicons/text-vnd.trolltech.linguist.png b/mimeicons/text-vnd.trolltech.linguist.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-vnd.trolltech.linguist.png differF diff --git a/mimeicons/text-x-changelog.png b/mimeicons/text-x-changelog.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-changelog.png differF diff --git a/mimeicons/text-x-chdr.png b/mimeicons/text-x-chdr.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-chdr.png differF diff --git a/mimeicons/text-x-cpp.png b/mimeicons/text-x-cpp.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-cpp.png differF diff --git a/mimeicons/text-x-csrc.png b/mimeicons/text-x-csrc.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-csrc.png differF diff --git a/mimeicons/text-x-css.png b/mimeicons/text-x-css.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-css.png differF diff --git a/mimeicons/text-x-generic.png b/mimeicons/text-x-generic.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-generic.png differF diff --git a/mimeicons/text-x-go.png b/mimeicons/text-x-go.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-go.png differF diff --git a/mimeicons/text-x-javascript.png b/mimeicons/text-x-javascript.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-javascript.png differF diff --git a/mimeicons/text-x-preview.png b/mimeicons/text-x-preview.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-preview.png differF diff --git a/mimeicons/text-x-python.png b/mimeicons/text-x-python.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-python.png differF diff --git a/mimeicons/text-x-script.png b/mimeicons/text-x-script.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-script.png differF diff --git a/mimeicons/text-x-vala.png b/mimeicons/text-x-vala.png new file mode 100644B Binary files /dev/null and b/mimeicons/text-x-vala.png differF diff --git a/mimeicons/video-x-generic.png b/mimeicons/video-x-generic.png new file mode 100644B Binary files /dev/null and b/mimeicons/video-x-generic.png differF diff --git a/mimeicons/x-office-calendar.png b/mimeicons/x-office-calendar.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-calendar.png differF diff --git a/mimeicons/x-office-document-template.png b/mimeicons/x-office-document-template.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-document-template.png differF diff --git a/mimeicons/x-office-document.png b/mimeicons/x-office-document.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-document.png differF diff --git a/mimeicons/x-office-drawing-template.png b/mimeicons/x-office-drawing-template.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-drawing-template.png differF diff --git a/mimeicons/x-office-drawing.png b/mimeicons/x-office-drawing.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-drawing.png differF diff --git a/mimeicons/x-office-presentation-template.png b/mimeicons/x-office-presentation-template.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-presentation-template.png differF diff --git a/mimeicons/x-office-presentation.png b/mimeicons/x-office-presentation.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-presentation.png differF diff --git a/mimeicons/x-office-spreadsheet-template.png b/mimeicons/x-office-spreadsheet-template.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-spreadsheet-template.png differF diff --git a/mimeicons/x-office-spreadsheet.png b/mimeicons/x-office-spreadsheet.png new file mode 100644B Binary files /dev/null and b/mimeicons/x-office-spreadsheet.png differF diff --git a/php/configuration.php b/php/configuration.php --- a/php/configuration.php +++ b/php/configuration.php$domain_name="localhost";+ <<<<<<< HEAD+ =======+ if (file_exists("/home/alex")) {+ $database_name="alex";+ $database_username="alex";+ $database_password="lol";+ $database_location="127.0.0.1";+ >>>>>>> f1cd0085cd8dba8b25818fc998d315b28e6c13a5++ $storage_root = "/home/alex/fileup_storage";+ }+ else {+$database_name="fileup_testing";$database_username="outsider";$database_password="parola123";$database_location="localhost";+ $storage_root = "/tmp/fileup_storage";+ }$password_hash_algo=PASSWORD_BCRYPT;-$has_email_verification=false;?>F diff --git a/php/database.php b/php/database.php --- a/php/database.php +++ b/php/database.phpglobal $database_username;global $database_password;global $database_location;- try- {+$this->pdo=new PDO("mysql:dbname={$database_name};host={$database_location}",$database_username,$database_password);- }catch(PDOException $e)- {- error_log("Could not get database {$database_name} from {$database_location}, {$e} ");- die("The cow bought the farm");- }}/*returns false if this isn't a user, otherwise returns the user*/F diff --git a/php/login.php b/php/login.php --- a/php/login.php +++ b/php/login.phprequire_once "database.php";require_once "misc.php";+ session_start();+$username=$_POST["username"];$password=$_POST["password"];/*server side verification*/die("Password or username is incorrect");}- echo "Username: {$user->username}\n";- echo "Email: {$user->email_address}";-+ $_SESSION['username'] = $user->username;+ header('Location: /');?>F diff --git a/php/logout.php b/php/logout.php new file mode 100644 --- /dev/null +++ b/php/logout.php+ <?php+ // TODO+ // This is dangerous and stupid+ // Right now every webpage can redirect any of its users to http://shady.upload/logout+ // which will log the user out of our webpage++ session_start();+ unset($_SESSION['username']);+ header('Location: /');+ ?>F diff --git a/php/misc.php b/php/misc.php --- a/php/misc.php +++ b/php/misc.php<?phprequire_once "user.php";- function validate_credentials(string $username,string $email,string $password,string $password2) : bool- {- return true;- }-function generate_email_verification_link(){/*TODO*/F diff --git a/php/register.php b/php/register.php --- a/php/register.php +++ b/php/register.php$password2=$_POST["password2"];$email=$_POST["email"];++ function validate_credentials(string $username,string $email,string $password,string $password2) : bool+ {+ return true;+ }++/*check if we are given shady credentials*/if(!validate_credentials($username,$email,$password,$password2)){echo "didn't register";}++ $_SESSION['username'] = $username;+ header('Location: /');+?>F diff --git a/php/upload.php b/php/upload.php --- a/php/upload.php +++ b/php/upload.phpexit();}-$file = $_FILES['uf'];