From e18c5321c49e8559cea55d1130dbfe436f2867a7 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 20 May 2008 09:05:35 -0400 Subject: [PATCH] break out utility functions to util.php darcs-hash:20080520130535-84dde-5414005cdbd8d39bb548c75388893c7827f2fb16.gz --- actions/showstream.php | 6 +- lib/common.php | 275 +------------------------------------- lib/util.php | 294 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 297 insertions(+), 278 deletions(-) create mode 100644 lib/util.php diff --git a/actions/showstream.php b/actions/showstream.php index d40b815810..094a7efbbd 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -194,8 +194,7 @@ class ShowstreamAction extends StreamAction { // XXX: WORM cache this $subs = DB_DataObject::factory('subscription'); $subs->subscriber = $profile->id; - $subs->whereAdd("subscriber=".$profile->id); - $subs_count = $subs->count(DB_DATAOBJECT_WHEREADD_ONLY); + $subs_count = $subs->count(); if (!$subs_count) { $subs_count = 0; @@ -203,8 +202,7 @@ class ShowstreamAction extends StreamAction { $subbed = DB_DataObject::factory('subscription'); $subbed->subscribed = $profile->id; - $subbed->whereAdd("subscribed=".$profile->id); - $subbed_count = $subbed->count(DB_DATAOBJECT_WHEREADD_ONLY); + $subbed_count = $subbed->count(); if (!$subbed_count) { $subbed_count = 0; diff --git a/lib/common.php b/lib/common.php index a35db3a9b2..ea83682ea7 100644 --- a/lib/common.php +++ b/lib/common.php @@ -57,6 +57,7 @@ $config['db'] = 'quote_identifiers' => false); require_once(INSTALLDIR.'/config.php'); +require_once(INSTALLDIR.'/lib/util.php'); require_once(INSTALLDIR.'/lib/action.php'); require_once(INSTALLDIR.'/classes/Avatar.php'); @@ -65,277 +66,3 @@ require_once(INSTALLDIR.'/classes/Profile.php'); require_once(INSTALLDIR.'/classes/Remote_profile.php'); require_once(INSTALLDIR.'/classes/Subscription.php'); require_once(INSTALLDIR.'/classes/User.php'); - -# Show a server error - -function common_server_error($msg) { - header('Status: 500 Server Error'); - header('Content-type: text/plain'); - - print $msg; - exit(); -} - -# Show a user error -function common_user_error($msg, $code=200) { - common_show_header('Error'); - common_element('div', array('class' => 'error'), $msg); - common_show_footer(); -} - -# Start an HTML element -function common_element_start($tag, $attrs=NULL) { - print "<$tag"; - if (is_array($attrs)) { - foreach ($attrs as $name => $value) { - print " $name='$value'"; - } - } else if (is_string($attrs)) { - print " class='$attrs'"; - } - print '>'; -} - -function common_element_end($tag) { - print ""; -} - -function common_element($tag, $attrs=NULL, $content=NULL) { - common_element_start($tag, $attrs); - if ($content) print htmlspecialchars($content); - common_element_end($tag); -} - -function common_show_header($pagetitle) { - global $config; - common_element_start('html'); - common_element_start('head'); - common_element('title', NULL, - $pagetitle . " - " . $config['site']['name']); - common_element_end('head'); - common_element_start('body'); - common_element('h1', 'title', $pagetitle); - common_head_menu(); -} - -function common_show_footer() { - common_foot_menu(); - common_element_end('body'); - common_element_end('html'); -} - -function common_head_menu() { - $user = common_current_user(); - common_element_start('ul', 'headmenu'); - common_menu_item(common_local_url('doc', array('title' => 'help')), - _t('Help')); - if ($user) { - common_menu_item(common_local_url('all', array('nickname' => - $user->nickname)), - _t('Home')); - common_menu_item(common_local_url('showstream', array('nickname' => - $user->nickname)), - _t('Profile'), $user->fullname || $user->nickname); - common_menu_item(common_local_url('profilesettings'), - _t('Settings')); - common_menu_item(common_local_url('logout'), - _t('Logout')); - } else { - common_menu_item(common_local_url('login'), - _t('Login')); - common_menu_item(common_local_url('register'), - _t('Register')); - } - common_element_end('ul'); -} - -function common_foot_menu() { - common_element_start('ul', 'footmenu'); - common_menu_item(common_local_url('doc', array('title' => 'about')), - _t('About')); - common_menu_item(common_local_url('doc', array('title' => 'help')), - _t('Help')); - common_menu_item(common_local_url('doc', array('title' => 'privacy')), - _t('Privacy')); -} - -function common_menu_item($url, $text, $title=NULL) { - $attrs['href'] = $url; - if ($title) { - $attrs['title'] = $title; - } - common_element_start('li', 'menuitem'); - common_element('a', $attrs, $text); - common_element_end('li'); -} - -function common_input($id, $label, $value=NULL) { - common_element('label', array('for' => $id), $label); - $attrs = array('name' => $id, - 'type' => 'text', - 'id' => $id); - if ($value) { - $attrs['value'] = htmlspecialchars($value); - } - common_element('input', $attrs); -} - -function common_password($id, $label) { - common_element('label', array('for' => $id), $label); - $attrs = array('name' => $id, - 'type' => 'password', - 'id' => $id); - common_element('input', $attrs); -} - -# salted, hashed passwords are stored in the DB - -function common_munge_password($id, $password) { - return md5($id . $password); -} - -# check if a username exists and has matching password -function common_check_user($nickname, $password) { - $user = User::staticGet('nickname', $nickname); - if (is_null($user)) { - return false; - } else { - return (0 == strcmp(common_munge_password($password, $user->id), - $user->password)); - } -} - -# is the current user logged in? -function common_logged_in() { - return (!is_null(common_current_user())); -} - -function common_have_session() { - return (0 != strcmp(session_id(), '')); -} - -function common_ensure_session() { - if (!common_have_session()) { - @session_start(); - } -} - -function common_set_user($nickname) { - if (is_null($nickname) && common_have_session()) { - unset($_SESSION['userid']); - return true; - } else { - $user = User::staticGet('nickname', $nickname); - if ($user) { - common_ensure_session(); - $_SESSION['userid'] = $user->id; - return true; - } else { - return false; - } - } - return false; -} - -# who is the current user? -function common_current_user() { - static $user = NULL; # FIXME: global memcached - if (is_null($user)) { - common_ensure_session(); - $id = $_SESSION['userid']; - if ($id) { - $user = User::staticGet($id); - } - } - return $user; -} - -# get canonical version of nickname for comparison -function common_canonical_nickname($nickname) { - # XXX: UTF-8 canonicalization (like combining chars) - return $nickname; -} - -# get canonical version of email for comparison -function common_canonical_email($email) { - # XXX: canonicalize UTF-8 - # XXX: lcase the domain part - return $email; -} - -function common_render_content($text) { - # XXX: @ messages - # XXX: # tags - # XXX: machine tags - return htmlspecialchars($text); -} - -// where should the avatar go for this user? - -function common_avatar_filename($user, $extension, $size=NULL) { - global $config; - - if ($size) { - return $user->id . '-' . $size . $extension; - } else { - return $user->id . '-original' . $extension; - } -} - -function common_avatar_path($filename) { - global $config; - return $config['avatar']['directory'] . '/' . $filename; -} - -function common_avatar_url($filename) { - global $config; - return $config['avatar']['path'] . '/' . $filename; -} - -function common_local_url($action, $args=NULL) { - global $config; - /* XXX: pretty URLs */ - $extra = ''; - if ($args) { - foreach ($args as $key => $value) { - $extra .= "&${key}=${value}"; - } - } - $pathpart = ($config['site']['path']) ? $config['site']['path']."/" : ''; - return "http://".$config['site']['server'].'/'.$pathpart."index.php?action=${action}${extra}"; -} - -function common_date_string($dt) { - // XXX: do some sexy date formatting - // return date(DATE_RFC822, $dt); - return $dt; -} - -function common_redirect($url, $code=307) { - static $status = array(301 => "Moved Permanently", - 302 => "Found", - 303 => "See Other", - 307 => "Temporary Redirect"); - header("Status: ${code} $status[$code]"); - header("Location: $url"); - common_element('a', array('href' => $url), $url); -} - -function common_broadcast_notices($id) { - // XXX: broadcast notices to remote subscribers - // XXX: broadcast notices to SMS - // XXX: broadcast notices to Jabber - // XXX: broadcast notices to other IM - // XXX: use a queue system like http://code.google.com/p/microapps/wiki/NQDQ - return true; -} - -function common_profile_url($nickname) { - return common_local_url('showstream', array('nickname' => $nickname)); -} - -// XXX: set up gettext - -function _t($str) { - return $str; -} diff --git a/lib/util.php b/lib/util.php new file mode 100644 index 0000000000..8148acdf78 --- /dev/null +++ b/lib/util.php @@ -0,0 +1,294 @@ +. + */ + +/* XXX: break up into separate modules (HTTP, HTML, user, files) */ + +# Show a server error + +function common_server_error($msg) { + header('Status: 500 Server Error'); + header('Content-type: text/plain'); + + print $msg; + exit(); +} + +# Show a user error +function common_user_error($msg, $code=200) { + common_show_header('Error'); + common_element('div', array('class' => 'error'), $msg); + common_show_footer(); +} + +# Start an HTML element +function common_element_start($tag, $attrs=NULL) { + print "<$tag"; + if (is_array($attrs)) { + foreach ($attrs as $name => $value) { + print " $name='$value'"; + } + } else if (is_string($attrs)) { + print " class='$attrs'"; + } + print '>'; +} + +function common_element_end($tag) { + print ""; +} + +function common_element($tag, $attrs=NULL, $content=NULL) { + common_element_start($tag, $attrs); + if ($content) print htmlspecialchars($content); + common_element_end($tag); +} + +function common_show_header($pagetitle) { + global $config; + common_element_start('html'); + common_element_start('head'); + common_element('title', NULL, + $pagetitle . " - " . $config['site']['name']); + common_element_end('head'); + common_element_start('body'); + common_element('h1', 'title', $pagetitle); + common_head_menu(); +} + +function common_show_footer() { + common_foot_menu(); + common_element_end('body'); + common_element_end('html'); +} + +function common_head_menu() { + $user = common_current_user(); + common_element_start('ul', 'headmenu'); + common_menu_item(common_local_url('doc', array('title' => 'help')), + _t('Help')); + if ($user) { + common_menu_item(common_local_url('all', array('nickname' => + $user->nickname)), + _t('Home')); + common_menu_item(common_local_url('showstream', array('nickname' => + $user->nickname)), + _t('Profile'), $user->fullname || $user->nickname); + common_menu_item(common_local_url('profilesettings'), + _t('Settings')); + common_menu_item(common_local_url('logout'), + _t('Logout')); + } else { + common_menu_item(common_local_url('login'), + _t('Login')); + common_menu_item(common_local_url('register'), + _t('Register')); + } + common_element_end('ul'); +} + +function common_foot_menu() { + common_element_start('ul', 'footmenu'); + common_menu_item(common_local_url('doc', array('title' => 'about')), + _t('About')); + common_menu_item(common_local_url('doc', array('title' => 'help')), + _t('Help')); + common_menu_item(common_local_url('doc', array('title' => 'privacy')), + _t('Privacy')); +} + +function common_menu_item($url, $text, $title=NULL) { + $attrs['href'] = $url; + if ($title) { + $attrs['title'] = $title; + } + common_element_start('li', 'menuitem'); + common_element('a', $attrs, $text); + common_element_end('li'); +} + +function common_input($id, $label, $value=NULL) { + common_element('label', array('for' => $id), $label); + $attrs = array('name' => $id, + 'type' => 'text', + 'id' => $id); + if ($value) { + $attrs['value'] = htmlspecialchars($value); + } + common_element('input', $attrs); +} + +function common_password($id, $label) { + common_element('label', array('for' => $id), $label); + $attrs = array('name' => $id, + 'type' => 'password', + 'id' => $id); + common_element('input', $attrs); +} + +# salted, hashed passwords are stored in the DB + +function common_munge_password($id, $password) { + return md5($id . $password); +} + +# check if a username exists and has matching password +function common_check_user($nickname, $password) { + $user = User::staticGet('nickname', $nickname); + if (is_null($user)) { + return false; + } else { + return (0 == strcmp(common_munge_password($password, $user->id), + $user->password)); + } +} + +# is the current user logged in? +function common_logged_in() { + return (!is_null(common_current_user())); +} + +function common_have_session() { + return (0 != strcmp(session_id(), '')); +} + +function common_ensure_session() { + if (!common_have_session()) { + @session_start(); + } +} + +function common_set_user($nickname) { + if (is_null($nickname) && common_have_session()) { + unset($_SESSION['userid']); + return true; + } else { + $user = User::staticGet('nickname', $nickname); + if ($user) { + common_ensure_session(); + $_SESSION['userid'] = $user->id; + return true; + } else { + return false; + } + } + return false; +} + +# who is the current user? +function common_current_user() { + static $user = NULL; # FIXME: global memcached + if (is_null($user)) { + common_ensure_session(); + $id = $_SESSION['userid']; + if ($id) { + $user = User::staticGet($id); + } + } + return $user; +} + +# get canonical version of nickname for comparison +function common_canonical_nickname($nickname) { + # XXX: UTF-8 canonicalization (like combining chars) + return $nickname; +} + +# get canonical version of email for comparison +function common_canonical_email($email) { + # XXX: canonicalize UTF-8 + # XXX: lcase the domain part + return $email; +} + +function common_render_content($text) { + # XXX: @ messages + # XXX: # tags + # XXX: machine tags + return htmlspecialchars($text); +} + +// where should the avatar go for this user? + +function common_avatar_filename($user, $extension, $size=NULL) { + global $config; + + if ($size) { + return $user->id . '-' . $size . $extension; + } else { + return $user->id . '-original' . $extension; + } +} + +function common_avatar_path($filename) { + global $config; + return $config['avatar']['directory'] . '/' . $filename; +} + +function common_avatar_url($filename) { + global $config; + return $config['avatar']['path'] . '/' . $filename; +} + +function common_local_url($action, $args=NULL) { + global $config; + /* XXX: pretty URLs */ + $extra = ''; + if ($args) { + foreach ($args as $key => $value) { + $extra .= "&${key}=${value}"; + } + } + $pathpart = ($config['site']['path']) ? $config['site']['path']."/" : ''; + return "http://".$config['site']['server'].'/'.$pathpart."index.php?action=${action}${extra}"; +} + +function common_date_string($dt) { + // XXX: do some sexy date formatting + // return date(DATE_RFC822, $dt); + return $dt; +} + +function common_redirect($url, $code=307) { + static $status = array(301 => "Moved Permanently", + 302 => "Found", + 303 => "See Other", + 307 => "Temporary Redirect"); + header("Status: ${code} $status[$code]"); + header("Location: $url"); + common_element('a', array('href' => $url), $url); +} + +function common_broadcast_notices($id) { + // XXX: broadcast notices to remote subscribers + // XXX: broadcast notices to SMS + // XXX: broadcast notices to Jabber + // XXX: broadcast notices to other IM + // XXX: use a queue system like http://code.google.com/p/microapps/wiki/NQDQ + return true; +} + +function common_profile_url($nickname) { + return common_local_url('showstream', array('nickname' => $nickname)); +} + +// XXX: set up gettext + +function _t($str) { + return $str; +}