setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
# $pdo->query("SET lc_time_names='de_DE'");
$sth = $pdo->query("SELECT valint FROM settings WHERE userid=0 AND sno=0");
$g_db_scheme_version = $sth->fetchColumn();
$user = User::GetInstance(); // There can be only one
if ($g_scriptname != 'login.php') {
$user->init_from_session();
$user->load_vessel();
}
$action = NULL;
$valid = FALSE;
// Initialize message system
$g_message = new Message;
$g_success = new MessageSuccess;
$g_warning = new MessageWarning;
$g_error = new MessageError;
// ========== MESSAGE FUNCTIONS ===============================================
class Message {
var $count = 0;
var $text = array();
var $caption;
var $alertclass;
function __construct() {
$this->caption = _('Information');
$this->alertclass = 'alert-info';
}
function SetCaption($str) {
$this->caption = $str;
}
function Add($msg) {
$this->count++;
$this->text[$this->count] = $msg;
}
function GetCount() {
return $this->count;
}
function PrintOut() {
if ($this->count > 0) {
echo '
', "\n";
echo '
', $this->caption, "
\n";
echo "
\n";
for ($i=1; $i<=$this->count; $i++) {
echo "\t
", $this->text[$i],"
\n";
}
echo "
\n";
echo '', "\n";
echo "
\n";
}
}
}
class MessageSuccess extends Message {
function __construct() {
$this->caption = _('Success');
$this->alertclass = 'alert-success';
}
}
class MessageWarning extends Message {
function __construct() {
$this->caption = _('Warning');
$this->alertclass = 'alert-warning';
}
}
class MessageError extends Message {
function __construct() {
$this->caption = _('Error');
$this->alertclass = 'alert-danger';
}
}
// ========== USER FUNCTIONS ==================================================
class User {
private static $instance = NULL;
private $loggedin;
private $errormessage;
public $id;
public $login;
public $displayname;
public $role;
public $flags;
public $vid; // current selected vessel
public $vessel; // name of current vessel
private function __construct() {
$this->loggedin = FALSE;
$this->errormessage = NULL;
$this->flags = [];
$this->vid = 1;
$this->vessel = 'Yacht';
}
public static function getInstance() {
if (self::$instance == NULL) {
self::$instance = new User();
}
return self::$instance;
}
function login($user_name, $user_pass) {
global $pdo;
if ($user_name == '' or $user_pass == '') {
$this->loggedin = FALSE;
$this->errormessage = _('Username or password was empty');
return FALSE;
}
$sql = "SELECT userid, pass, displayname, role, flags FROM user WHERE login=?";
$sth = $pdo->prepare($sql);
$sth->execute([$user_name]);
$row = $sth->fetch(PDO::FETCH_OBJ);
$this->role = $row->role;
$this->flags = array_filter(explode(',', $row->flags));
if ($row->flags != 0 ) {
// deleted or locked, intentionally not return detailed reason
$this->errormessage = _('User account does not exist');
} elseif (password_verify($user_pass, $row->pass)) {
// password check successful
$_SESSION['userid'] = $row->userid;
$this->loggedin = TRUE;
header_location($_SESSION['prelogin'] ?? 'index.php');
} else {
$this->errormessage = _('Username or password invalid');
}
return FALSE;
}
function logout() {
global $pdo;
// remove session completely
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
function init_from_session() {
global $pdo;
if (!isset($_SESSION['userid'])) {
$this->loggedin = FALSE;
$this->errormessage = _('User not logged in');
$this->id = NULL;
return;
}
$this->id = $_SESSION['userid'];
$sql = "SELECT displayname, role FROM user WHERE userid=?";
$sth = $pdo->prepare($sql);
$sth->execute([$this->id]);
$row = $sth->fetch();
$this->displayname = $row['displayname'];
$this->role = $row['role'];
//$this->displayname = $sth->fetchColumn();
}
function load_vessel() {
global $pdo;
$sql = "SELECT v.vid, v.vesselname "
. "FROM settings AS s INNER JOIN vessel AS v ON s.valint=v.vid "
. "WHERE s.userid=? and s.sno=1";
$sth = $pdo->prepare($sql);
$sth->execute([$this->id]);
$row = $sth->fetch();
$this->vid = $row['vid'];
$this->vessel = $row['vesselname'];
}
function get_last_error() {
return $this->errormessage;
}
}
function get_userlist() {
// Get list of all users for fast name lookup
global $pdo;
$ulist = array(-1 => ['-', 0]); // unknown
$sql = "SELECT userid, displayname, role, flags FROM user ORDER BY displayname";
$sth = $pdo->query($sql);
$res = $sth->fetchAll();
foreach ($res as $row) {
$flags = array_filter(explode(',', $row['flags']));
$deleted = in_array('deleted', $flags);
$locked = in_array('locked', $flags);
$ulist[$row['userid']] = [$row['displayname'], $deleted, $locked];
}
return $ulist;
}
// ========== DATABASE FUNCTIONS ==============================================
function db_load_enum($table, $column) {
// returns array of enum-values as defined in database
global $pdo;
$sql = "SELECT TRIM(TRAILING ')' FROM SUBSTRING(column_type,6)) "
. "FROM information_schema.columns "
. "WHERE table_name=? AND column_name=?";
$sth = $pdo->prepare($sql);
$sth->execute([$table, $column]);
// for PHP < 7.4
// return array_map(function($x) { return trim($x, "'"); }, explode(',', $sth->fetchColumn()));
// for PHP => 7.4
return array_map(fn($x) => trim($x, "'"), explode(',', $sth->fetchColumn()));
}
function db_get_ddtext($ddid, $ddval) {
// returns single value for dropdown
global $pdo;
global $g_error;
$sql = "SELECT ddtext FROM dropdown WHERE ddid=? AND ddval=?";
$sth = $pdo->prepare($sql);
try {
$sth->execute([$ddid, $ddval]);
} catch(PDOException $e) {
$g_error->Add($e->getMessage());
return '#err';
}
return $sth->fetchColumn();
}
function db_get_options($ddid, $orderby = '', $default = NULL) {
// returns list for dropdown
global $pdo;
$list = array();
if ($default != NULL) {
$list[0] = $default;
}
$sql = "SELECT ddval, ddtext FROM dropdown WHERE ddid=?";
if ($orderby == 'ddtext') {
$sql .= ' ORDER BY ddtext';
} elseif ($orderby == 'sort') {
$sql .= ' ORDER BY sort';
} else {
$sql .= ' ORDER BY ddval';
}
$sth = $pdo->prepare($sql);
$sth->execute([$ddid]);
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $rec) {
$list[$rec[0]] = $rec[1];
}
return $list;
}
function db_get_opt_vessel() {
global $pdo;
$list = array();
$sth = $pdo->query("SELECT vid, vesselname, model FROM vessel ORDER BY vid");
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $row) {
$list[$rec[0]] = $rec[1];
}
return $list;
}
// Functions to get option lists (key/value)
function db_get_opt_storage($vid) {
global $pdo;
global $g_error;
$list = array();
$sql = "SELECT sid, sname FROM storage WHERE vid=? ORDER BY sname";
$sth = $pdo->prepare($sql);
try {
$sth->execute([$vid]);
} catch(PDOException $e) {
$g_error->Add($e->getMessage());
}
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $rec) {
$list[$rec[0]] = $rec[1];
}
return $list;
}
function db_get_opt_box($vid) {
global $pdo;
global $g_error;
$list = array();
$sql = "SELECT boxid, label, content "
. "FROM box INNER JOIN storage USING (sid) "
. "WHERE vid=? "
. "ORDER BY label";
$sth = $pdo->prepare($sql);
try {
$sth->execute([$vid]);
} catch(PDOException $e) {
$g_error->Add($e->getMessage());
}
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $rec) {
$list[$rec[0]] = $rec[1] . ' - '. $rec[2];
}
return $list;
}
function db_get_opt_equip($vid) {
}
function db_get_opt_manuf($default=NULL) {
global $pdo;
if (isset($default)) {
$list = $default;
} else {
$list = array();
}
$sql = "SELECT compid, compname FROM company WHERE comptype=2 ORDER BY compname";
$sth = $pdo->query($sql);
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $row) {
$list[$row[0]] = $row[1];
}
return $list;
}
function db_get_opt_supp($default=NULL) {
global $pdo;
if (isset($default)) {
$list = $default;
} else {
$list = array();
}
$sql = "SELECT compid, compname FROM company WHERE comptype=1 ORDER BY compname";
$sth = $pdo->query($sql);
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $row) {
$list[$row[0]] = $row[1];
}
return $list;
}
function db_get_opt_proj($vid, $default=NULL) {
global $pdo;
global $g_error;
if (isset($default)) {
$list = $default;
} else {
$list = array();
}
$sql = "SELECT projid, projname FROM project WHERE vid=? ORDER BY projname";
$sth = $pdo->prepare($sql);
try {
$sth->execute([$vid]);
} catch(PDOException $e) {
$g_error->Add($e->getMessage());
}
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $rec) {
$list[$rec[0]] = $rec[1];
}
return $list;
}
function date_to_sql($var) {
if (!isset($var) || $var == '') {
return NULL;
} else {
list($d, $m, $y) = explode('.', $var);
return sprintf("%04d-%02d-%02d", $y, $m, $d);
}
}
function float_to_sql($var) {
global $g_lconv;
if (!isset($var) || $var == '') {
return NULL;
} else {
// remove thousands separator
$var = str_replace($g_lconv['thousands_sep'], '', $var);
// force decimal point
if ($g_lconv['decimal_point'] != '.') {
$var = str_replace($g_lconv['decimal_point'], '.', $var);
}
return $var;
}
}
// ========== FORM FUNCTIONS ==================================================
function form_create_select($fieldname, $label, $optlist, $selval=NULL) {
//if (
echo '
', "\n";
echo '\n";
echo '\n";
echo "
\n";
}
function form_action_buttons($script, $id) {
echo "
";
echo '', "\n";
echo '', "\n";
echo "
\n";
}
function form_add_button($script, $id=NULL, $idname='id') {
echo '