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();
} }
} }
@ -48,7 +49,7 @@ class dba
} elseif ($result === true) { } elseif ($result === true) {
$mesg = 'true'; $mesg = 'true';
} else { } else {
$mesg = $result->num_rows.' results' . EOL; $mesg = $result->num_rows . ' results' . EOL;
} }
$str = 'SQL = ' . printable($sql) . EOL . 'SQL returned ' . $mesg . EOL; $str = 'SQL = ' . printable($sql) . EOL . 'SQL returned ' . $mesg . EOL;
@ -76,9 +77,9 @@ class dba
} }
if ($this->debug == 2) { if ($this->debug == 2) {
$debug_text .= printable(print_r($r, true). EOL); $debug_text .= printable(print_r($r, true) . EOL);
} elseif ($this->debug == 3) { } elseif ($this->debug == 3) {
echo printable(print_r($r, true) . EOL) ; echo printable(print_r($r, true) . EOL);
} }
return $r; return $r;
@ -100,93 +101,71 @@ 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);
$s = str_replace("\x00", '.', $s); $s = str_replace("\x00", '.', $s);
if (x($_SERVER, 'SERVER_NAME')) { if (x($_SERVER, 'SERVER_NAME')) {
$s = escape_tags($s); $s = escape_tags($s);
} }
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;
if ($db) { if ($db) {
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.
function dbesc_array_cb(&$item, $key)
{
if (! function_exists('dbesc_array_cb')) {
function dbesc_array_cb(&$item, $key)
{
if (is_string($item)) { if (is_string($item)) {
$item = dbesc($item); $item = dbesc($item);
} }
}
} }
function dbesc_array(&$arr)
if (! function_exists('dbesc_array')) { {
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,68 +1,73 @@
<?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;
} }
$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,24 +9,24 @@ use \Closure;
*/ */
class View class View
{ {
#TODO: Replace this with better code. #TODO: Replace this with better code.
public static function getViewPath($name)
{
return dirname(__DIR__).'/templates/view/'.$name.'.php';
}
public static function getLayoutPath($name)
{
return dirname(__DIR__).'/templates/layout/'.$name.'.php';
}
protected $layout; protected $layout;
protected $view; protected $view;
protected $helpers; protected $helpers;
public function getHelpers(){ public static function getViewPath($name)
{
return dirname(__DIR__) . '/templates/view/' . $name . '.php';
}
public static function getLayoutPath($name)
{
return dirname(__DIR__) . '/templates/layout/' . $name . '.php';
}
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,29 +72,24 @@ 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);
require $__FILE__; require $__FILE__;
}; };
//Use our current data as fallback. //Use our current data as fallback.
if(!is_array($data)){ if (!is_array($data)) {
$data = $this->currentData; $data = $this->currentData;
} }
@ -103,7 +101,5 @@ class View
ob_start(); ob_start();
$call($filename, $data); $call($filename, $data);
return ob_get_clean(); return ob_get_clean();
} }
} }