Compare commits
20 commits
Author | SHA1 | Date | |
---|---|---|---|
5ac9bce74b | |||
949cf74a31 | |||
26ae559037 | |||
c60fb18003 | |||
a0652f93c6 | |||
c929cdceb1 | |||
1f6176de2e | |||
8906579a63 | |||
c66a8ae60e | |||
be4063d9d5 | |||
8e9ed6bac8 | |||
099850f750 | |||
e9f02f3ee0 | |||
dad35afd6d | |||
9ec7e0001f | |||
b65fee9d5d | |||
610a8853bb | |||
0a19ee5c33 | |||
0ec60694c7 | |||
11e8cc5ad5 |
8 changed files with 150 additions and 121 deletions
|
@ -1,90 +0,0 @@
|
|||
use postgres::{Client, NoTls};
|
||||
|
||||
pub fn Login(Username: &str, Password: &str) -> Result<Vec<String>, Box<dyn std::error::Error>>{
|
||||
let mut Client = Client::connect("host=/var/run/postgresql,localhost user=postgres password=Password dbname=ActivityPub", NoTls)?;
|
||||
|
||||
let Table = Client.query("SELECT 1
|
||||
FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_TYPE='BASE TABLE'
|
||||
AND TABLE_NAME='person'", &[]);
|
||||
// Check if the table doesn't exists. Or does?
|
||||
match Table {
|
||||
Ok(_) => {
|
||||
// Check if the table exists.
|
||||
if Table?.len() == 0 {
|
||||
Client.batch_execute("
|
||||
CREATE TABLE person (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username TEXT NOT NULL,
|
||||
password TEXT NOT NULL
|
||||
)")?;
|
||||
}
|
||||
},
|
||||
Err(_) => ()
|
||||
}
|
||||
if Client.query("SELECT username, password FROM person WHERE username = $1", &[&Username])?.len() != 0 {
|
||||
let mut Response: Vec<String> = Vec::new();
|
||||
if Client.query("SELECT username, password FROM person WHERE password = $1", &[&Password])?.len() != 0 {
|
||||
let Result = Client.query("SELECT username, password FROM person WHERE password = $1", &[&Password])?[0].clone();
|
||||
Response.push(Result.get(0));
|
||||
Response.push(Result.get(1));
|
||||
return Ok(Response);
|
||||
} else {
|
||||
return Ok(vec!["Password Not Correct.".to_string()]);
|
||||
}
|
||||
} else {
|
||||
return Ok(vec!["Username Not Found.".to_string()]);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn GetAccountWithID(ID: i32) -> Result<String, Box<dyn std::error::Error>>{
|
||||
let mut Client = Client::connect("host=/var/run/postgresql,localhost user=postgres password=Password dbname=ActivityPub", NoTls)?;
|
||||
|
||||
let Table = Client.query("SELECT 1
|
||||
FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_TYPE='BASE TABLE'
|
||||
AND TABLE_NAME='person'", &[]);
|
||||
// Check if the table doesn't exists. Or does?
|
||||
match Table {
|
||||
Ok(_) => {
|
||||
// Check if the table exists.
|
||||
if Table?.len() == 0 {
|
||||
Client.batch_execute("
|
||||
CREATE TABLE person (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username TEXT NOT NULL,
|
||||
password TEXT NOT NULL
|
||||
)")?;
|
||||
}
|
||||
},
|
||||
Err(_) => ()
|
||||
}
|
||||
let Result: String = Client.query("SELECT username FROM person WHERE id = $1", &[&ID]).unwrap()[0].get(0);
|
||||
return Ok(Result.to_string());
|
||||
}
|
||||
|
||||
pub fn MakeAccount(User: String, Pass: String) -> Result<String, Box<dyn std::error::Error>>{
|
||||
let mut Client = Client::connect("host=/var/run/postgresql,localhost user=postgres password=Password dbname=ActivityPub", NoTls)?;
|
||||
|
||||
let Table = Client.query("SELECT 1
|
||||
FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_TYPE='BASE TABLE'
|
||||
AND TABLE_NAME='person'", &[]);
|
||||
// Check if the table doesn't exists. Or does?
|
||||
match Table {
|
||||
Ok(_) => {
|
||||
// Check if the table exists.
|
||||
if Table?.len() == 0 {
|
||||
Client.batch_execute("
|
||||
CREATE TABLE person (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username TEXT NOT NULL,
|
||||
password TEXT NOT NULL
|
||||
)")?;
|
||||
}
|
||||
},
|
||||
Err(_) => ()
|
||||
}
|
||||
Client.execute("INSERT INTO person (username, password) VALUES ($1, $2)", &[&User, &Pass])?;
|
||||
return Ok("Account Created!".to_string());
|
||||
}
|
54
src/Extra/mod.rs
Normal file
54
src/Extra/mod.rs
Normal file
|
@ -0,0 +1,54 @@
|
|||
use postgres::{Client, NoTls};
|
||||
|
||||
fn CheckTableIsHere(Table: &str) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let mut Client = Client::connect("host=/var/run/postgresql,localhost user=postgres password=Password dbname=ActivityPub", NoTls)?;
|
||||
|
||||
let LeTable = Client.query("SELECT 1
|
||||
FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_TYPE='BASE TABLE'
|
||||
AND TABLE_NAME=$1", &[&Table]);
|
||||
|
||||
// Check if the table exists.
|
||||
if LeTable.unwrap().len() == 0 {
|
||||
let TempString = "CREATE TABLE ".to_string() + &Table.to_string() + " (id SERIAL PRIMARY KEY, username TEXT NOT NULL, password TEXT NOT NULL)";
|
||||
Client.batch_execute(&TempString)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn Signin(Username: &str, Password: &str) -> Result<Vec<String>, Box<dyn std::error::Error>>{
|
||||
let _ = CheckTableIsHere("person");
|
||||
|
||||
let mut Client = Client::connect("host=/var/run/postgresql,localhost user=postgres password=Password dbname=ActivityPub", NoTls)?;
|
||||
|
||||
// Check to see if the username or password is incorrect.
|
||||
if Client.query("SELECT username, password FROM person WHERE username = $1", &[&Username])?.len() != 0 {
|
||||
let mut Response: Vec<String> = Vec::new();
|
||||
if Client.query("SELECT username, password FROM person WHERE password = $1", &[&Password])?.len() != 0 {
|
||||
let Result = Client.query("SELECT username, password FROM person WHERE password = $1", &[&Password])?[0].clone();
|
||||
Response.push(Result.get(0));
|
||||
Response.push(Result.get(1));
|
||||
return Ok(Response);
|
||||
} else {
|
||||
return Ok(vec!["Password Not Correct.".to_string()]);
|
||||
}
|
||||
} else {
|
||||
return Ok(vec!["Username Not Found.".to_string()]);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn Signup(Username: &str, Password: &str) -> Result<Vec<String>, Box<dyn std::error::Error>>{
|
||||
let _ = CheckTableIsHere("person");
|
||||
|
||||
let mut Client = Client::connect("host=/var/run/postgresql,localhost user=postgres password=Password dbname=ActivityPub", NoTls)?;
|
||||
|
||||
if Client.query("SELECT username, password FROM person WHERE username = $1", &[&Username])?.len() == 0 {
|
||||
let mut Response: Vec<String> = Vec::new();
|
||||
Client.execute("INSERT INTO person (username, password) VALUES ($1, $2)", &[&Username, &Password])?;
|
||||
Response.push((&Username).to_string());
|
||||
Response.push((&Password).to_string());
|
||||
return Ok(Response);
|
||||
} else {
|
||||
return Ok(vec!["Username Already Taken.".to_string()]);
|
||||
}
|
||||
}
|
|
@ -10,8 +10,6 @@
|
|||
<h1>Hello!</h1>
|
||||
<p>Hi from Rust.</p>
|
||||
<a href="/Profile">View your profile.</a>
|
||||
|
||||
<script src="script.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
</head>
|
||||
<body>
|
||||
<h1>Profile!</h1>
|
||||
<p id="Account">Log in. Or don't. Up to you.</p>
|
||||
|
||||
<form action="" method="get">
|
||||
<p id="Account">Sign in. Or don't. Up to you.</p>
|
||||
<a href="/Profile/Signup">Sign Up!</a>
|
||||
<form action="" method="GET" id="Login">
|
||||
<div>
|
||||
<label>Username</label>
|
||||
<input type="text" name="Username" required />
|
||||
|
@ -20,13 +20,13 @@
|
|||
<input type="text" name="Password" required />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" value="Log on" />
|
||||
<input type="submit" value="Sign In" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<p id="Information"></p>
|
||||
|
||||
<script src="profile.js"></script>
|
||||
<script src="/profile.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -2,7 +2,7 @@ let Infomation = document.getElementById("Information");
|
|||
let Account = document.getElementById("Account");
|
||||
|
||||
let req = new XMLHttpRequest();
|
||||
req.open('GET', document.location, true);
|
||||
req.open('GET', document.location.href + "&Verify=true", true);
|
||||
req.send(null);
|
||||
req.onload = function() {
|
||||
let headers = req.getAllResponseHeaders();
|
||||
|
|
32
src/HTTP/signup.html
Normal file
32
src/HTTP/signup.html
Normal file
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="icon" href="/favicon.ico" type="image/webp" />
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<title>Profile</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Profile!</h1>
|
||||
<p id="Account">Sign Up. Or don't. Up to you.</p>
|
||||
<a href="/Profile">Sign In!</a>
|
||||
<form action="" method="GET" id="Signup">
|
||||
<div>
|
||||
<label>Username</label>
|
||||
<input type="text" name="Username" required />
|
||||
</div>
|
||||
<div>
|
||||
<label>Password</label>
|
||||
<input type="text" name="Password" required />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" value="Sign Up" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<p id="Information"></p>
|
||||
|
||||
<script src="/signup.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
26
src/HTTP/signup.js
Normal file
26
src/HTTP/signup.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
let Infomation = document.getElementById("Information");
|
||||
let Account = document.getElementById("Account");
|
||||
|
||||
let req = new XMLHttpRequest();
|
||||
req.open('GET', document.location.href + "&Verify=true", true);
|
||||
req.send(null);
|
||||
req.onload = function() {
|
||||
let headers = req.getAllResponseHeaders();
|
||||
const arr = headers.trim().split(/[\r\n]+/);
|
||||
|
||||
// Create a map of header names to values
|
||||
const headerMap = new Map();
|
||||
arr.forEach((line) => {
|
||||
const parts = line.split(": ");
|
||||
headerMap.set(parts[0], parts[1]);
|
||||
});
|
||||
|
||||
if (headerMap.get("profile") != null) {
|
||||
if (headerMap.get("profile") == "Username Already Taken.") {
|
||||
Infomation.innerHTML = "Username already taken! Please use a different username.";
|
||||
} else {
|
||||
Account.innerHTML = headerMap.get("profile");
|
||||
Infomation.innerHTML = "Account Created! Please head back to the sign in to... sign in.";
|
||||
}
|
||||
}
|
||||
};
|
55
src/main.rs
55
src/main.rs
|
@ -1,12 +1,11 @@
|
|||
#![allow(non_snake_case)]
|
||||
#![allow(unused_braces)]
|
||||
use rouille::{post_input, try_or_400, router, Response};
|
||||
use rouille::{router, Response};
|
||||
use std::fs::File;
|
||||
mod ActivityPub;
|
||||
mod API;
|
||||
mod Extra;
|
||||
|
||||
fn main(){
|
||||
|
||||
// Never leave the server. CTRL + C if you have issues.
|
||||
rouille::start_server("127.0.0.1:8080", move |Request| {
|
||||
// Router. Go to the correct pages, else hit the sack.
|
||||
|
@ -16,35 +15,42 @@ fn main(){
|
|||
Response::from_file("text/html", File::open("src/HTTP/index.html").unwrap()).with_status_code(200)
|
||||
},
|
||||
(GET) ["/Profile"] => {
|
||||
// Signing in.
|
||||
let Username = Request.get_param("Username");
|
||||
let Password = Request.get_param("Password").unwrap();
|
||||
let Password = Request.get_param("Password");
|
||||
let Verify = Request.get_param("Verify");
|
||||
match Verify {
|
||||
Some(x) => (),
|
||||
None => return Response::from_file("text/html", File::open("src/HTTP/profile.html").unwrap()).with_status_code(200),
|
||||
}
|
||||
match Username {
|
||||
Some(x) => {
|
||||
let Account: Vec<String> = API::Login(&x, &Password).unwrap();
|
||||
let Account: Vec<String> = Extra::Signin(&x, &Password.unwrap()).unwrap();
|
||||
Response::from_file("text/html", File::open("src/HTTP/profile.html").unwrap()).with_status_code(200).with_additional_header("profile", Account[0].clone())
|
||||
},
|
||||
None => {
|
||||
Response::from_file("text/html", File::open("src/HTTP/profile.html").unwrap()).with_status_code(200)
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
// API stuff.
|
||||
(GET) ["/API/Profile:Get"] => {
|
||||
// Content-type: application/x-www-form-urlencoded
|
||||
let Profile = Request.get_param("id").unwrap().parse::<i32>().unwrap();
|
||||
let Things = API::GetAccountWithID(Profile).unwrap();
|
||||
let Text: String = "Got Account: ".to_string() + &Things.to_string();
|
||||
Response::text(Text).with_status_code(200)
|
||||
},
|
||||
(POST) ["/API/Profile:Create"] => {
|
||||
// Content-type: application/x-www-form-urlencoded
|
||||
let Profile = try_or_400!(post_input!(Request, {
|
||||
Username: String,
|
||||
Password: String,
|
||||
}));
|
||||
let Things = API::MakeAccount(Profile.Username.to_string(), Profile.Password.to_string()).unwrap();
|
||||
let Text: String = Things.to_string();
|
||||
Response::text(Text).with_status_code(201)
|
||||
(GET) ["/Profile/Signup"] => {
|
||||
// Signing up.
|
||||
let Username = Request.get_param("Username");
|
||||
let Password = Request.get_param("Password");
|
||||
let Verify = Request.get_param("Verify");
|
||||
match Verify {
|
||||
Some(x) => (),
|
||||
None => return Response::from_file("text/html", File::open("src/HTTP/signup.html").unwrap()).with_status_code(200),
|
||||
}
|
||||
match Username {
|
||||
Some(x) => {
|
||||
let Account: Vec<String> = Extra::Signup(&x, &Password.unwrap()).unwrap();
|
||||
Response::from_file("text/html", File::open("src/HTTP/signup.html").unwrap()).with_status_code(200).with_additional_header("profile", Account[0].clone())
|
||||
},
|
||||
None => {
|
||||
Response::from_file("text/html", File::open("src/HTTP/signup.html").unwrap()).with_status_code(200)
|
||||
},
|
||||
}
|
||||
},
|
||||
// Get specific images. Because the browser said so.
|
||||
(GET) ["/favicon.ico"] => {
|
||||
|
@ -56,6 +62,9 @@ fn main(){
|
|||
(GET) ["/profile.js"] => {
|
||||
Response::from_file("text/javascript", File::open("src/HTTP/profile.js").unwrap()).with_status_code(200)
|
||||
},
|
||||
(GET) ["/signup.js"] => {
|
||||
Response::from_file("text/javascript", File::open("src/HTTP/signup.js").unwrap()).with_status_code(200)
|
||||
},
|
||||
// Catch-all. Fuck you.
|
||||
_ => {
|
||||
Response::from_file("text/html", File::open("src/HTTP/404.html").unwrap()).with_status_code(404)
|
||||
|
|
Loading…
Add table
Reference in a new issue