196 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable file
		
	
	
	
	
| <?php
 | |
| if(count(get_included_files()) ==1) {
 | |
| 	http_response_code(403);
 | |
| 	die("403: Forbidden");
 | |
| }
 | |
| class DataBase extends SQLite3 {
 | |
| 	function __construct() {
 | |
| 		$this->open('database.db');
 | |
| 		$this->exec('PRAGMA foreign_keys=ON;');
 | |
| 		$this->exec('PRAGMA full_column_names=ON;');
 | |
| 		$this->exec('PRAGMA short_column_names=OFF;');
 | |
| 		
 | |
| 		$sql = "
 | |
| 			CREATE TABLE IF NOT EXISTS users (
 | |
| 			id	INTEGER	PRIMARY KEY	UNIQUE,
 | |
| 			pass	TEXT,
 | |
| 			email	TEXT	UNIQUE,
 | |
| 			handle	TEXT	NOT NULL	UNIQUE,
 | |
| 			name	TEXT	NOT NULL,
 | |
| 			about	TEXT
 | |
| 			);
 | |
| 
 | |
| 			CREATE TABLE IF NOT EXISTS personas (
 | |
| 			id	INTEGER	PRIMARY KEY	UNIQUE,
 | |
| 			userid	INTEGER	NOT NULL,
 | |
| 			handle	TEXT	NOT NULL,
 | |
| 			name	TEXT	NOT NULL,
 | |
| 			about	TEXT,
 | |
| 			colour	INTEGER,
 | |
| 			FOREIGN KEY (userid) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
 | |
| 			UNIQUE (userid, handle)
 | |
| 			);
 | |
| 
 | |
| 			CREATE TABLE IF NOT EXISTS posts (
 | |
| 			id	INTEGER	PRIMARY KEY	UNIQUE,
 | |
| 			time	INTEGER	NOT NULL,
 | |
| 			userid	INTEGER	NOT NULL,
 | |
| 			personaid INTEGER NOT NULL,
 | |
| 			text	TEXT	NOT NULL,
 | |
| 			FOREIGN KEY (userid) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
 | |
| 			FOREIGN KEY (personaid) REFERENCES personas(id) ON UPDATE CASCADE ON DELETE CASCADE
 | |
| 			);
 | |
| 
 | |
| 			CREATE TABLE IF NOT EXISTS comments (
 | |
| 			id	INTEGER	PRIMARY KEY	UNIQUE,
 | |
| 			time	INTEGER	NOT NULL,
 | |
| 			userid	INTEGER	NOT NULL,
 | |
| 			personaid INTEGER,
 | |
| 			postid	INTEGER	NOT NULL,
 | |
| 			text	TEXT	NOT NULL,
 | |
| 			FOREIGN KEY (postid) REFERENCES posts(id),
 | |
| 			FOREIGN KEY (userid) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE,
 | |
| 			FOREIGN KEY (personaid) REFERENCES personas(id) ON UPDATE CASCADE ON DELETE CASCADE
 | |
| 			);
 | |
| 
 | |
| 			CREATE TABLE IF NOT EXISTS tokens (
 | |
| 			id	INTEGER	PRIMARY KEY	AUTOINCREMENT	UNIQUE,
 | |
| 			userid	INTEGER	NOT NULL,
 | |
| 			token	TEXT	NOT NULL	UNIQUE,
 | |
| 			lastuse	TEXT	NOT NULL,
 | |
| 			expires	TEXT	NOT NULL,
 | |
| 			FOREIGN KEY (userid) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE
 | |
| 			);
 | |
| 
 | |
| 			INSERT OR IGNORE INTO users (id, handle, name, about) VALUES ('0', 'SYSTEM', 'SYSTEM', 'SYSTEM');
 | |
| 
 | |
| 		";
 | |
| 		
 | |
| 		$ret = $this->exec($sql);
 | |
| 		
 | |
| 	}
 | |
| 	
 | |
| 	function addUser($handle, $name, $about=NULL) {
 | |
| 		$id = hexdec(uniqid());
 | |
| 		$sql = "INSERT INTO users (id, handle, name, about) VALUES ('$id', '$handle', '$name', '$about')";
 | |
| 		$ret = $this->exec($sql);
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function getUserByHandle($handle) {
 | |
| 		$handle = $this->escapeString($handle);
 | |
| 		$sql = "SELECT * FROM users AS user WHERE handle='$handle';";
 | |
| 		$ret = $this->query($sql)->fetchArray(SQLITE3_ASSOC);
 | |
| 		if(!$ret) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	}
 | |
| 
 | |
| 	function addPost($text, $userid=NULL, $personaid=NULL) {
 | |
| 		$id = hexdec(uniqid());
 | |
| 		$time = time();
 | |
| 		$sql = $this->prepare("INSERT INTO posts (id, time, userid, personaid, text) values ('$id', '$time', '$userid', :personaid, '$text')");
 | |
| 		$sql->bindParam(':personaid', $personaid, SQLITE3_INTEGER);
 | |
| 		$ret = $sql->execute();
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function addPersona($userid, $handle, $name, $about=NULL, $colour=NULL) {
 | |
| 		$id = hexdec(uniqid());
 | |
| 		$sql = "INSERT INTO personas (id, userid, handle, name, colour) VALUES ('$id', '$userid', '$handle', '$about', '$colour');";
 | |
| 		$ret = $this->exec($sql);
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function passwordSet($userid, $password=NULL) {
 | |
| 		$hash = empty($password) ? NULL : password_hash($password, PASSWORD_DEFAULT);
 | |
| 		$sql = "UPDATE USERS SET pass='$hash' WHERE id='$userid';";
 | |
| 		$ret = $this->exec($sql);
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function passwordVerify($userid, $password) {
 | |
| 		$sql = "SELECT pass FROM users WHERE id='$userid';";
 | |
| 		$ret = $this->query($sql)->fetchArray(SQLITE3_NUM);
 | |
| 		if(!$ret) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		$dbhash = $ret[0];
 | |
| 		return password_verify($password, $dbhash);
 | |
| 	}
 | |
| 
 | |
| 	function tokenGen() {
 | |
| 		return random_bytes(32);
 | |
| 	}
 | |
| 	function tokenAdd($userid) {
 | |
| 		$token = $this->tokenGen();
 | |
| 		$hashed = hash('sha256', $token);
 | |
| 		$time = time();
 | |
| 		$expires = $time + 2592000; // 30 days
 | |
| 		$sql = "INSERT INTO tokens (userid, token, lastuse, expires) VALUES ('$userid', '$hashed', '$time', '$expires');";
 | |
| 		$ret = $this->exec($sql);
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 		return $token;
 | |
| 	}
 | |
| 	function tokenRefresh($tokenid) {
 | |
| 		$time = time();
 | |
| 		$expires = $time + 2592000; // 30 days
 | |
| 		$sql = "UPDATE tokens SET lastuse='$time', expires='$expires' WHERE id='$tokenid';";
 | |
| 		$ret = $this->exec($sql);
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 	}
 | |
| 	function tokenRemove($token) {
 | |
| 		$hashed = hash('sha256', $token);
 | |
| 		$sql = "DELETE FROM tokens WHERE token='$hashed';";
 | |
| 		$ret = $this->exec($sql);
 | |
| 		if(!$ret) {
 | |
| 			die($this->lastErrorMsg());
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function getAuthedUserId($token=NULL) {
 | |
| 		if (empty($token)) { 
 | |
| 			if (empty($_COOKIE['token'])) {
 | |
| 				return false;
 | |
| 			}
 | |
| 			$token = base64_decode($_COOKIE['token']);
 | |
| 		}
 | |
| 		$hashed = hash('sha256', $token);
 | |
| 		$sql = "SELECT id AS id, userid AS userid, expires AS expires FROM tokens WHERE token='$hashed';";
 | |
| 		$ret = $this->query($sql)->fetchArray(SQLITE3_ASSOC);
 | |
| 		if(!$ret) {
 | |
| 			return false;
 | |
| 		}
 | |
| 		if ($ret['expires'] < time()) {
 | |
| 			$this->tokenRemove($token);
 | |
| 			return false;
 | |
| 		}
 | |
| 		$this->tokenRefresh($ret['id']);
 | |
| 		return $ret['userid'];
 | |
| 	}
 | |
| 
 | |
| 	function getPosts($userid=NULL, $personaid = NULL) {
 | |
| 		$sql = "SELECT * FROM posts AS post LEFT JOIN users AS user ON post.userid=user.id LEFT JOIN personas AS persona ON post.personaid=persona.id;";
 | |
| 
 | |
| 		$ret = $this->query($sql);
 | |
| 		$array = array();
 | |
| 		while ($row = $ret->fetchArray(SQLITE3_ASSOC)) {
 | |
| 			array_push($array, $row);
 | |
| 		}
 | |
| 		return $array;
 | |
| 	}
 | |
| }
 | |
| ?>
 |