diff options
author | Evan Prodromou <evan@prodromou.name> | 2008-05-20 09:05:35 -0400 |
---|---|---|
committer | Evan Prodromou <evan@prodromou.name> | 2008-05-20 09:05:35 -0400 |
commit | e18c5321c49e8559cea55d1130dbfe436f2867a7 (patch) | |
tree | ca4e973f8c7a829365ceb08116d5955881f0385b /lib/util.php | |
parent | 9bbf34c51c9675923926a0477b364c872976a8a4 (diff) |
break out utility functions to util.php
darcs-hash:20080520130535-84dde-5414005cdbd8d39bb548c75388893c7827f2fb16.gz
Diffstat (limited to 'lib/util.php')
-rw-r--r-- | lib/util.php | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/lib/util.php b/lib/util.php new file mode 100644 index 000000000..8148acdf7 --- /dev/null +++ b/lib/util.php @@ -0,0 +1,294 @@ +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008, Controlez-Vous, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* 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 "</$tag>"; +} + +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; +} |