diff --git a/api/add-domain.php b/api/add-domain.php index afb8732..2818d8f 100644 --- a/api/add-domain.php +++ b/api/add-domain.php @@ -45,23 +45,25 @@ if(isset($input->action) && $input->action == "addDomain") { $soaContent = implode(" ", $soaData); - $db->autocommit(false); + $db->beginTransaction(); - $stmt = $db->prepare("INSERT INTO domains(name,type) VALUES (?,?)"); - $stmt->bind_param("ss", $input->name, $input->type); + $stmt = $db->prepare("INSERT INTO domains(name,type) VALUES (:name,:type)"); + $stmt->bindValue(':name', $input->name, PDO::PARAM_STR); + $stmt->bindValue(':type', $input->type, PDO::PARAM_STR); $stmt->execute(); - $stmt->close(); - $stmt = $db->prepare("SELECT LAST_INSERT_ID()"); + $stmt = $db->prepare("SELECT id FROM domains WHERE name=:name AND type=:type LIMIT 1"); + $stmt->bindValue(':name', $input->name, PDO::PARAM_STR); + $stmt->bindValue(':type', $input->type, PDO::PARAM_STR); $stmt->execute(); - $stmt->bind_result($newDomainId); - $stmt->fetch(); - $stmt->close(); + $newDomainId = $stmt->fetchColumn(); - $stmt = $db->prepare("INSERT INTO records(domain_id,name,type,content,ttl) VALUES (?,?,'SOA',?,?)"); - $stmt->bind_param("issi", $newDomainId, $input->name, $soaContent, $input->ttl); + $stmt = $db->prepare("INSERT INTO records(domain_id,name,type,content,ttl) VALUES (:domain_id,:name,'SOA',:content,:ttl)"); + $stmt->bindValue(':domain_id', $newDomainId, PDO::PARAM_INT); + $stmt->bindValue(':name', $input->name, PDO::PARAM_STR); + $stmt->bindValue(':content', $soaContent, PDO::PARAM_STR); + $stmt->bindValue(':ttl', $input->ttl, PDO::PARAM_INT); $stmt->execute(); - $stmt->close(); $db->commit(); diff --git a/api/install.php b/api/install.php index 291bbf1..9d17d95 100644 --- a/api/install.php +++ b/api/install.php @@ -98,15 +98,58 @@ CREATE TABLE IF NOT EXISTS options ( PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -INSERT INTO options(name,value) VALUES ('schema_version', 3); +INSERT INTO options(name,value) VALUES ('schema_version', 4); -CREATE TABLE domainmetadata ( - id INT AUTO_INCREMENT, - domain_id INT NOT NULL, - kind VARCHAR(32), - content TEXT, - PRIMARY KEY (id) -) Engine=InnoDB; +CREATE TABLE IF NOT EXISTS supermasters ( + ip VARCHAR(64) NOT NULL, + nameserver VARCHAR(255) NOT NULL, + account VARCHAR(40) NOT NULL, + PRIMARY KEY (ip, nameserver) +) Engine=InnoDB DEFAULT CHARSET=latin1; + + +CREATE TABLE IF NOT EXISTS comments ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + name VARCHAR(255) NOT NULL, + type VARCHAR(10) NOT NULL, + modified_at INT NOT NULL, + account VARCHAR(40) NOT NULL, + comment VARCHAR(64000) NOT NULL, + PRIMARY KEY (id), + KEY comments_domain_id_idx (domain_id), + KEY comments_name_type_idx (name,type), + KEY comments_order_idx (domain_id, modified_at) +) Engine=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS domainmetadata ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + kind VARCHAR(32), + content TEXT, + PRIMARY KEY (id), + KEY domainmetadata_idx (domain_id, kind) +) Engine=InnoDB DEFAULT CHARSET=latin1; + + +CREATE TABLE IF NOT EXISTS cryptokeys ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + flags INT NOT NULL, + active BOOL, + content TEXT, + PRIMARY KEY(id), + KEY domainidindex (domain_id) +) Engine=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE IF NOT EXISTS tsigkeys ( + id INT AUTO_INCREMENT, + name VARCHAR(255), + algorithm VARCHAR(50), + secret VARCHAR(255), + PRIMARY KEY (id), + UNIQUE KEY namealgoindex (name, algorithm) +) Engine=InnoDB DEFAULT CHARSET=latin1; "; $sql["pgsql"]=" @@ -146,8 +189,6 @@ CREATE INDEX IF NOT EXISTS nametype_index ON records(name,type); CREATE INDEX IF NOT EXISTS domain_id ON records(domain_id); CREATE INDEX IF NOT EXISTS recordorder ON records (domain_id, ordername text_pattern_ops); - - CREATE TABLE IF NOT EXISTS user ( id SERIAL PRIMARY KEY, name varchar(50) NOT NULL, @@ -250,7 +291,7 @@ CREATE TABLE IF NOT EXISTS tsigkeys ( CREATE UNIQUE INDEX IF NOT EXISTS namealgoindex ON tsigkeys(name, algorithm); "; try { - $db = new PDO("$input->type:dbname=$input->database;host=$input->host;port=$input->port", $input->user, $input->password); ; + $db = new PDO("$input->type:dbname=$input->database;host=$input->host;port=$input->port", $input->user, $input->password); } catch (PDOException $e) { $retval['status'] = "error"; diff --git a/api/upgrade.php b/api/upgrade.php index 95beb45..31b2be2 100644 --- a/api/upgrade.php +++ b/api/upgrade.php @@ -31,7 +31,7 @@ if(isset($input->action) && $input->action == "requestUpgrade") { $currentVersion = getVersion($db); if($currentVersion < 1) { - $sql = " + $sql["mysql"] = " CREATE TABLE IF NOT EXISTS remote ( id int(11) NOT NULL AUTO_INCREMENT, record int(11) NOT NULL, @@ -54,12 +54,12 @@ if(isset($input->action) && $input->action == "requestUpgrade") { INSERT INTO options(name,value) VALUES ('schema_version', 1); "; - - $db->multi_query($sql); - while ($db->next_result()) {;} + $sql["pgsql"] = ""; + $stmt = $db->query($sql[$config['db_type']]); + while ($stmt->nextRowset()) {;} } if($currentVersion < 2) { - $sql = " + $sql["mysql"] = " ALTER TABLE permissions DROP FOREIGN KEY permissions_ibfk_1; ALTER TABLE permissions @@ -79,12 +79,12 @@ if(isset($input->action) && $input->action == "requestUpgrade") { UPDATE options SET value=2 WHERE name='schema_version'; "; - - $db->multi_query($sql); - while ($db->next_result()) {;} + $sql["pgsql"] = ""; + $stmt = $db->query($sql[$config['db_type']]); + while ($stmt->nextRowset()) {;} } if($currentVersion < 3) { - $sql = " + $sql["mysql"] = " CREATE TABLE domainmetadata ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, @@ -98,11 +98,59 @@ if(isset($input->action) && $input->action == "requestUpgrade") { UPDATE options SET value=3 WHERE name='schema_version'; "; - - $db->multi_query($sql); - while ($db->next_result()) {;} + $sql["pgsql"] = ""; + $stmt = $db->query($sql[$config['db_type']]); + while ($stmt->nextRowset()) {;} + } + if($currentVersion < 4) { + $sql["mysql"] = " + CREATE TABLE IF NOT EXISTS supermasters ( + ip VARCHAR(64) NOT NULL, + nameserver VARCHAR(255) NOT NULL, + account VARCHAR(40) NOT NULL, + PRIMARY KEY (ip, nameserver) + ) Engine=InnoDB DEFAULT CHARSET=latin1; + + + CREATE TABLE IF NOT EXISTS comments ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + name VARCHAR(255) NOT NULL, + type VARCHAR(10) NOT NULL, + modified_at INT NOT NULL, + account VARCHAR(40) NOT NULL, + comment VARCHAR(64000) NOT NULL, + PRIMARY KEY (id), + KEY comments_domain_id_idx (domain_id), + KEY comments_name_type_idx (name,type), + KEY comments_order_idx (domain_id, modified_at) + ) Engine=InnoDB DEFAULT CHARSET=latin1; + + CREATE TABLE IF NOT EXISTS cryptokeys ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + flags INT NOT NULL, + active BOOL, + content TEXT, + PRIMARY KEY(id), + KEY domainidindex (domain_id) + ) Engine=InnoDB DEFAULT CHARSET=latin1; + + CREATE TABLE IF NOT EXISTS tsigkeys ( + id INT AUTO_INCREMENT, + name VARCHAR(255), + algorithm VARCHAR(50), + secret VARCHAR(255), + PRIMARY KEY (id), + UNIQUE KEY namealgoindex (name, algorithm) + ) Engine=InnoDB DEFAULT CHARSET=latin1; + + UPDATE options SET value=4 WHERE name='schema_version'; + "; + $sql["pgsql"] = ""; + $stmt = $db->query($sql[$config['db_type']]); + while ($stmt->nextRowset()) {;} } - $retval['status'] = "success"; } diff --git a/config/config-default.php b/config/config-default.php index e4f0d57..2617756 100644 --- a/config/config-default.php +++ b/config/config-default.php @@ -24,6 +24,12 @@ $config['db_password'] = ""; $config['db_port'] = 3306; $config['db_name'] = "pdnsmanager"; +//HTTP API Settings +$config['api_functionality'] = true; +$config['api_host'] = "localhost" +$config['api_port'] = 8080; +$config['api_key'] = ""; + //Remote update $config['nonce_lifetime'] = 15; diff --git a/lib/checkversion.php b/lib/checkversion.php index 07b65ac..c96d5dd 100644 --- a/lib/checkversion.php +++ b/lib/checkversion.php @@ -17,7 +17,7 @@ */ function getExpectedVersion() { - return 3; + return 4; } function checkVersion($db) { @@ -29,19 +29,14 @@ function checkVersion($db) { } function getVersion($db) { - $stmt = $db->prepare("SHOW TABLES LIKE 'options'"); - $stmt->execute(); - $stmt->store_result(); - if($stmt->num_rows() < 1) { + + try { + $stmt = $db->prepare("SELECT value FROM options WHERE name='schema_version' LIMIT 1"); + $stmt->execute(); + $version = $stmt->fetchColumn(); + } catch (Exception $e) { return 0; } - $stmt->close(); - - $stmt = $db->prepare("SELECT value FROM options WHERE name='schema_version'"); - $stmt->execute(); - $stmt->bind_result($version); - $stmt->fetch(); - $stmt->close(); return $version; } \ No newline at end of file diff --git a/lib/database.php b/lib/database.php index 1f9f7d7..c741421 100644 --- a/lib/database.php +++ b/lib/database.php @@ -16,8 +16,9 @@ * limitations under the License. */ -$db = new mysqli($config['db_host'], $config['db_user'], $config['db_password'], $config['db_name'], $config['db_port']); - -if ($db->connect_error) { - die("Connection to database failed"); +try { + $db = new PDO("$config['db_type']:dbname=$config['db_name'];host=$config['db_host'];port=$config['db_port']", $config['db_user'], $config['db_password']); } +catch (PDOException $e) { + die("Connection to database failed"); +} \ No newline at end of file diff --git a/lib/update-serial.php b/lib/update-serial.php index f1ee3fe..c92d384 100644 --- a/lib/update-serial.php +++ b/lib/update-serial.php @@ -18,16 +18,13 @@ function update_serial($db, $domainId) { - $db->autocommit(false); - $db->begin_transaction(); + $db->beginTransaction(); - $stmt = $db->prepare("SELECT content FROM records WHERE type='SOA' AND domain_id=?"); - $stmt->bind_param("i", $domainId); + $stmt = $db->prepare("SELECT content FROM records WHERE type='SOA' AND domain_id=:domain_id LIMIT 1"); + $stmt->bindValue(':domain_id', $domainId, PDO::PARAM_INT); $stmt->execute(); - $stmt->bind_result($content); - $stmt->fetch(); - $stmt->close(); - + $content = $stmt->fetchColumn(); + $content = explode(" ", $content); $serial = $content[2]; @@ -50,8 +47,9 @@ function update_serial($db, $domainId) { $newsoa = implode(" ", $content); - $stmt = $db->prepare("UPDATE records SET content=? WHERE type='SOA' AND domain_id=?"); - $stmt->bind_param("si", $newsoa, $domainId); + $stmt = $db->prepare("UPDATE records SET content=:content WHERE type='SOA' AND domain_id=:domain_id"); + $stmt->bindValue(':content', $newsoa, PDO::PARAM_STR); + $stmt->bindValue(':domain_id', $domainId, PDO::PARAM_INT); $stmt->execute(); $db->commit();