diff --git a/inc/Storage.class.php b/inc/Storage.class.php index fbd6c9d..ecc6fa5 100644 --- a/inc/Storage.class.php +++ b/inc/Storage.class.php @@ -28,7 +28,7 @@ class Storage { break; case 'key': - $return = 'INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY'; + $return = 'INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY'; break; case 'float': @@ -117,7 +117,7 @@ class Storage { $value_array = substr($value_array, 2); elseif(substr($value_array, 0, 1) == ">" || substr($value_array, 0, 1) == "<") $value_array = substr($value_array, 1); - + $query->bindValue(':'.$field.$key, $value_array); } } @@ -162,7 +162,7 @@ class Storage { $query .= ' WHERE id='.$this->id; } else { - $query = 'INSERT INTO '.MYSQL_PREFIX.$this->TABLE_NAME.'('; + $query = 'INSERT IGNORE INTO '.MYSQL_PREFIX.$this->TABLE_NAME.'('; $i = false; foreach($this->fields as $field=>$type) { @@ -172,11 +172,11 @@ class Storage { } $query .= ') VALUES('; - + $i = false; foreach($this->fields as $field=>$type) { if($i) { $query .= ','; } else { $i = true; } - + $query .= ':'.$field; } @@ -194,7 +194,7 @@ class Storage { $query->bindValue(':'.$field, $value); } - + $query->execute(); (empty($this->id) ? $this->setId($this->connection->lastInsertId()) : $this->setId($this->id)); @@ -209,7 +209,7 @@ class Storage { foreach($this->fields as $field=>$type) { if(!empty($this->$field)) { if($i) { $query .= ' AND '; } else { $i = true; } - + $query .= $field.'=:'.$field; } } diff --git a/inc/User.class.php b/inc/User.class.php index ce1a263..81a5f0d 100644 --- a/inc/User.class.php +++ b/inc/User.class.php @@ -101,7 +101,7 @@ class User extends Storage { case 2: // Global paybacks only $this->notifications = 2; break; - + case 3: // Everything concerning you $this->notifications = 3; break; @@ -137,7 +137,7 @@ class User extends Storage { public function exists() { $user_data = $this->load(array('login'=>$this->login), true); - if(count($user_data) == 1) { + if(count($user_data) == 1) { return $user_data; } else { @@ -173,7 +173,7 @@ class User extends Storage { $this->setStaySignedInToken($user_data['stay_signed_in_token']); } - // Check wether a user already exists or not + // Check wether a user already exists or not // (a user = a unique login and display_name) // ========================================= public function isUnique() { diff --git a/inc/functions.php b/inc/functions.php index dde3b77..16707c5 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -71,7 +71,7 @@ if ($handle = opendir($dir)) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != ".." && $entry != 'json' && is_dir($dir.$entry)) { - $return[] = array('value'=>$entry, 'option'=>str_replace(array('_en', '_fr'), array(' (English)', ' (French)'), $entry)); + $return[] = array('value'=>$entry.'/', 'option'=>$entry); } } closedir($handle); diff --git a/install.php b/install.php index 68806c3..a058a08 100644 --- a/install.php +++ b/install.php @@ -1,5 +1,6 @@ Your Bouffe@Ulm instance is already configured. You should either delete data/config.php to access this page or delete the install.php for security reasons if you are ok with the configuration.
Go to your instance.

'); @@ -13,49 +14,97 @@ $block_form = true; } if(!is_writable('tmp/')) { - $error = "The script seems to be unable to write to tmp/ folder (to store the cached files for templates). You should give write (chmod 777 -R tmp/."; + $error = "The script seems to be unable to write to tmp/ folder (to store the cached files for templates). You should give write access to this folder."; $block_form = true; } if(!is_writable('db_backups/')) { - $error = "The script seems to be unable to write to db_backups/ folder (to write the database backups). You should give write access."; + $error = "The script seems to be unable to write to db_backups/ folder (to write the database backups). You should give write access to this folder."; $block_form = true; } - if(!empty($_POST['mysql_host']) && !empty($_POST['mysql_login']) && !empty($_POST['mysql_db']) && !empty($_POST['admin_login']) && !empty($_POST['admin_password']) && !empty($_POST['currency']) && !empty($_POST['instance_title']) && !empty($_POST['base_url']) && !empty($_POST['timezone']) && !empty($_POST['email_webmaster']) && check_token(600, 'install') && !empty($_POST['lang'])) { - $mysql_host = $_POST['mysql_host']; - $mysql_login = $_POST['mysql_login']; - $mysql_db = $_POST['mysql_db']; - $mysql_password = $_POST['mysql_password']; + if(!empty($_POST['mysql_host']) && !empty($_POST['mysql_login']) && !empty($_POST['mysql_password']) && !empty($_POST['mysql_db']) && !empty($_POST['instance_title']) && !empty($_POST['base_url']) && !empty($_POST['currency']) && !empty($_POST['timezone']) && !empty($_POST['lang']) && !empty($_POST['template']) && !empty($_POST['admin_login']) && !empty($_POST['admin_password']) && check_token(600, 'install')) { $mysql_prefix = (!empty($_POST['mysql_prefix'])) ? $_POST['mysql_prefix'] : ''; - $instance_title = (!empty($_POST['instance_title'])) ? $_POST['instance_title'] : 'Bouffe@Ulm'; + $current_template = $_POST['template']; try { - $db = new PDO('mysql:host='.$mysql_host.';dbname='.$mysql_db, $mysql_login, $mysql_password); + $db = new PDO('mysql:host='.$_POST['mysql_host'].';dbname='.$_POST['mysql_db'], $_POST['mysql_login'], $_POST['mysql_password']); //Create table "Users" - $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Users (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(255), email VARCHAR(255), display_name VARCHAR(255), password VARCHAR(130), admin TINYINT(1), json_token VARCHAR(32), notifications TINYINT(1), stay_signed_in_token VARCHAR(32)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); + $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Users ( + id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + login VARCHAR(255), + email VARCHAR(255), + display_name VARCHAR(255), + password VARCHAR(130), + admin TINYINT(1), + json_token VARCHAR(32), + notifications TINYINT(1), + stay_signed_in_token VARCHAR(32), + UNIQUE (login), + UNIQUE (display_name), + UNIQUE (json_token), + UNIQUE (stay_signed_in_token) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); //Create table "Invoices" - $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Invoices (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, date DATETIME, buyer INT(11), amount INT(11), what TEXT) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); + $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Invoices ( + id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + date DATETIME, + buyer INT(11), + FOREIGN KEY (buyer) REFERENCES '.$mysql_prefix.'Users(id) ON DELETE CASCADE, + amount INT(11), + what TEXT + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); //Create table "Users_in_invoices" - $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Users_in_invoices (invoice_id INT(11) NOT NULL, KEY invoice_id (invoice_id), user_id INT(11), KEY user_id (user_id), guests INT(11)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); + $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Users_in_invoices ( + invoice_id INT(11) NOT NULL, + FOREIGN KEY (invoice_id) REFERENCES '.$mysql_prefix.'Invoices(id) ON DELETE CASCADE, + user_id INT(11), + FOREIGN KEY (user_id) REFERENCES '.$mysql_prefix.'Users(id) ON DELETE CASCADE, + guests INT(11) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); //Create table "Paybacks" - $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Paybacks (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, date DATETIME, invoice_id INT(11), KEY invoice_id (invoice_id), amount INT(11), from_user INT(11), to_user INT(11)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); + $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Paybacks ( + id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + date DATETIME, + invoice_id INT(11), + FOREIGN KEY (invoice_id) REFERENCES '.$mysql_prefix.'Invoices(id) ON DELETE CASCADE, + amount INT(11), + from_user INT(11), + FOREIGN KEY (from_user) REFERENCES '.$mysql_prefix.'Users(id) ON DELETE CASCADE, + to_user INT(11) + FOREIGN KEY (to_user) REFERENCES '.$mysql_prefix.'Users(id) ON DELETE CASCADE, + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); // Create table "GlobalPaybacks" - $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'GlobalPaybacks (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, date DATETIME, closed TINYINT(1)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); + $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'GlobalPaybacks ( + id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + date DATETIME, + closed TINYINT(1) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); // Create table "Users_in_GlobalPaybacks" - $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Users_in_GlobalPaybacks (global_payback_id INT(11) NOT NULL, KEY global_payback_id (global_payback_id), user1_id INT(11), user2_id INT(11), amount INT(11)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); + $db->query('CREATE TABLE IF NOT EXISTS '.$mysql_prefix.'Users_in_GlobalPaybacks ( + global_payback_id INT(11) NOT NULL, + FOREIGN KEY (global_payback_id) REFERENCES '.$mysql_prefix.'GlobalPaybacks(id) ON DELETE CASCADE, + user1_id INT(11), + FOREIGN KEY (user1_id) REFERENCES '.$mysql_prefix.'Users(id) ON DELETE CASCADE, + user2_id INT(11), + FOREIGN KEY (user2_id) REFERENCES '.$mysql_prefix.'Users(id) ON DELETE CASCADE, + amount INT(11) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'); } catch (PDOException $e) { - $error = 'Unable to connect to database and create database, check your credentials and config.
Error message : '.$e->getMessage().'.'; + $error = 'Unable to connect to database and create database, check your credentials and config.
Error message: '.$e->getMessage().'.'; } - if(!filter_var($_POST['email_webmaster'], FILTER_VALIDATE_EMAIL)) { - $email = 'Webmaster\'s e-mail address is invalid.'; + if(!empty($_POST['email_webmaster']) && !filter_var($_POST['email_webmaster'], FILTER_VALIDATE_EMAIL)) { + $error = "Webmaster's email address is invalid."; + } + else { + $email_webmaster = !empty($_POST['email_webmaster']) ? $_POST['email_webmaster'] : ''; } if(empty($error)) { @@ -70,17 +119,17 @@ $config = "setLogin($_POST['admin_login']); - $admin->setDisplayName($_POST['admin_display_name']); + $admin->setDisplayName(!empty($_POST['admin_display_name']) ? $_POST['admin_display_name'] : ''); $admin->setPassword($admin->encrypt($_POST['admin_password'])); $admin->setAdmin(true); - $admin->setEmail($_POST['email_webmaster']); + $admin->setEmail($email_webmaster); $admin->setStaySignedInToken(""); $admin->setNotifications(3); $admin->newJsonToken(); @@ -103,13 +152,17 @@ header('location: index.php'); exit(); } catch (Exception $e) { - $error = 'An error occurred when inserting user in the database.
Error message : '.$e->getMessage().'.'; + $error = 'An error occurred when inserting user in the database.
Error message: '.$e->getMessage().'.'; } } - else + else { $error = 'Unable to write configuration to config file data/config.php.'; + } } } + else { + $current_template = 'default'; + } $token = generate_token('install'); ?> @@ -118,8 +171,8 @@ Bouffe@Ulm - Installation - - + +

Bouffe@Ulm - Installation

@@ -135,37 +188,48 @@
Database -

+

-

-

Toggle visible

+

+

Toggle visible

-
- Note : You must create this database first. +
+ Note: You must create this database first.

-


- Note : Leave the field blank to not use any.

+


+ Note: Leave the field blank to not use any.

General options -

+

- "/>
- Note : This is the base URL from which you access this page. You must keep the trailing "/" in the above address. + "/>
+ Note: This is the base URL from which you access this page. You must keep the trailing "/" in the above address.

-

+

-
- For example : Europe/Paris. See the doc for more info. +
+ For example: Europe/Paris. See the doc for more info.

-

-

+

/>

+

+

+ +

Administrator -

/>

-

/>

-

Toggle visible

+

/>

+

/> (Leave empty to use the login)

+

Toggle visible

type="submit" value="Install">

diff --git a/tpl/default_en/connection.html b/tpl/default/connection.html similarity index 100% rename from tpl/default_en/connection.html rename to tpl/default/connection.html diff --git a/tpl/default_en/css/style.css b/tpl/default/css/style.css similarity index 100% rename from tpl/default_en/css/style.css rename to tpl/default/css/style.css diff --git a/tpl/default_en/css/style.min.css b/tpl/default/css/style.min.css similarity index 100% rename from tpl/default_en/css/style.min.css rename to tpl/default/css/style.min.css diff --git a/tpl/default_en/edit_users.html b/tpl/default/edit_users.html similarity index 100% rename from tpl/default_en/edit_users.html rename to tpl/default/edit_users.html diff --git a/tpl/default_en/favicon-144.png b/tpl/default/favicon-144.png similarity index 100% rename from tpl/default_en/favicon-144.png rename to tpl/default/favicon-144.png diff --git a/tpl/default_en/favicon-152.png b/tpl/default/favicon-152.png similarity index 100% rename from tpl/default_en/favicon-152.png rename to tpl/default/favicon-152.png diff --git a/tpl/default_en/favicon-16.png b/tpl/default/favicon-16.png similarity index 100% rename from tpl/default_en/favicon-16.png rename to tpl/default/favicon-16.png diff --git a/tpl/default_en/favicon-32.png b/tpl/default/favicon-32.png similarity index 100% rename from tpl/default_en/favicon-32.png rename to tpl/default/favicon-32.png diff --git a/tpl/default_en/favicon.ico b/tpl/default/favicon.ico similarity index 100% rename from tpl/default_en/favicon.ico rename to tpl/default/favicon.ico diff --git a/tpl/default_en/footer.html b/tpl/default/footer.html similarity index 100% rename from tpl/default_en/footer.html rename to tpl/default/footer.html diff --git a/tpl/default_en/header.html b/tpl/default/header.html similarity index 100% rename from tpl/default_en/header.html rename to tpl/default/header.html diff --git a/tpl/default_en/img/toggleVisible.png b/tpl/default/img/toggleVisible.png similarity index 100% rename from tpl/default_en/img/toggleVisible.png rename to tpl/default/img/toggleVisible.png diff --git a/tpl/default_en/index.html b/tpl/default/index.html similarity index 100% rename from tpl/default_en/index.html rename to tpl/default/index.html diff --git a/tpl/default_en/js/jquery-1.10.2.min.js b/tpl/default/js/jquery-1.10.2.min.js similarity index 100% rename from tpl/default_en/js/jquery-1.10.2.min.js rename to tpl/default/js/jquery-1.10.2.min.js diff --git a/tpl/default_en/js/main.js b/tpl/default/js/main.js similarity index 100% rename from tpl/default_en/js/main.js rename to tpl/default/js/main.js diff --git a/tpl/default_en/js/main.min.js b/tpl/default/js/main.min.js similarity index 100% rename from tpl/default_en/js/main.min.js rename to tpl/default/js/main.min.js diff --git a/tpl/default_en/manage_paybacks.html b/tpl/default/manage_paybacks.html similarity index 100% rename from tpl/default_en/manage_paybacks.html rename to tpl/default/manage_paybacks.html diff --git a/tpl/default_en/new_invoice.html b/tpl/default/new_invoice.html similarity index 100% rename from tpl/default_en/new_invoice.html rename to tpl/default/new_invoice.html diff --git a/tpl/default_en/see_paybacks.html b/tpl/default/see_paybacks.html similarity index 100% rename from tpl/default_en/see_paybacks.html rename to tpl/default/see_paybacks.html diff --git a/tpl/default_en/settings.html b/tpl/default/settings.html similarity index 100% rename from tpl/default_en/settings.html rename to tpl/default/settings.html