diff --git a/boot.php b/boot.php index 77eeb79ab..ee1bba1cd 100644 --- a/boot.php +++ b/boot.php @@ -43,10 +43,10 @@ class App { public $module; public $pager; public $strings; + public $path; private $scheme; private $hostname; - private $path; private $baseurl; private $db; diff --git a/include/auth.php b/include/auth.php index 8f9019e01..8d2a0e2d0 100644 --- a/include/auth.php +++ b/include/auth.php @@ -10,7 +10,7 @@ if((x($_SESSION,'authenticated')) && (! ($_POST['auth-params'] == 'login'))) { unset($_SESSION['is_visitor']); unset($_SESSION['administrator']); unset($_SESSION['cid']); - $_SESSION['sysmsg'] = t("Logged out.") . EOL; + notice( t('Logged out.') . EOL); goaway($a->get_baseurl()); } if(x($_SESSION,'uid')) { @@ -50,7 +50,7 @@ else { dbesc(trim($_POST['login-name'])), dbesc($encrypted)); if(($r === false) || (! count($r))) { - $_SESSION['sysmsg'] = t('Login failed.') . EOL ; + notice( t('Login failed.') . EOL ); goaway($a->get_baseurl()); } $_SESSION['uid'] = $r[0]['uid']; @@ -58,7 +58,7 @@ else { $_SESSION['authenticated'] = 1; $_SESSION['my_url'] = $a->get_baseurl() . '/profile/' . $r[0]['nickname']; - $_SESSION['sysmsg'] = t("Welcome back ") . $r[0]['username'] . EOL; + notice( t("Welcome back ") . $r[0]['username'] . EOL); $a->user = $r[0]; if(strlen($a->user['timezone'])) date_default_timezone_set($a->user['timezone']); diff --git a/include/datetime.php b/include/datetime.php index b0621f4a2..15d688530 100644 --- a/include/datetime.php +++ b/include/datetime.php @@ -8,8 +8,8 @@ function timezone_cmp($a, $b) { } if(strstr($a,'/')) return -1; if(strstr($b,'/')) return 1; - if ($a == $b) return 0; - return ($a < $b) ? -1 : 1; + if ( t($a) == t($b)) return 0; + return ( t($a) < t($b)) ? -1 : 1; }} @@ -29,7 +29,7 @@ function select_timezone($current = 'America/Los_Angeles') { if($continent != '') $o .= ''; $continent = $ex[0]; - $o .= ""; + $o .= ''; } if(count($ex) > 2) $city = substr($value,strpos($value,'/')+1); @@ -41,10 +41,10 @@ function select_timezone($current = 'America/Los_Angeles') { if($continent != 'Miscellaneous') { $o .= ''; $continent = 'Miscellaneous'; - $o .= ""; + $o .= ''; } } - $city = str_replace('_', ' ', $city); + $city = str_replace('_', ' ', t($city)); $selected = (($value == $current) ? " selected=\"selected\" " : ""); $o .= ""; } @@ -101,56 +101,36 @@ function datesel($pre,$ymin,$ymax,$allow_blank,$y,$m,$d) { }} -// TODO rewrite this buggy sucker +if(! function_exists('relative_date')) { function relative_date($posted_date) { $localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date); + + $abs = strtotime($localtime); + $etime = time() - $abs; - $in_seconds = strtotime($localtime); - - $diff = time() - $in_seconds; + if ($etime < 1) { + return t('less than a second ago'); + } - $months = floor($diff/2592000); - $diff -= $months*2419200; - $weeks = floor($diff/604800); - $diff -= $weeks*604800; - $days = floor($diff/86400); - $diff -= $days*86400; - $hours = floor($diff/3600); - $diff -= $hours*3600; - $minutes = floor($diff/60); - $diff -= $minutes*60; - $seconds = $diff; - - if($months > 2) - return(datetime_convert('UTC',date_default_timezone_get(),$posted_date,'\o\n Y-m-d \a\t H:i:s')); - if ($months>0) { - // over a month old, - return 'over a month ago'; - } else { - if ($weeks>0) { - // weeks and days - $relative_date .= ($relative_date?', ':'').$weeks.' week'.($weeks!=1 ?'s':''); - - } elseif ($days>0) { - // days and hours - $relative_date .= ($relative_date?', ':'').$days.' day'.($days!=1?'s':''); - - } elseif ($hours>0) { - // hours and minutes - $relative_date .= ($relative_date?', ':'').$hours.' hour'.($hours!=1?'s':''); - - } elseif ($minutes>0) { - // minutes only - $relative_date .= ($relative_date?', ':'').$minutes.' minute'.($minutes!=1?'s':''); - } else { - // seconds only - $relative_date .= ($relative_date?', ':'').$seconds.' second'.($seconds!=1?'s':''); + $a = array( 12 * 30 * 24 * 60 * 60 => array( t('year'), t('years')), + 30 * 24 * 60 * 60 => array( t('month'), t('months')), + 7 * 24 * 60 * 60 => array( t('week'), t('weeks')), + 24 * 60 * 60 => array( t('day'), t('days')), + 60 * 60 => array( t('hour'), t('hours')), + 60 => array( t('minute'), t('minutes')), + 1 => array( t('second'), t('seconds')) + ); + + foreach ($a as $secs => $str) { + $d = $etime / $secs; + if ($d >= 1) { + $r = round($d); + return $r . ' ' . (($r == 1) ? $str[0] : $str[1]) . t(' ago'); } } - // show relative date and add proper verbiage - return $relative_date.' ago'; -} +}} + function age($dob,$owner_tz = '',$viewer_tz = '') { if(! intval($dob)) diff --git a/include/dba.php b/include/dba.php index 07142dbad..050068230 100644 --- a/include/dba.php +++ b/include/dba.php @@ -20,6 +20,10 @@ class dba { system_unavailable(); } + public function getdb() { + return $this->db; + } + public function q($sql) { global $debug_text; diff --git a/index.php b/index.php index 96e8583d6..52ea58374 100644 --- a/index.php +++ b/index.php @@ -15,7 +15,9 @@ require_once("dba.php"); $db = new dba($db_host, $db_user, $db_pass, $db_data, $install); unset($db_host, $db_user, $db_pass, $db_data); -require_once("session.php"); +if(! $install) + require_once("session.php"); + require_once("datetime.php"); date_default_timezone_set(($default_timezone) ? $default_timezone : 'UTC'); @@ -101,7 +103,8 @@ $a->page['content'] .= $debug_text; // build page // Navigation (menu) template -require_once("nav.php"); +if($a->module != 'install') + require_once("nav.php"); $page = $a->page; $profile = $a->profile; diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index 5f0f3451f..911d7f02c 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -170,8 +170,9 @@ function dfrn_notify_post(&$a) { ); $url = $a->get_baseurl(); + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); - proc_close(proc_open("php include/notifier.php $url comment-import $posted_id > remote-notify.log &", + proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$url\" \"comment-import\" \"$posted_id\" &", array(),$foo)); if(($importer['notify-flags'] & NOTIFY_COMMENT) && (! $importer['self'])) { diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 5e6b10bea..a4023d1c0 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -34,7 +34,7 @@ function dfrn_poll_init(&$a) { if((int) $xml->status == 1) { $_SESSION['authenticated'] = 1; $_SESSION['visitor_id'] = $r[0]['id']; - $_SESSION['sysmsg'] .= "Hi {$r[0]['name']}" . EOL; + notice( t('Hi ') . $r[0]['name'] . EOL); // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; diff --git a/mod/install.php b/mod/install.php new file mode 100644 index 000000000..cb23b31ed --- /dev/null +++ b/mod/install.php @@ -0,0 +1,153 @@ +getdb()) { + notice( t('Could not connect to database.') . EOL); + return; + } + else + notice( t('Connected to database.') . EOL); + + $tpl = file_get_contents('view/htconfig.tpl'); + $txt = replace_macros($tpl,array( + '$dbhost' => $dbhost, + '$dbuser' => $dbuser, + '$dbpass' => $dbpass, + '$dbdata' => $dbdata, + '$timezone' => $timezone, + '$phpath' => $phpath + )); + $result = file_put_contents('.htconfig.php', $txt); + if(! $result) { + $a->data = $txt; + } + + $errors = load_database($db); + if(! $errors) { + // Our sessions normally are stored in the database. But as we have only managed + // to get it bootstrapped milliseconds ago, we have to apply a bit of trickery so + // that you'll see the following important notice (which is stored in the session). + + session_write_close(); + require_once('session.php'); + session_start(); + $_SESSION['sysmsg'] = ''; + + notice( t('Database import succeeded.') . EOL + . t('IMPORTANT: You will need to (manually) setup a scheduled task for the poller.') . EOL + . t('Please see the file INSTALL.') . EOL ); + goaway($a->get_baseurl()); + } + else { + $db = null; // start fresh + notice( t('Database import failed.') . EOL + . t('You may need to import the file "database.sql" manually using phpmyadmin or mysql.') . EOL + . t('Please see the file INSTALL.') . EOL ); + } +} + + +function install_content(&$a) { + + notice( t('Welcome to the Mistpark Social Network.') . EOL); + + $o .= check_htconfig(); + if(strlen($o)) + return $o; + + if(strlen($a->data)) { + $o .= manual_config($a); + return; + } + + $o .= check_php($phpath); + + require_once('datetime.php'); + + $tpl = file_get_contents('view/install_db.tpl'); + $o .= replace_macros($tpl, array( + '$tzselect' => ((x($_POST,'timezone')) ? select_timezone($_POST['timezone']) : select_timezone()), + '$submit' => t('Submit'), + '$dbhost' => ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : 'localhost'), + '$dbuser' => notags(trim($_POST['dbuser'])), + '$dbpass' => notags(trim($_POST['dbpass'])), + '$dbdata' => notags(trim($_POST['dbdata'])), + '$phpath' => $phpath + )); + + return $o; +} + +function check_php(&$phpath) { + $phpath = trim(shell_exec('which php')); + if(! strlen($phpath)) { + $o .= <<< EOT +Could not find a command line version of PHP in the web server PATH. This is required. Please adjust the configuration file .htconfig.php accordingly. + +EOT; + } + return $o; +} + +function check_htconfig() { + + if(((file_exists('.htconfig.php')) && (! is_writable('.htconfig.php'))) + || (! is_writable('.'))) { + +$o .= <<< EOT + +The web installer needs to be able to create a file called ".htconfig.php" in the top folder of +your web server. It is unable to do so. This is most often a permission setting, as the web server +may not be able to write files in your folder (even if you can). + +Please check with your site documentation or support people to see if this situation can be corrected. +If not, you may be required to perform a manual installation. Please see the file "INSTALL" for instructions. + +EOT; + } + +return $o; +} + + +function manual_config(&$a) { +$o .= <<< EOT +The database configuration file ".htconfig.php" could not be written. Please use the enclosed text to create a configuration file in your web server root. + + +EOT; +return $o; +} + + +function load_database($db) { + + $str = file_get_contents('database.sql'); + $arr = explode(';',$str); + $errors = 0; + foreach($arr as $a) { + if(strlen(trim($a))) { + $r = @$db->q(trim($a)); + if(! $r) { + notice( t('Errors encountered creating database tables.') . $a . EOL); + $errors ++; + } + } + } + return $errors; +} \ No newline at end of file diff --git a/mod/item.php b/mod/item.php index e60b062bb..7efb3db9e 100644 --- a/mod/item.php +++ b/mod/item.php @@ -239,8 +239,9 @@ function item_post(&$a) { } } $url = $a->get_baseurl(); + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); - proc_close(proc_open("php include/notifier.php \"$url\" \"$notify_type\" \"$post_id\" > notify.log &", + proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$url\" \"$notify_type\" \"$post_id\" &", array(),$foo)); goaway($a->get_baseurl() . "/" . $_POST['return'] ); @@ -308,10 +309,11 @@ function item_content(&$a) { $url = $a->get_baseurl(); $drop_id = intval($item['id']); - + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); + // send the notification upstream/downstream as the case may be - proc_close(proc_open("php include/notifier.php \"$url\" \"drop\" \"$drop_id\" > notify.log &", + proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$url\" \"drop\" \"$drop_id\" &", array(),$foo)); goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); diff --git a/mod/message.php b/mod/message.php index 549ce434d..0f55412bb 100644 --- a/mod/message.php +++ b/mod/message.php @@ -68,9 +68,10 @@ function message_post(&$a) { $post_id = $r[0]['id']; $url = $a->get_baseurl(); - + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); + if($post_id) { - proc_close(proc_open("php include/notifier.php \"$url\" \"mail\" \"$post_id\" > mail.log &", + proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$url\" \"mail\" \"$post_id\" &", array(),$foo)); notice( t('Message sent.') . EOL ); } @@ -135,7 +136,9 @@ function message_content(&$a) { if(($a->argc > 2) && ($a->argv[1] == 'redeliver') && intval($a->argv[2])) { $url = $a->get_baseurl(); $post_id = intval($a->argv[2]); - proc_close(proc_open("php include/notifier.php \"$url\" \"mail\" \"$post_id\" > mail.log &", + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); + + proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$url\" \"mail\" \"$post_id\" &", array(),$foo)); goaway($a->get_baseurl() . '/message' ); } diff --git a/mod/notifications.php b/mod/notifications.php index f5bbe9a16..7d465e1c0 100644 --- a/mod/notifications.php +++ b/mod/notifications.php @@ -2,11 +2,11 @@ function notifications_post(&$a) { - if((! x($_SESSION,'authenticated')) || (! (x($_SESSION,'uid')))) { + if(! local_user()) { goaway($a->get_baseurl()); } - $request_id = (($a->argc > 1) ? $a->argv[0] : 0); + $request_id = (($a->argc > 1) ? $a->argv[1] : 0); if($request_id == "all") return; @@ -24,17 +24,17 @@ function notifications_post(&$a) { $intro_id = $r[0]['id']; } else { - $_SESSION['sysmsg'] .= "Invalid request identifier." . EOL; + notice( t('Invalid request identifier.') . EOL); return; } - if($_POST['submit'] == 'Discard') { + if($_POST['submit'] == t('Discard'() { $r = q("DELETE FROM `intro` WHERE `id` = %d LIMIT 1", intval($intro_id)); $r = q("DELETE `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($request_id), intval($_SESSION['uid'])); return; } - if($_POST['submit'] == 'Ignore') { + if($_POST['submit'] == t('Ignore')) { $r = q("UPDATE `intro` SET `ignore` = 1 WHERE `id` = %d LIMIT 1", intval($intro_id)); return; @@ -48,12 +48,13 @@ function notifications_post(&$a) { function notifications_content(&$a) { - $o = ''; - - if((! x($_SESSION,'authenticated')) || (! (x($_SESSION,'uid')))) { + if(! local_user()) { + notice( t('Permission denied.') . EOL); goaway($a->get_baseurl()); } + $o = ''; + if(($a->argc > 1) && ($a->argv[1] == 'all')) $sql_extra = ''; else @@ -63,7 +64,7 @@ function notifications_content(&$a) { $tpl = file_get_contents('view/intros-top.tpl'); $o .= replace_macros($tpl,array( '$hide_url' => ((strlen($sql_extra)) ? 'notifications/all' : 'notifications' ), - '$hide_text' => ((strlen($sql_extra)) ? 'Show Ignored Requests' : 'Hide Ignored Requests') + '$hide_text' => ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) )); $r = q("SELECT `intro`.`id` AS `intro-id`, `intro`.*, `contact`.* @@ -85,14 +86,14 @@ function notifications_content(&$a) { '$contact-id' => $rr['contact-id'], '$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/default-profile.jpg"), '$fullname' => $rr['name'], - '$knowyou' => (($rr['knowyou']) ? 'yes' : 'no'), + '$knowyou' => (($rr['knowyou']) ? t('yes') : t('no')), '$url' => $rr['url'], '$note' => $rr['note'] )); } } else - $_SESSION['sysmsg'] .= "No notifications." . EOL; + notice( t('No notifications.') . EOL); return $o; } \ No newline at end of file diff --git a/mod/photos.php b/mod/photos.php index 6ef94fb55..8936649b7 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -124,11 +124,12 @@ function photos_post(&$a) { $url = $a->get_baseurl(); $drop_id = intval($rr['id']); + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); // send the notification upstream/downstream as the case may be if($rr['visible']) - proc_close(proc_open("php include/notifier.php \"$url\" \"drop\" \"$drop_id\" & ", + proc_close(proc_open("\"php_path\" \"include/notifier.php\" \"$url\" \"drop\" \"$drop_id\" & ", array(),$foo)); } @@ -160,11 +161,12 @@ function photos_post(&$a) { $url = $a->get_baseurl(); $drop_id = intval($i[0]['id']); - + $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); + // send the notification upstream/downstream as the case may be if($i[0]['visible']) - proc_close(proc_open("php include/notifier.php \"$url\" \"drop\" \"$drop_id\" & ", + proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$url\" \"drop\" \"$drop_id\" & ", array(),$foo)); } } diff --git a/view/htconfig.tpl b/view/htconfig.tpl new file mode 100644 index 000000000..f555ace83 --- /dev/null +++ b/view/htconfig.tpl @@ -0,0 +1,44 @@ +path to 'directory/subdirectory'. + +$a->path = ''; + +// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles". +// It can be changed later and only applies to timestamps for anonymous viewers. + +$default_timezone = '$timezone'; + +// What is your site name? + +$a->config['sitename'] = "My Friend Network"; + +// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED. +// Be certain to create your own personal account before setting +// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on +// the registration page. REGISTER_APPROVE requires you set 'admin_email' +// to the email address of an already registered person who can authorise +// and/or approve/deny the request. + +$a->config['register_policy'] = REGISTER_OPEN; +$a->config['register_text'] = ''; +$a->config['admin_email'] = ''; + +// Maximum size of an imported message, 0 is unlimited (but our database 'text' element is limited to 65535). + +$a->config['max_import_size'] = 65535; + +// Location of PHP command line processor + +$a->config['php_path'] = '$phpath'; diff --git a/view/install_db.tpl b/view/install_db.tpl new file mode 100644 index 000000000..00c3b8265 --- /dev/null +++ b/view/install_db.tpl @@ -0,0 +1,40 @@ + +

