Merge pull request #21 from Hypolite/bug/fix-dba-missing-db

Fix missing $db when session write on exit
This commit is contained in:
Michael Vogel 2017-05-17 14:33:17 +02:00 committed by GitHub
commit 9a4ac58f67
5 changed files with 211 additions and 230 deletions

View file

@ -206,7 +206,6 @@ if (!function_exists('killme')) {
function killme() function killme()
{ {
session_write_close(); session_write_close();
closedb();
exit; exit;
} }
} }

View file

@ -16,7 +16,8 @@ class dba
public function __construct($server, $user, $pass, $db, $install = false) public function __construct($server, $user, $pass, $db, $install = false)
{ {
$this->db = @new mysqli($server, $user, $pass, $db); $this->db = @new mysqli($server, $user, $pass, $db);
if ((mysqli_connect_errno()) && (! install)) {
if (mysqli_connect_errno() && ! $install) {
system_unavailable(); system_unavailable();
} }
} }
@ -100,7 +101,6 @@ class dba
} }
} }
if (! function_exists('printable')) {
function printable($s) function printable($s)
{ {
$s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~", ".", $s); $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~", ".", $s);
@ -110,19 +110,14 @@ if (! function_exists('printable')) {
} }
return $s; return $s;
} }
}
// Procedural functions // Procedural functions
if (! function_exists('dbg')) {
function dbg($state) function dbg($state)
{ {
global $db; global $db;
$db->dbg($state); $db->dbg($state);
} }
}
if (! function_exists('dbesc')) {
function dbesc($str) function dbesc($str)
{ {
global $db; global $db;
@ -130,63 +125,47 @@ if (! function_exists('dbesc')) {
return($db->escape($str)); return($db->escape($str));
} }
} }
}
// Function: q($sql,$args); // Function: q($sql,$args);
// Description: execute SQL query with printf style args. // Description: execute SQL query with printf style args.
// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d", // Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
// 'user', 1); // 'user', 1);
if (! function_exists('q')) {
function q($sql) function q($sql)
{ {
global $db; global $db;
$args = func_get_args(); $args = func_get_args();
unset($args[0]); unset($args[0]);
$ret = null;
if ($db) { if ($db) {
$ret = $db->q(vsprintf($sql, $args)); $ret = $db->q(vsprintf($sql, $args));
}
if ($db->db->errno) { if ($db->db->errno) {
logger('dba: ' . $db->db->error); logger('dba: ' . $db->db->error);
} }
} else {
error_log(__FILE__ . ':' . __LINE__ . ' $db has gone');
}
return $ret; return $ret;
} }
}
// Caller is responsible for ensuring that any integer arguments to // Caller is responsible for ensuring that any integer arguments to
// dbesc_array are actually integers and not malformed strings containing // dbesc_array are actually integers and not malformed strings containing
// SQL injection vectors. All integer array elements should be specifically // SQL injection vectors. All integer array elements should be specifically
// cast to int to avoid trouble. // cast to int to avoid trouble.
if (! function_exists('dbesc_array_cb')) {
function dbesc_array_cb(&$item, $key) function dbesc_array_cb(&$item, $key)
{ {
if (is_string($item)) { if (is_string($item)) {
$item = dbesc($item); $item = dbesc($item);
} }
} }
}
if (! function_exists('dbesc_array')) {
function dbesc_array(&$arr) function dbesc_array(&$arr)
{ {
if (is_array($arr) && count($arr)) { if (is_array($arr) && count($arr)) {
array_walk($arr, 'dbesc_array_cb'); array_walk($arr, 'dbesc_array_cb');
} }
} }
}
if (! function_exists('closedb')) {
function closedb()
{
global $db;
// $db->close();
}
}

View file

