From f2377913f04ff54e775160d8ca055ef069531677 Mon Sep 17 00:00:00 2001 From: Richard Underwood Date: Wed, 4 Jan 2017 11:45:01 +0000 Subject: [PATCH] Changed database schema for groups & permissions. Implemented versioning. --- includes/database.inc.php | 61 +++++++++++++++++++++++++++++++++++++++ includes/misc.inc.php | 32 +++++--------------- includes/scheme.sql | 36 +++++++++++++++++++++++ includes/upgrade-0-1.sql | 5 ++++ includes/upgrade-1-2.sql | 29 +++++++++++++++++++ 5 files changed, 138 insertions(+), 25 deletions(-) create mode 100644 includes/database.inc.php create mode 100644 includes/upgrade-0-1.sql create mode 100644 includes/upgrade-1-2.sql diff --git a/includes/database.inc.php b/includes/database.inc.php new file mode 100644 index 0000000..68a6be1 --- /dev/null +++ b/includes/database.inc.php @@ -0,0 +1,61 @@ +exec($createsql); + $salt = bin2hex(openssl_random_pseudo_bytes(16)); + $db->exec("INSERT INTO users (emailaddress, password, isadmin) VALUES ('admin', '".crypt("admin", '$6$'.$salt)."', 1)"); + + return $db; +} + +function open_db() { + global $authdb, $db; + + if (!isset($db)) { + $db = new SQLite3($authdb, SQLITE3_OPEN_READWRITE); + $db->exec('PRAGMA foreign_keys = 1'); + } + + $version = intval($db->querySingle('SELECT value FROM metadata WHERE name = "version"')); + + switch($version) { + case 0: + $sql = file_get_contents('includes/upgrade-0-1.sql'); + $db->exec($sql); + writelog("Upgraded schema to version 1","system"); + // continue + case 1: // never existed + $sql = file_get_contents('includes/upgrade-1-2.sql'); + $db->exec($sql); + writelog("Upgraded schema to version 2","system"); + // continue + case $db_version: + break; + } + + return $db; +} + +function get_db() { + global $authdb, $db; + + if (!isset($db)) { + $db = new SQLite3($authdb, SQLITE3_OPEN_READWRITE); + $db->exec('PRAGMA foreign_keys = 1'); + } + + return $db; +} + +?> diff --git a/includes/misc.inc.php b/includes/misc.inc.php index 9046647..30d0d24 100644 --- a/includes/misc.inc.php +++ b/includes/misc.inc.php @@ -1,6 +1,7 @@ exec($createsql); - $salt = bin2hex(openssl_random_pseudo_bytes(16)); - $db->exec("INSERT INTO users (emailaddress, password, isadmin) VALUES ('admin', '".crypt("admin", '$6$'.$salt)."', 1)"); +if(class_exists('SQLite3')) { + if (isset($authdb) && !file_exists($authdb)) { + init_db(); + } else { + open_db(); + } } function string_starts_with($string, $prefix) @@ -84,17 +84,6 @@ function string_ends_with($string, $suffix) return (substr($string, -$length) === $suffix); } -function get_db() { - global $authdb, $db; - - if (!isset($db)) { - $db = new SQLite3($authdb, SQLITE3_OPEN_READWRITE); - $db->exec('PRAGMA foreign_keys = 1'); - } - - return $db; -} - function get_all_users() { $db = get_db(); $r = $db->query('SELECT id, emailaddress, isadmin FROM users ORDER BY emailaddress'); @@ -379,13 +368,6 @@ function writelog($line, $user=False) { try { $db = get_db(); - $q = $db->prepare('CREATE TABLE IF NOT EXISTS logs ( - id INTEGER PRIMARY KEY, - user TEXT NOT NULL, - log TEXT NOT NULL, - timestamp DATETIME DEFAULT CURRENT_TIMESTAMP);'); - $ret = $q->execute(); - $q = $db->prepare('INSERT INTO logs (user, log) VALUES (:user, :log)'); $q->bindValue(':user', $user, SQLITE3_TEXT); $q->bindValue(':log', $line, SQLITE3_TEXT); diff --git a/includes/scheme.sql b/includes/scheme.sql index 9bdbd56..78c5a1b 100644 --- a/includes/scheme.sql +++ b/includes/scheme.sql @@ -12,3 +12,39 @@ CREATE TABLE zones ( owner INTEGER NOT NULL, UNIQUE(zone), FOREIGN KEY(owner) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE ); + +CREATE TABLE logs ( + id INTEGER PRIMARY KEY, + user TEXT NOT NULL, + log TEXT NOT NULL, + timestamp DATETIME DEFAULT CURRENT_TIMESTAMP); + +CREATE TABLE groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name VARCHAR UNIQUE NOT NULL, + desc VARCHAR); + +CREATE TABLE groupmembers ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + "group" INTEGER NOT NULL, + user INTEGER NOT NULL, + UNIQUE("group",user), + FOREIGN KEY("group") REFERENCES groups(id) ON DELETE CASCADE, + FOREIGN KEY(user) REFERENCES users(id) ON DELETE CASCADE); + +CREATE TABLE permissions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + zone INTEGER NOT NULL, + user INTEGER, + "group" INTEGER, + permissions INTEGER, + UNIQUE(zone,user,"group"), + FOREIGN KEY(zone) REFERENCES zones(id) ON DELETE CASCADE, + FOREIGN KEY(user) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY("group") REFERENCES groups(id) ON DELETE CASCADE); + +CREATE TABLE metadata ( + name VARCHAR PRIMARY KEY, + value VARCHAR NOT NULL); + +INSERT INTO metadata (name, value) VALUES ("version","2"); diff --git a/includes/upgrade-0-1.sql b/includes/upgrade-0-1.sql new file mode 100644 index 0000000..56796e0 --- /dev/null +++ b/includes/upgrade-0-1.sql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS logs ( + id INTEGER PRIMARY KEY, + user TEXT NOT NULL, + log TEXT NOT NULL, + timestamp DATETIME DEFAULT CURRENT_TIMESTAMP); diff --git a/includes/upgrade-1-2.sql b/includes/upgrade-1-2.sql new file mode 100644 index 0000000..f884fc2 --- /dev/null +++ b/includes/upgrade-1-2.sql @@ -0,0 +1,29 @@ +CREATE TABLE groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name VARCHAR UNIQUE NOT NULL, + desc VARCHAR); + +CREATE TABLE groupmembers ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + "group" INTEGER NOT NULL, + user INTEGER NOT NULL, + UNIQUE("group",user), + FOREIGN KEY("group") REFERENCES groups(id) ON DELETE CASCADE, + FOREIGN KEY(user) REFERENCES users(id) ON DELETE CASCADE); + +CREATE TABLE permissions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + zone INTEGER NOT NULL, + user INTEGER, + "group" INTEGER, + permissions INTEGER, + UNIQUE(zone,user,"group"), + FOREIGN KEY(zone) REFERENCES zones(id) ON DELETE CASCADE, + FOREIGN KEY(user) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY("group") REFERENCES groups(id) ON DELETE CASCADE); + +CREATE TABLE metadata ( + name VARCHAR PRIMARY KEY, + value VARCHAR NOT NULL); + +INSERT INTO metadata (name, value) VALUES ("version","2");