Mistpark Personal Edition

+

Installation

+ +

+In order to install Mistpark we need to know how to contact your database. Please contact your hosting provider or site administrator if you have questions about these settings. The database you specify below must already exist. If it does not, please create it before continuing. +

+ +
+ + + + + +
+ + + +
+ + + +
+ + + +
+ +
+Please select a default timezone for your website +
+ +$tzselect + +
+ + +
+
+ diff --git a/view/style.css b/view/style.css index 788a18349..83795869b 100644 --- a/view/style.css +++ b/view/style.css @@ -1457,4 +1457,39 @@ input#dfrn-url { .group-delete-wrapper { float: right; margin-right: 50px; -} \ No newline at end of file +} + +#install-dbhost-label, +#install-dbuser-label, +#install-dbpass-label, +#install-dbdata-label, +#install-tz-desc { + float: left; + width: 250px; + margin-top: 10px; + margin-bottom: 10px; + +} + +#install-dbhost, +#install-dbuser, +#install-dbpass, +#install-dbdata { + float: left; + width: 200px; + margin-left: 20px; +} + +#install-dbhost-end, +#install-dbuser-end, +#install-dbpass-end, +#install-dbdata-end, +#install-tz-end { + clear: both; +} + +#install-form select#timezone_select { + float: left; + margin-top: 18px; + margin-left: 20px; +}