@ -1,31 +1,35 @@
<?php <?php
// Session management functions. These provide database storage of PHP // Session management functions. These provide database storage of PHP
// session info. // session info.
$session_exists = 0; $session_exists = 0;
$session_expire = 180000; $session_expire = 180000;
if(! function_exists('ref_session_open')) { function ref_session_open($s, $n)
function ref_session_open ($s,$n) { {
return true; return true;
}} }
if(! function_exists('ref_session_read')) { function ref_session_read($id)
function ref_session_read ($id) { {
global $session_exists; global $session_exists;
if(x($id))
if (x($id)) {
$r = q("SELECT `data` FROM `session` WHERE `sid`= '%s'", dbesc($id)); $r = q("SELECT `data` FROM `session` WHERE `sid`= '%s'", dbesc($id));
}
if (count($r)) { if (count($r)) {
$session_exists = true; $session_exists = true;
return $r[0]['data']; return $r[0]['data'];
} }
return '';
}}
if(! function_exists('ref_session_write')) { return '';
function ref_session_write ($id,$data) { }
function ref_session_write($id, $data)
{
global $session_exists, $session_expire; global $session_exists, $session_expire;
if (!$id || !$data) { if (!$id || !$data) {
return false; return false;
} }
@ -33,36 +37,37 @@ function ref_session_write ($id,$data) {
$expire = time() + $session_expire; $expire = time() + $session_expire;
$default_expire = time() + 300; $default_expire = time() + 300;
if($session_exists) if ($session_exists) {
$r = q("UPDATE `session` $r = q("UPDATE `session`
SET `data` = '%s', `expire` = '%s' SET `data` = '%s', `expire` = '%s'
WHERE `sid` = '%s' LIMIT 1", WHERE `sid` = '%s' LIMIT 1", dbesc($data), dbesc($expire), dbesc($id));
dbesc($data), dbesc($expire), dbesc($id)); } else {
else
$r = q("INSERT INTO `session` $r = q("INSERT INTO `session`
SET `sid` = '%s', `expire` = '%s', `data` = '%s'", SET `sid` = '%s', `expire` = '%s', `data` = '%s'", dbesc($id), dbesc($default_expire), dbesc($data));
dbesc($id), dbesc($default_expire), dbesc($data)); }
return true; return true;
}} }
if(! function_exists('ref_session_close')) { function ref_session_close()
function ref_session_close() { {
return true; return true;
}} }
if(! function_exists('ref_session_destroy')) { function ref_session_destroy($id)
function ref_session_destroy ($id) { {
q("DELETE FROM `session` WHERE `sid` = '%s'", dbesc($id)); q("DELETE FROM `session` WHERE `sid` = '%s'", dbesc($id));
return true;
}}
if(! function_exists('ref_session_gc')) { return true;
function ref_session_gc($expire) { }
function ref_session_gc($expire)
{
q("DELETE FROM `session` WHERE `expire` < %d", dbesc(time())); q("DELETE FROM `session` WHERE `expire` < %d", dbesc(time()));
q("OPTIMIZE TABLE `sess_data`"); q("OPTIMIZE TABLE `sess_data`");
return true; return true;
}} }
$gc_probability = 50; $gc_probability = 50;
@ -70,7 +75,11 @@ ini_set('session.gc_probability', $gc_probability);
ini_set('session.use_only_cookies', 1); ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1); ini_set('session.cookie_httponly', 1);
session_set_save_handler(
session_set_save_handler ('ref_session_open', 'ref_session_close', 'ref_session_open',
'ref_session_read', 'ref_session_write', 'ref_session_close',
'ref_session_destroy', 'ref_session_gc'); 'ref_session_read',
'ref_session_write',
'ref_session_destroy',
'ref_session_gc'
);

View file

@ -75,6 +75,8 @@ if ($a->module_loaded) {
if ((!$a->error) && (function_exists($a->module . '_content'))) { if ((!$a->error) && (function_exists($a->module . '_content'))) {
$func = $a->module . '_content'; $func = $a->module . '_content';
$a->page['content'] = $func($a); $a->page['content'] = $func($a);
killme();
} }
} }
@ -113,8 +115,4 @@ $template = 'view/'
require_once $template; require_once $template;
session_write_close(); killme();
closedb();
exit;

View file

@ -1,4 +1,6 @@
<?php namespace Friendica\Directory\Rendering; <?php
namespace Friendica\Directory\Rendering;
use \Closure; use \Closure;
@ -7,9 +9,12 @@ use \Closure;
*/ */
class View class View
{ {
#TODO: Replace this with better code. #TODO: Replace this with better code.
protected $layout;
protected $view;
protected $helpers;
public static function getViewPath($name) public static function getViewPath($name)
{ {
return dirname(__DIR__) . '/templates/view/' . $name . '.php'; return dirname(__DIR__) . '/templates/view/' . $name . '.php';
@ -20,11 +25,8 @@ class View
return dirname(__DIR__) . '/templates/layout/' . $name . '.php'; return dirname(__DIR__) . '/templates/layout/' . $name . '.php';
} }
protected $layout; public function getHelpers()
protected $view; {
protected $helpers;
public function getHelpers(){
return $this->helpers; return $this->helpers;
} }
@ -33,34 +35,35 @@ class View
$this->helpers[$name] = $helper; $this->helpers[$name] = $helper;
} }
public function getView(){ public function getView()
{
return $this->view; return $this->view;
} }
public function setView($value){ public function setView($value)
{
$this->view = $value; $this->view = $value;
} }
public function getLayout(){ public function getLayout()
{
return $this->layout; return $this->layout;
} }
public function setLayout($value){ public function setLayout($value)
{
$this->layout = $value; $this->layout = $value;
} }
public function __construct($view = null, $layout = "default") public function __construct($view = null, $layout = "default")
{ {
$this->view = $view; $this->view = $view;
$this->layout = $layout; $this->layout = $layout;
$this->helpers = array(); $this->helpers = array();
} }
public function render(array $data = array()) public function render(array $data = array())
{ {
//First the outer view. //First the outer view.
$view = self::getViewPath($this->view); $view = self::getViewPath($this->view);
$viewContent = $this->encapsulatedRequire($view, $data); $viewContent = $this->encapsulatedRequire($view, $data);
@ -69,21 +72,16 @@ class View
$data['content'] = $viewContent; $data['content'] = $viewContent;
$layout = self::getLayoutPath($this->layout); $layout = self::getLayoutPath($this->layout);
return $this->encapsulatedRequire($layout, $data); return $this->encapsulatedRequire($layout, $data);
} }
public function output(array $data = array()) public function output(array $data = array())
{ {
header("Content-type: text/html; charset=utf-8"); header("Content-type: text/html; charset=utf-8");
echo $this->render($data); echo $this->render($data);
exit;
} }
public function encapsulatedRequire($filename, array $data = null) public function encapsulatedRequire($filename, array $data = null)
{ {
//This will provide our variables on the global scope. //This will provide our variables on the global scope.
$call = function($__FILE__, $__VARS__) { $call = function($__FILE__, $__VARS__) {
extract($__VARS__, EXTR_SKIP); extract($__VARS__, EXTR_SKIP);
@ -103,7 +101,5 @@ class View
ob_start(); ob_start();
$call($filename, $data); $call($filename, $data);
return ob_get_clean(); return ob_get_clean();
} }
} }