-hunk ./lib/util.php 22
--# Show a server error
-+// Show a server error
-hunk ./lib/util.php 25
-- static $status = array(500 => 'Internal Server Error',
-- 501 => 'Not Implemented',
-- 502 => 'Bad Gateway',
-- 503 => 'Service Unavailable',
-- 504 => 'Gateway Timeout',
-- 505 => 'HTTP Version Not Supported');
-+ static $status = array(500 => 'Internal Server Error',
-+ 501 => 'Not Implemented',
-+ 502 => 'Bad Gateway',
-+ 503 => 'Service Unavailable',
-+ 504 => 'Gateway Timeout',
-+ 505 => 'HTTP Version Not Supported');
-hunk ./lib/util.php 32
-- if (!array_key_exists($code, $status)) {
-- $code = 500;
-- }
-+ if (!array_key_exists($code, $status)) {
-+ $code = 500;
-+ }
-hunk ./lib/util.php 36
-- $status_string = $status[$code];
-+ $status_string = $status[$code];
-hunk ./lib/util.php 38
-- header('HTTP/1.1 '.$code.' '.$status_string);
-- header('Content-type: text/plain');
-+ header('HTTP/1.1 '.$code.' '.$status_string);
-+ header('Content-type: text/plain');
-hunk ./lib/util.php 41
-- print $msg;
-- print "\n";
-- exit();
-+ print $msg;
-+ print "\n";
-+ exit();
-hunk ./lib/util.php 46
--# Show a user error
-+// Show a user error
-hunk ./lib/util.php 48
-- static $status = array(400 => 'Bad Request',
-- 401 => 'Unauthorized',
-- 402 => 'Payment Required',
-- 403 => 'Forbidden',
-- 404 => 'Not Found',
-- 405 => 'Method Not Allowed',
-- 406 => 'Not Acceptable',
-- 407 => 'Proxy Authentication Required',
-- 408 => 'Request Timeout',
-- 409 => 'Conflict',
-- 410 => 'Gone',
-- 411 => 'Length Required',
-- 412 => 'Precondition Failed',
-- 413 => 'Request Entity Too Large',
-- 414 => 'Request-URI Too Long',
-- 415 => 'Unsupported Media Type',
-- 416 => 'Requested Range Not Satisfiable',
-- 417 => 'Expectation Failed');
-+ static $status = array(400 => 'Bad Request',
-+ 401 => 'Unauthorized',
-+ 402 => 'Payment Required',
-+ 403 => 'Forbidden',
-+ 404 => 'Not Found',
-+ 405 => 'Method Not Allowed',
-+ 406 => 'Not Acceptable',
-+ 407 => 'Proxy Authentication Required',
-+ 408 => 'Request Timeout',
-+ 409 => 'Conflict',
-+ 410 => 'Gone',
-+ 411 => 'Length Required',
-+ 412 => 'Precondition Failed',
-+ 413 => 'Request Entity Too Large',
-+ 414 => 'Request-URI Too Long',
-+ 415 => 'Unsupported Media Type',
-+ 416 => 'Requested Range Not Satisfiable',
-+ 417 => 'Expectation Failed');
-hunk ./lib/util.php 67
-- if (!array_key_exists($code, $status)) {
-- $code = 400;
-- }
-+ if (!array_key_exists($code, $status)) {
-+ $code = 400;
-+ }
-hunk ./lib/util.php 71
-- $status_string = $status[$code];
-+ $status_string = $status[$code];
-hunk ./lib/util.php 73
-- header('HTTP/1.1 '.$code.' '.$status_string);
-+ header('HTTP/1.1 '.$code.' '.$status_string);
-hunk ./lib/util.php 75
-- common_show_header('Error');
-- common_element('div', array('class' => 'error'), $msg);
-- common_show_footer();
-+ common_show_header('Error');
-+ common_element('div', array('class' => 'error'), $msg);
-+ common_show_footer();
-hunk ./lib/util.php 82
--# Start an HTML element
--function common_element_start($tag, $attrs=NULL) {
-- global $xw;
-- $xw->startElement($tag);
-- if (is_array($attrs)) {
-- foreach ($attrs as $name => $value) {
-- $xw->writeAttribute($name, $value);
-- }
-- } else if (is_string($attrs)) {
-- $xw->writeAttribute('class', $attrs);
-- }
-+// Start an HTML element
-+function common_element_start($tag, $attrs=null) {
-+ global $xw;
-+ $xw->startElement($tag);
-+ if (is_array($attrs)) {
-+ foreach ($attrs as $name => $value) {
-+ $xw->writeAttribute($name, $value);
-+ }
-+ } else if (is_string($attrs)) {
-+ $xw->writeAttribute('class', $attrs);
-+ }
-hunk ./lib/util.php 96
-- static $empty_tag = array('base', 'meta', 'link', 'hr',
-- 'br', 'param', 'img', 'area',
-- 'input', 'col');
-- global $xw;
-- # XXX: check namespace
-- if (in_array($tag, $empty_tag)) {
-- $xw->endElement();
-- } else {
-- $xw->fullEndElement();
-- }
-+ static $empty_tag = array('base', 'meta', 'link', 'hr',
-+ 'br', 'param', 'img', 'area',
-+ 'input', 'col');
-+ global $xw;
-+ // XXX: check namespace
-+ if (in_array($tag, $empty_tag)) {
-+ $xw->endElement();
-+ } else {
-+ $xw->fullEndElement();
-+ }
-hunk ./lib/util.php 108
--function common_element($tag, $attrs=NULL, $content=NULL) {
-- common_element_start($tag, $attrs);
-- global $xw;
-- if (!is_null($content)) {
-- $xw->text($content);
-- }
-- common_element_end($tag);
-+function common_element($tag, $attrs=null, $content=null) {
-+ common_element_start($tag, $attrs);
-+ global $xw;
-+ if (!is_null($content)) {
-+ $xw->text($content);
-+ }
-+ common_element_end($tag);
-hunk ./lib/util.php 117
--function common_start_xml($doc=NULL, $public=NULL, $system=NULL, $indent=true) {
-- global $xw;
-- $xw = new XMLWriter();
-- $xw->openURI('php://output');
-- $xw->setIndent($indent);
-- $xw->startDocument('1.0', 'UTF-8');
-- if ($doc) {
-- $xw->writeDTD($doc, $public, $system);
-- }
-+function common_start_xml($doc=null, $public=null, $system=null, $indent=true) {
-+ global $xw;
-+ $xw = new XMLWriter();
-+ $xw->openURI('php://output');
-+ $xw->setIndent($indent);
-+ $xw->startDocument('1.0', 'UTF-8');
-+ if ($doc) {
-+ $xw->writeDTD($doc, $public, $system);
-+ }
-hunk ./lib/util.php 129
-- global $xw;
-- $xw->endDocument();
-- $xw->flush();
-+ global $xw;
-+ $xw->endDocument();
-+ $xw->flush();
-hunk ./lib/util.php 141
-- $language . ".UTF8",
-- $language . ".utf-8",
-- $language . ".UTF-8",
-- $language);
-+ $language . ".UTF8",
-+ $language . ".utf-8",
-+ $language . ".UTF-8",
-+ $language);
-hunk ./lib/util.php 148
-- mb_internal_encoding('UTF-8');
-- $language = common_language();
-- # So we don't have to make people install the gettext locales
-- $locale_set = common_init_locale($language);
-- bindtextdomain("laconica", common_config('site','locale_path'));
-- bind_textdomain_codeset("laconica", "UTF-8");
-- textdomain("laconica");
-- setlocale(LC_CTYPE, 'C');
-- if(!$locale_set) {
-- common_log(LOG_INFO,'Language requested:'.$language.' - locale could not be set:',__FILE__);
-- }
-+ mb_internal_encoding('UTF-8');
-+ $language = common_language();
-+ // So we don't have to make people install the gettext locales
-+ $locale_set = common_init_locale($language);
-+ bindtextdomain("laconica", common_config('site','locale_path'));
-+ bind_textdomain_codeset("laconica", "UTF-8");
-+ textdomain("laconica");
-+ setlocale(LC_CTYPE, 'C');
-+ if(!$locale_set) {
-+ common_log(LOG_INFO,'Language requested:'.$language.' - locale could not be set:',__FILE__);
-+ }
-hunk ./lib/util.php 163
--function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=NULL) {
-+function common_show_header($pagetitle, $callable=null, $data=null, $headercall=null) {
-hunk ./lib/util.php 165
-- global $config, $xw;
-+ global $config, $xw;
-hunk ./lib/util.php 168
-- common_start_html();
-+ common_start_html();
-hunk ./lib/util.php 170
-- common_element_start('head');
-- common_element('title', NULL,
-- $pagetitle . " - " . $config['site']['name']);
-- common_element('link', array('rel' => 'stylesheet',
-- 'type' => 'text/css',
-- 'href' => theme_path('display.css') . '?version=' . LACONICA_VERSION,
-- 'media' => 'screen, projection, tv'));
-- foreach (array(6,7) as $ver) {
-- if (file_exists(theme_file('ie'.$ver.'.css'))) {
-- # Yes, IE people should be put in jail.
-- $xw->writeComment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '.
-- 'href="'.theme_path('ie'.$ver.'.css').'?version='.LACONICA_VERSION.'" /><![endif]');
-- }
-- }
-+ common_element_start('head');
-+ common_element('title', null,
-+ $pagetitle . " - " . $config['site']['name']);
-+ common_element('link', array('rel' => 'stylesheet',
-+ 'type' => 'text/css',
-+ 'href' => theme_path('display.css') . '?version=' . LACONICA_VERSION,
-+ 'media' => 'screen, projection, tv'));
-+ foreach (array(6,7) as $ver) {
-+ if (file_exists(theme_file('ie'.$ver.'.css'))) {
-+ // Yes, IE people should be put in jail.
-+ $xw->writeComment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '.
-+ 'href="'.theme_path('ie'.$ver.'.css').'?version='.LACONICA_VERSION.'" /><![endif]');
-+ }
-+ }
-hunk ./lib/util.php 185
-- common_element('script', array('type' => 'text/javascript',
-- 'src' => common_path('js/jquery.min.js')),
-- ' ');
-- common_element('script', array('type' => 'text/javascript',
-- 'src' => common_path('js/jquery.form.js')),
-- ' ');
-- common_element('script', array('type' => 'text/javascript',
-- 'src' => common_path('js/xbImportNode.js')),
-- ' ');
-- common_element('script', array('type' => 'text/javascript',
-- 'src' => common_path('js/util.js?version='.LACONICA_VERSION)),
-- ' ');
-- common_element('link', array('rel' => 'search', 'type' => 'application/opensearchdescription+xml',
-- 'href' => common_local_url('opensearch', array('type' => 'people')),
-- 'title' => common_config('site', 'name').' People Search'));
-+ common_element('script', array('type' => 'text/javascript',
-+ 'src' => common_path('js/jquery.min.js')),
-+ ' ');
-+ common_element('script', array('type' => 'text/javascript',
-+ 'src' => common_path('js/jquery.form.js')),
-+ ' ');
-+ common_element('script', array('type' => 'text/javascript',
-+ 'src' => common_path('js/xbImportNode.js')),
-+ ' ');
-+ common_element('script', array('type' => 'text/javascript',
-+ 'src' => common_path('js/util.js?version='.LACONICA_VERSION)),
-+ ' ');
-+ common_element('link', array('rel' => 'search', 'type' => 'application/opensearchdescription+xml',
-+ 'href' => common_local_url('opensearch', array('type' => 'people')),
-+ 'title' => common_config('site', 'name').' People Search'));
-hunk ./lib/util.php 201
-- common_element('link', array('rel' => 'search', 'type' => 'application/opensearchdescription+xml',
-- 'href' => common_local_url('opensearch', array('type' => 'notice')),
-- 'title' => common_config('site', 'name').' Notice Search'));
-+ common_element('link', array('rel' => 'search', 'type' => 'application/opensearchdescription+xml',
-+ 'href' => common_local_url('opensearch', array('type' => 'notice')),
-+ 'title' => common_config('site', 'name').' Notice Search'));
-hunk ./lib/util.php 205
-- if ($callable) {
-- if ($data) {
-- call_user_func($callable, $data);
-- } else {
-- call_user_func($callable);
-- }
-- }
-- common_element_end('head');
-- common_element_start('body', $action);
-- common_element_start('div', array('id' => 'wrap'));
-- common_element_start('div', array('id' => 'header'));
-- common_nav_menu();
-- if ((isset($config['site']['logo']) && is_string($config['site']['logo']) && (strlen($config['site']['logo']) > 0))
-- || file_exists(theme_file('logo.png')))
-- {
-- common_element_start('a', array('href' => common_local_url('public')));
-- common_element('img', array('src' => isset($config['site']['logo']) ?
-- ($config['site']['logo']) : theme_path('logo.png'),
-- 'alt' => $config['site']['name'],
-- 'id' => 'logo'));
-- common_element_end('a');
-- } else {
-- common_element_start('p', array('id' => 'branding'));
-- common_element('a', array('href' => common_local_url('public')),
-- $config['site']['name']);
-- common_element_end('p');
-- }
-+ if ($callable) {
-+ if ($data) {
-+ call_user_func($callable, $data);
-+ } else {
-+ call_user_func($callable);
-+ }
-+ }
-+ common_element_end('head');
-+ common_element_start('body', $action);
-+ common_element_start('div', array('id' => 'wrap'));
-+ common_element_start('div', array('id' => 'header'));
-+ common_nav_menu();
-+ if ((isset($config['site']['logo']) && is_string($config['site']['logo']) && (strlen($config['site']['logo']) > 0))
-+ || file_exists(theme_file('logo.png')))
+hunk ./lib/action.php 2
+-/*
++/**
+hunk ./lib/action.php 20
+-if (!defined('LACONICA')) { exit(1); }
++if (!defined('LACONICA')) {
++ exit(1);
++}
+hunk ./lib/action.php 24
+-class Action { // lawsuit
++class Action // lawsuit
++{
+hunk ./lib/action.php 27
+- var $args;
++ var $args;
+hunk ./lib/action.php 29
+- function Action() {
+- }
++ function Action()
+ {
-+ common_element_start('a', array('href' => common_local_url('public')));
-+ common_element('img', array('src' => isset($config['site']['logo']) ?
-+ ($config['site']['logo']) : theme_path('logo.png'),
-+ 'alt' => $config['site']['name'],
-+ 'id' => 'logo'));
-+ common_element_end('a');
-+ } else {
-+ common_element_start('p', array('id' => 'branding'));
-+ common_element('a', array('href' => common_local_url('public')),
-+ $config['site']['name']);
-+ common_element_end('p');
-+ }
-hunk ./lib/util.php 233
-- common_element('h1', 'pagetitle', $pagetitle);
-+ common_element('h1', 'pagetitle', $pagetitle);
-hunk ./lib/util.php 235
-- if ($headercall) {
-- if ($data) {
-- call_user_func($headercall, $data);
-- } else {
-- call_user_func($headercall);
-- }
-- }
-- common_element_end('div');
-- common_element_start('div', array('id' => 'content'));
-+ if ($headercall) {
-+ if ($data) {
-+ call_user_func($headercall, $data);
-+ } else {
-+ call_user_func($headercall);
-+ }
-+ }
-+ common_element_end('div');
-+ common_element_start('div', array('id' => 'content'));
-hunk ./lib/util.php 246
--function common_start_html($type=NULL, $indent=true) {
-+function common_start_html($type=null, $indent=true) {
-hunk ./lib/util.php 248
-- if (!$type) {
-- $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL;
-+ if (!$type) {
-+ $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null;
-hunk ./lib/util.php 251
-- # XXX: allow content negotiation for RDF, RSS, or XRDS
-+ // XXX: allow content negotiation for RDF, RSS, or XRDS
-hunk ./lib/util.php 253
-- $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
-- common_accept_to_prefs(PAGE_TYPE_PREFS));
-+ $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
-+ common_accept_to_prefs(PAGE_TYPE_PREFS));
-hunk ./lib/util.php 256
-- if (!$type) {
-- common_user_error(_('This page is not available in a media type you accept'), 406);
-- exit(0);
-- }
-- }
-+ if (!$type) {
-+ common_user_error(_('This page is not available in a media type you accept'), 406);
-+ exit(0);
-+ }
-+ }
-hunk ./lib/util.php 262
-- header('Content-Type: '.$type);
-+ header('Content-Type: '.$type);
-hunk ./lib/util.php 264
-- common_start_xml('html',
-- '-//W3C//DTD XHTML 1.0 Strict//EN',
-- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd', $indent);
-+ common_start_xml('html',
-+ '-//W3C//DTD XHTML 1.0 Strict//EN',
-+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd', $indent);
-hunk ./lib/util.php 268
-- # FIXME: correct language for interface
-+ // FIXME: correct language for interface
-hunk ./lib/util.php 270
-- $language = common_language();
-+ $language = common_language();
-hunk ./lib/util.php 272
-- common_element_start('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
-- 'xml:lang' => $language,
-- 'lang' => $language));
-+ common_element_start('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
-+ 'xml:lang' => $language,
-+ 'lang' => $language));
-hunk ./lib/util.php 278
-- global $xw, $config;
-- common_element_end('div'); # content div
-- common_foot_menu();
-- common_element_start('div', array('id' => 'footer'));
-- common_element_start('div', 'laconica');
-- if (common_config('site', 'broughtby')) {
-- $instr = _('**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%). ');
-- } else {
-- $instr = _('**%%site.name%%** is a microblogging service. ');
-- }
-- $instr .= sprintf(_('It runs the [Laconica](http://laconi.ca/) microblogging software, version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), LACONICA_VERSION);
-+ global $xw, $config;
-+ common_element_end('div'); // content div
-+ common_foot_menu();
-+ common_element_start('div', array('id' => 'footer'));
-+ common_element_start('div', 'laconica');
-+ if (common_config('site', 'broughtby')) {
-+ $instr = _('**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%). ');
-+ } else {
-+ $instr = _('**%%site.name%%** is a microblogging service. ');
-+ }
-+ $instr .= sprintf(_('It runs the [Laconica](http://laconi.ca/) microblogging software, version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), LACONICA_VERSION);
-hunk ./lib/util.php 291
-- common_element_end('div');
-- common_element('img', array('id' => 'cc',
-- 'src' => $config['license']['image'],
-- 'alt' => $config['license']['title']));
-- common_element_start('p');
-- common_text(_('Unless otherwise specified, contents of this site are copyright by the contributors and available under the '));
-- common_element('a', array('class' => 'license',
-- 'rel' => 'license',
-- 'href' => $config['license']['url']),
-- $config['license']['title']);
-- common_text(_('. Contributors should be attributed by full name or nickname.'));
-- common_element_end('p');
-- common_element_end('div');
-- common_element_end('div');
-- common_element_end('body');
-- common_element_end('html');
-- common_end_xml();
-+ common_element_end('div');
-+ common_element('img', array('id' => 'cc',
-+ 'src' => $config['license']['image'],
-+ 'alt' => $config['license']['title']));
-+ common_element_start('p');
-+ common_text(_('Unless otherwise specified, contents of this site are copyright by the contributors and available under the '));
-+ common_element('a', array('class' => 'license',
-+ 'rel' => 'license',
-+ 'href' => $config['license']['url']),
-+ $config['license']['title']);
-+ common_text(_('. Contributors should be attributed by full name or nickname.'));
-+ common_element_end('p');
-+ common_element_end('div');
-+ common_element_end('div');
-+ common_element_end('body');
-+ common_element_end('html');
-+ common_end_xml();
-hunk ./lib/util.php 311
-- global $xw;
-- $xw->text($txt);
-+ global $xw;
-+ $xw->text($txt);
-hunk ./lib/util.php 316
-- global $xw;
-- $xw->writeRaw($xml);
-+ global $xw;
-+ $xw->writeRaw($xml);
-hunk ./lib/util.php 321
-- $user = common_current_user();
-- common_element_start('ul', array('id' => 'nav'));
-- if ($user) {
-- common_menu_item(common_local_url('all', array('nickname' => $user->nickname)),
-- _('Home'));
-- }
-- common_menu_item(common_local_url('peoplesearch'), _('Search'));
-- if ($user) {
-- common_menu_item(common_local_url('profilesettings'),
-- _('Settings'));
-- common_menu_item(common_local_url('invite'),
-- _('Invite'));
-- common_menu_item(common_local_url('logout'),
-- _('Logout'));
-- } else {
-- common_menu_item(common_local_url('login'), _('Login'));
-- if (!common_config('site', 'closed')) {
-- common_menu_item(common_local_url('register'), _('Register'));
-- }
-- common_menu_item(common_local_url('openidlogin'), _('OpenID'));
-- }
-- common_menu_item(common_local_url('doc', array('title' => 'help')),
-- _('Help'));
-- common_element_end('ul');
-+ $user = common_current_user();
-+ common_element_start('ul', array('id' => 'nav'));
-+ if ($user) {
-+ common_menu_item(common_local_url('all', array('nickname' => $user->nickname)),
-+ _('Home'));
-+ }
-+ common_menu_item(common_local_url('peoplesearch'), _('Search'));
-+ if ($user) {
-+ common_menu_item(common_local_url('profilesettings'),
-+ _('Settings'));
-+ common_menu_item(common_local_url('invite'),
-+ _('Invite'));
-+ common_menu_item(common_local_url('logout'),
-+ _('Logout'));
-+ } else {
-+ common_menu_item(common_local_url('login'), _('Login'));
-+ if (!common_config('site', 'closed')) {
-+ common_menu_item(common_local_url('register'), _('Register'));
-+ }
-+ common_menu_item(common_local_url('openidlogin'), _('OpenID'));
-+ }
-+ common_menu_item(common_local_url('doc', array('title' => 'help')),
-+ _('Help'));
-+ common_element_end('ul');
-hunk ./lib/util.php 348
-- common_element_start('ul', array('id' => 'nav_sub'));
-- common_menu_item(common_local_url('doc', array('title' => 'help')),
-- _('Help'));
-- common_menu_item(common_local_url('doc', array('title' => 'about')),
-- _('About'));
-- common_menu_item(common_local_url('doc', array('title' => 'faq')),
-- _('FAQ'));
-- common_menu_item(common_local_url('doc', array('title' => 'privacy')),
-- _('Privacy'));
-- common_menu_item(common_local_url('doc', array('title' => 'source')),
-- _('Source'));
-- common_menu_item(common_local_url('doc', array('title' => 'contact')),
-- _('Contact'));
-- common_element_end('ul');
-+ common_element_start('ul', array('id' => 'nav_sub'));
-+ common_menu_item(common_local_url('doc', array('title' => 'help')),
-+ _('Help'));
-+ common_menu_item(common_local_url('doc', array('title' => 'about')),
-+ _('About'));
-+ common_menu_item(common_local_url('doc', array('title' => 'faq')),
-+ _('FAQ'));
-+ common_menu_item(common_local_url('doc', array('title' => 'privacy')),
-+ _('Privacy'));
-+ common_menu_item(common_local_url('doc', array('title' => 'source')),
-+ _('Source'));
-+ common_menu_item(common_local_url('doc', array('title' => 'contact')),
-+ _('Contact'));
-+ common_element_end('ul');
-hunk ./lib/util.php 364
--function common_menu_item($url, $text, $title=NULL, $is_selected=false) {
-- $lattrs = array();
-- if ($is_selected) {
-- $lattrs['class'] = 'current';
-- }
-- common_element_start('li', $lattrs);
-- $attrs['href'] = $url;
-- if ($title) {
-- $attrs['title'] = $title;
-- }
-- common_element('a', $attrs, $text);
-- common_element_end('li');
-+function common_menu_item($url, $text, $title=null, $is_selected=false) {
-+ $lattrs = array();
-+ if ($is_selected) {
-+ $lattrs['class'] = 'current';
-+ }
-+ common_element_start('li', $lattrs);
-+ $attrs['href'] = $url;
-+ if ($title) {
-+ $attrs['title'] = $title;
-+ }
-+ common_element('a', $attrs, $text);
-+ common_element_end('li');
-hunk ./lib/util.php 378
--function common_input($id, $label, $value=NULL,$instructions=NULL) {
-- common_element_start('p');
-- common_element('label', array('for' => $id), $label);
-- $attrs = array('name' => $id,
-- 'type' => 'text',
-- 'class' => 'input_text',
-- 'id' => $id);
-- if ($value) {
-- $attrs['value'] = htmlspecialchars($value);
-- }
-- common_element('input', $attrs);
-- if ($instructions) {
-- common_element('span', 'input_instructions', $instructions);
-- }
-- common_element_end('p');
-+function common_input($id, $label, $value=null,$instructions=null) {
-+ common_element_start('p');
-+ common_element('label', array('for' => $id), $label);
-+ $attrs = array('name' => $id,
-+ 'type' => 'text',
-+ 'class' => 'input_text',
-+ 'id' => $id);
-+ if ($value) {
-+ $attrs['value'] = htmlspecialchars($value);
-+ }
-+ common_element('input', $attrs);
-+ if ($instructions) {
-+ common_element('span', 'input_instructions', $instructions);
-+ }
-+ common_element_end('p');
-hunk ./lib/util.php 395
--function common_checkbox($id, $label, $checked=false, $instructions=NULL, $value='true', $disabled=false)
-+function common_checkbox($id, $label, $checked=false, $instructions=null, $value='true', $disabled=false)
-hunk ./lib/util.php 397
-- common_element_start('p');
-- $attrs = array('name' => $id,
-- 'type' => 'checkbox',
-- 'class' => 'checkbox',
-- 'id' => $id);
-- if ($value) {
-- $attrs['value'] = htmlspecialchars($value);
-- }
-- if ($checked) {
-- $attrs['checked'] = 'checked';
-- }
-- if ($disabled) {
-- $attrs['disabled'] = 'true';
-- }
-- common_element('input', $attrs);
-- common_text(' ');
-- common_element('label', array('class' => 'checkbox_label', 'for' => $id), $label);
-- common_text(' ');
-- if ($instructions) {
-- common_element('span', 'input_instructions', $instructions);
-- }
-- common_element_end('p');
-+ common_element_start('p');
-+ $attrs = array('name' => $id,
-+ 'type' => 'checkbox',
-+ 'class' => 'checkbox',
-+ 'id' => $id);
-+ if ($value) {
-+ $attrs['value'] = htmlspecialchars($value);
-+ }
-+ if ($checked) {
-+ $attrs['checked'] = 'checked';
-+ }
-+ if ($disabled) {
-+ $attrs['disabled'] = 'true';
-+ }
-+ common_element('input', $attrs);
-+ common_text(' ');
-+ common_element('label', array('class' => 'checkbox_label', 'for' => $id), $label);
-+ common_text(' ');
-+ if ($instructions) {
-+ common_element('span', 'input_instructions', $instructions);
-+ }
-+ common_element_end('p');
-hunk ./lib/util.php 421
--function common_dropdown($id, $label, $content, $instructions=NULL, $blank_select=FALSE, $selected=NULL) {
-- common_element_start('p');
-- common_element('label', array('for' => $id), $label);
-- common_element_start('select', array('id' => $id, 'name' => $id));
-- if ($blank_select) {
-- common_element('option', array('value' => ''));
-- }
-- foreach ($content as $value => $option) {
-- if ($value == $selected) {
-- common_element('option', array('value' => $value, 'selected' => $value), $option);
-- } else {
-- common_element('option', array('value' => $value), $option);
-- }
-- }
-- common_element_end('select');
-- if ($instructions) {
-- common_element('span', 'input_instructions', $instructions);
-- }
-- common_element_end('p');
-+function common_dropdown($id, $label, $content, $instructions=null, $blank_select=FALSE, $selected=null) {
-+ common_element_start('p');
-+ common_element('label', array('for' => $id), $label);
-+ common_element_start('select', array('id' => $id, 'name' => $id));
-+ if ($blank_select) {
-+ common_element('option', array('value' => ''));
-+ }
-+ foreach ($content as $value => $option) {
-+ if ($value == $selected) {
-+ common_element('option', array('value' => $value, 'selected' => $value), $option);
-+ } else {
-+ common_element('option', array('value' => $value), $option);
-+ }
-+ }
-+ common_element_end('select');
-+ if ($instructions) {
-+ common_element('span', 'input_instructions', $instructions);
-+ }
-+ common_element_end('p');
-hunk ./lib/util.php 442
-- common_element('input', array('name' => $id,
-- 'type' => 'hidden',
-- 'id' => $id,
-- 'value' => $value));
-+ common_element('input', array('name' => $id,
-+ 'type' => 'hidden',
-+ 'id' => $id,
-+ 'value' => $value));
-hunk ./lib/util.php 448
--function common_password($id, $label, $instructions=NULL) {
-- common_element_start('p');
-- common_element('label', array('for' => $id), $label);
-- $attrs = array('name' => $id,
-- 'type' => 'password',
-- 'class' => 'password',
-- 'id' => $id);
-- common_element('input', $attrs);
-- if ($instructions) {
-- common_element('span', 'input_instructions', $instructions);
-- }
-- common_element_end('p');
-+function common_password($id, $label, $instructions=null) {
-+ common_element_start('p');
-+ common_element('label', array('for' => $id), $label);
-+ $attrs = array('name' => $id,
-+ 'type' => 'password',
-+ 'class' => 'password',
-+ 'id' => $id);
-+ common_element('input', $attrs);
-+ if ($instructions) {
-+ common_element('span', 'input_instructions', $instructions);
-+ }
-+ common_element_end('p');
-hunk ./lib/util.php 463
-- global $xw;
-- common_element_start('p');
-- common_element('input', array('type' => 'submit',
-- 'id' => $id,
-- 'name' => $id,
-- 'class' => $cls,
-- 'value' => $label));
-- common_element_end('p');
-+ global $xw;
-+ common_element_start('p');
-+ common_element('input', array('type' => 'submit',
-+ 'id' => $id,
-+ 'name' => $id,
-+ 'class' => $cls,
-+ 'value' => $label));
-+ common_element_end('p');
-hunk ./lib/util.php 473
--function common_textarea($id, $label, $content=NULL, $instructions=NULL) {
-- common_element_start('p');
-- common_element('label', array('for' => $id), $label);
-- common_element('textarea', array('rows' => 3,
-- 'cols' => 40,
-- 'name' => $id,
-- 'id' => $id),
-- ($content) ? $content : '');
-- if ($instructions) {
-- common_element('span', 'input_instructions', $instructions);
-- }
-- common_element_end('p');
-+function common_textarea($id, $label, $content=null, $instructions=null) {
-+ common_element_start('p');
-+ common_element('label', array('for' => $id), $label);
-+ common_element('textarea', array('rows' => 3,
-+ 'cols' => 40,
-+ 'name' => $id,
-+ 'id' => $id),
-+ ($content) ? $content : '');
-+ if ($instructions) {
-+ common_element('span', 'input_instructions', $instructions);
-+ }
-+ common_element_end('p');
-hunk ./lib/util.php 488
-- if (common_logged_in()) {
-- $user = common_current_user();
-- if ($user->timezone) {
-- return $user->timezone;
-- }
-- }
-+ if (common_logged_in()) {
-+ $user = common_current_user();
-+ if ($user->timezone) {
-+ return $user->timezone;
-+ }
-+ }
-hunk ./lib/util.php 495
-- global $config;
-- return $config['site']['timezone'];
-+ global $config;
-+ return $config['site']['timezone'];
-hunk ./lib/util.php 501
-- // If there is a user logged in and they've set a language preference
-- // then return that one...
-- if (common_logged_in()) {
-- $user = common_current_user();
-- $user_language = $user->language;
-- if ($user_language)
-- return $user_language;
-- }
-+ // If there is a user logged in and they've set a language preference
-+ // then return that one...
-+ if (common_logged_in()) {
-+ $user = common_current_user();
-+ $user_language = $user->language;
-+ if ($user_language)
-+ return $user_language;
-+ }
-hunk ./lib/util.php 510
-- // Otherwise, find the best match for the languages requested by the
-- // user's browser...
-- $httplang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : NULL;
-- if (!empty($httplang)) {
-- $language = client_prefered_language($httplang);
-- if ($language)
-- return $language;
-- }
-+ // Otherwise, find the best match for the languages requested by the
-+ // user's browser...
-+ $httplang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : null;
-+ if (!empty($httplang)) {
-+ $language = client_prefered_language($httplang);
-+ if ($language)
-+ return $language;
-+ }
-hunk ./lib/util.php 519
-- // Finally, if none of the above worked, use the site's default...
-- return common_config('site', 'language');
-+ // Finally, if none of the above worked, use the site's default...
-+ return common_config('site', 'language');
-hunk ./lib/util.php 522
--# salted, hashed passwords are stored in the DB
-+// salted, hashed passwords are stored in the DB
-hunk ./lib/util.php 525
-- return md5($password . $id);
-+ return md5($password . $id);
-hunk ./lib/util.php 528
--# check if a username exists and has matching password
-+// check if a username exists and has matching password
-hunk ./lib/util.php 530
-- # NEVER allow blank passwords, even if they match the DB
-- if (mb_strlen($password) == 0) {
-- return false;
-- }
-- $user = User::staticGet('nickname', $nickname);
-- if (is_null($user)) {
-- return false;
-- } else {
-- if (0 == strcmp(common_munge_password($password, $user->id),
-- $user->password)) {
-- return $user;
-- } else {
-- return false;
-- }
-- }
-+ // NEVER allow blank passwords, even if they match the DB
-+ if (mb_strlen($password) == 0) {
-+ return false;
+ }
-+ $user = User::staticGet('nickname', $nickname);
-+ if (is_null($user)) {
-+ return false;
-+ } else {
-+ if (0 == strcmp(common_munge_password($password, $user->id),
-+ $user->password)) {
-+ return $user;
-+ } else {
-+ return false;
-+ }
-+ }
-hunk ./lib/util.php 547
--# is the current user logged in?
-+// is the current user logged in?
-hunk ./lib/util.php 549
-- return (!is_null(common_current_user()));
-+ return (!is_null(common_current_user()));
-hunk ./lib/util.php 553
-- return (0 != strcmp(session_id(), ''));
-+ return (0 != strcmp(session_id(), ''));
-hunk ./lib/util.php 557
-- if (!common_have_session()) {
-- @session_start();
-- }
-+ if (!common_have_session()) {
-+ @session_start();
-+ }
-hunk ./lib/util.php 562
--# Three kinds of arguments:
--# 1) a user object
--# 2) a nickname
--# 3) NULL to clear
-+// Three kinds of arguments:
-+// 1) a user object
-+// 2) a nickname
-+// 3) null to clear
-hunk ./lib/util.php 567
--# Initialize to false; set to NULL if none found
-+// Initialize to false; set to null if none found
-hunk ./lib/util.php 575
-- if (is_null($user) && common_have_session()) {
-- $_cur = NULL;
-- unset($_SESSION['userid']);
+hunk ./lib/action.php 33
+- # For initializing members of the class
++ // For initializing members of the class
+hunk ./lib/action.php 35
+- function prepare($argarray) {
+- $this->args =& common_copy_args($argarray);
- return true;
-- } else if (is_string($user)) {
-- $nickname = $user;
-- $user = User::staticGet('nickname', $nickname);
-- } else if (!($user instanceof User)) {
-- return false;
- }
-+ if (is_null($user) && common_have_session()) {
-+ $_cur = null;
-+ unset($_SESSION['userid']);
++ function prepare($argarray)
++ {
++ $this->args =& common_copy_args($argarray);
+ return true;
-+ } else if (is_string($user)) {
-+ $nickname = $user;
-+ $user = User::staticGet('nickname', $nickname);
-+ } else if (!($user instanceof User)) {
-+ return false;
-+ }
-hunk ./lib/util.php 586
-- if ($user) {
-- common_ensure_session();
-- $_SESSION['userid'] = $user->id;
-+ if ($user) {
-+ common_ensure_session();
-+ $_SESSION['userid'] = $user->id;
-hunk ./lib/util.php 590
-- return $_cur;
-- }
-- return false;
-+ return $_cur;
-+ }
-+ return false;
-hunk ./lib/util.php 596
-- $path = common_config('site', 'path');
-- $server = common_config('site', 'server');
-+ $path = common_config('site', 'path');
-+ $server = common_config('site', 'server');
-hunk ./lib/util.php 599
-- if ($path && ($path != '/')) {
-- $cookiepath = '/' . $path . '/';
-- } else {
-- $cookiepath = '/';
-- }
-- return setcookie($key,
-- $value,
-- $expiration,
-- $cookiepath,
-- $server);
-+ if ($path && ($path != '/')) {
-+ $cookiepath = '/' . $path . '/';
-+ } else {
-+ $cookiepath = '/';
+ }
-+ return setcookie($key,
-+ $value,
-+ $expiration,
-+ $cookiepath,
-+ $server);
-hunk ./lib/util.php 612
--define('REMEMBERME_EXPIRY', 30 * 24 * 60 * 60); # 30 days
-+define('REMEMBERME_EXPIRY', 30 * 24 * 60 * 60); // 30 days
-hunk ./lib/util.php 614
--function common_rememberme($user=NULL) {
-- if (!$user) {
-- $user = common_current_user();
-- if (!$user) {
-- common_debug('No current user to remember', __FILE__);
-- return false;
-- }
+hunk ./lib/action.php 41
+- # For comparison with If-Last-Modified
+- # If not applicable, return NULL
++ // For comparison with If-Last-Modified
++ // If not applicable, return null
+hunk ./lib/action.php 44
+- function last_modified() {
+- return NULL;
- }
-+function common_rememberme($user=null) {
-+ if (!$user) {
-+ $user = common_current_user();
-+ if (!$user) {
-+ common_debug('No current user to remember', __FILE__);
-+ return false;
-+ }
-+ }
-hunk ./lib/util.php 623
-- $rm = new Remember_me();
-+ $rm = new Remember_me();
-hunk ./lib/util.php 625
-- $rm->code = common_good_rand(16);
-- $rm->user_id = $user->id;
-+ $rm->code = common_good_rand(16);
-+ $rm->user_id = $user->id;
-hunk ./lib/util.php 628
-- # Wrap the insert in some good ol' fashioned transaction code
-+ // Wrap the insert in some good ol' fashioned transaction code
-hunk ./lib/util.php 632
-- $result = $rm->insert();
-+ $result = $rm->insert();
-hunk ./lib/util.php 634
-- if (!$result) {
-- common_log_db_error($rm, 'INSERT', __FILE__);
-- common_debug('Error adding rememberme record for ' . $user->nickname, __FILE__);
-- return false;
-+ if (!$result) {
-+ common_log_db_error($rm, 'INSERT', __FILE__);
-+ common_debug('Error adding rememberme record for ' . $user->nickname, __FILE__);
-+ return false;
-hunk ./lib/util.php 642
-- common_debug('Inserted rememberme record (' . $rm->code . ', ' . $rm->user_id . '); result = ' . $result . '.', __FILE__);
-+ common_debug('Inserted rememberme record (' . $rm->code . ', ' . $rm->user_id . '); result = ' . $result . '.', __FILE__);
-hunk ./lib/util.php 646
-- common_log(LOG_INFO, 'adding rememberme cookie "' . $cookieval . '" for ' . $user->nickname);
-+ common_log(LOG_INFO, 'adding rememberme cookie "' . $cookieval . '" for ' . $user->nickname);
-hunk ./lib/util.php 648
-- common_set_cookie(REMEMBERME, $cookieval, time() + REMEMBERME_EXPIRY);
-+ common_set_cookie(REMEMBERME, $cookieval, time() + REMEMBERME_EXPIRY);
-hunk ./lib/util.php 650
-- return true;
-+ return true;
-hunk ./lib/util.php 655
-- $user = NULL;
-+ $user = null;
-hunk ./lib/util.php 657
-- $packed = isset($_COOKIE[REMEMBERME]) ? $_COOKIE[REMEMBERME] : NULL;
-+ $packed = isset($_COOKIE[REMEMBERME]) ? $_COOKIE[REMEMBERME] : null;
-hunk ./lib/util.php 659
-- if (!$packed) {
-- return NULL;
-+ if (!$packed) {
-+ return null;
-hunk ./lib/util.php 668
-- return NULL;
-+ return null;
-hunk ./lib/util.php 676
-- return NULL;
-+ return null;
-hunk ./lib/util.php 682
-- return NULL;
-+ return null;
-hunk ./lib/util.php 690
-- return NULL;
-+ return null;
-hunk ./lib/util.php 693
-- # successful!
-+ // successful!
-hunk ./lib/util.php 700
-- return NULL;
++ function last_modified()
++ {
+ return null;
-hunk ./lib/util.php 708
-- # We issue a new cookie, so they can log in
-- # automatically again after this session
-+ // We issue a new cookie, so they can log in
-+ // automatically again after this session
-hunk ./lib/util.php 713
-- return $user;
-+ return $user;
-hunk ./lib/util.php 716
--# must be called with a valid user!
-+// must be called with a valid user!
-hunk ./lib/util.php 719
-- common_set_cookie(REMEMBERME, '', 0);
-+ common_set_cookie(REMEMBERME, '', 0);
-hunk ./lib/util.php 722
--# who is the current user?
-+// who is the current user?
-hunk ./lib/util.php 737
-- # that didn't work; try to remember; will init $_cur to NULL on failure
-+ // that didn't work; try to remember; will init $_cur to null on failure
-hunk ./lib/util.php 743
-- # XXX: Is this necessary?
-+ // XXX: Is this necessary?
-hunk ./lib/util.php 748
-- return $_cur;
-+ return $_cur;
-hunk ./lib/util.php 751
--# Logins that are 'remembered' aren't 'real' -- they're subject to
--# cookie-stealing. So, we don't let them do certain things. New reg,
--# OpenID, and password logins _are_ real.
-+// Logins that are 'remembered' aren't 'real' -- they're subject to
-+// cookie-stealing. So, we don't let them do certain things. New reg,
-+// OpenID, and password logins _are_ real.
-hunk ./lib/util.php 756
-- common_ensure_session();
-- $_SESSION['real_login'] = $real;
-+ common_ensure_session();
-+ $_SESSION['real_login'] = $real;
-hunk ./lib/util.php 761
-- return common_logged_in() && $_SESSION['real_login'];
-+ return common_logged_in() && $_SESSION['real_login'];
-hunk ./lib/util.php 764
--# get canonical version of nickname for comparison
-+// get canonical version of nickname for comparison
-hunk ./lib/util.php 766
-- # XXX: UTF-8 canonicalization (like combining chars)
-- return strtolower($nickname);
-+ // XXX: UTF-8 canonicalization (like combining chars)
-+ return strtolower($nickname);
-hunk ./lib/util.php 770
--# get canonical version of email for comparison
-+// get canonical version of email for comparison
-hunk ./lib/util.php 772
-- # XXX: canonicalize UTF-8
-- # XXX: lcase the domain part
-- return $email;
-+ // XXX: canonicalize UTF-8
-+ // XXX: lcase the domain part
-+ return $email;
-hunk ./lib/util.php 780
-- $r = common_render_text($text);
-- $id = $notice->profile_id;
-- $r = preg_replace('/(^|\s+)@([A-Za-z0-9]{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r);
-- $r = preg_replace('/^T ([A-Z0-9]{1,64}) /e', "'T '.common_at_link($id, '\\1').' '", $r);
-- $r = preg_replace('/(^|\s+)@#([A-Za-z0-9]{1,64})/e', "'\\1@#'.common_at_hash_link($id, '\\2')", $r);
-- return $r;
-+ $r = common_render_text($text);
-+ $id = $notice->profile_id;
-+ $r = preg_replace('/(^|\s+)@([A-Za-z0-9]{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r);
-+ $r = preg_replace('/^T ([A-Z0-9]{1,64}) /e', "'T '.common_at_link($id, '\\1').' '", $r);
-+ $r = preg_replace('/(^|\s+)@#([A-Za-z0-9]{1,64})/e', "'\\1@#'.common_at_hash_link($id, '\\2')", $r);
-+ return $r;
-hunk ./lib/util.php 789
-- $r = htmlspecialchars($text);
-+ $r = htmlspecialchars($text);
-hunk ./lib/util.php 791
-- $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r);
-- $r = preg_replace_callback('@https?://[^\]>\s]+@', 'common_render_uri_thingy', $r);
-- $r = preg_replace('/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
-- # XXX: machine tags
-- return $r;
-+ $r = preg_replace('/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/', '', $r);
-+ $r = preg_replace_callback('@https?://[^\]>\s]+@', 'common_render_uri_thingy', $r);
-+ $r = preg_replace('/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e', "'\\1#'.common_tag_link('\\2')", $r);
-+ // XXX: machine tags
-+ return $r;
-hunk ./lib/util.php 799
-- $uri = $matches[0];
-- $trailer = '';
-+ $uri = $matches[0];
-+ $trailer = '';
-hunk ./lib/util.php 802
-- # Some heuristics for extracting URIs from surrounding punctuation
-- # Strip from trailing text...
-- if (preg_match('/^(.*)([,.:"\']+)$/', $uri, $matches)) {
-- $uri = $matches[1];
-- $trailer = $matches[2];
-- }
-+ // Some heuristics for extracting URIs from surrounding punctuation
-+ // Strip from trailing text...
-+ if (preg_match('/^(.*)([,.:"\']+)$/', $uri, $matches)) {
-+ $uri = $matches[1];
-+ $trailer = $matches[2];
-+ }
-hunk ./lib/util.php 809
-- $pairs = array(
-- ']' => '[', # technically disallowed in URIs, but used in Java docs
-- ')' => '(', # far too frequent in Wikipedia and MSDN
-- );
-- $final = substr($uri, -1, 1);
-- if (isset($pairs[$final])) {
-- $openers = substr_count($uri, $pairs[$final]);
-- $closers = substr_count($uri, $final);
-- if ($closers > $openers) {
-- // Assume the paren was opened outside the URI
-- $uri = substr($uri, 0, -1);
-- $trailer = $final . $trailer;
-- }
-- }
-- if ($longurl = common_longurl($uri)) {
-- $longurl = htmlentities($longurl, ENT_QUOTES, 'UTF-8');
-- $title = " title='$longurl'";
-- }
-- else $title = '';
-+ $pairs = array(
-+ ']' => '[', // technically disallowed in URIs, but used in Java docs
-+ ')' => '(', // far too frequent in Wikipedia and MSDN
-+ );
-+ $final = substr($uri, -1, 1);
-+ if (isset($pairs[$final])) {
-+ $openers = substr_count($uri, $pairs[$final]);
-+ $closers = substr_count($uri, $final);
-+ if ($closers > $openers) {
-+ // Assume the paren was opened outside the URI
-+ $uri = substr($uri, 0, -1);
-+ $trailer = $final . $trailer;
-+ }
-+ }
-+ if ($longurl = common_longurl($uri)) {
-+ $longurl = htmlentities($longurl, ENT_QUOTES, 'UTF-8');
-+ $title = " title='$longurl'";
-+ }
-+ else $title = '';
-hunk ./lib/util.php 829
-- return '<a href="' . $uri . '"' . $title . ' class="extlink">' . $uri . '</a>' . $trailer;
-+ return '<a href="' . $uri . '"' . $title . ' class="extlink">' . $uri . '</a>' . $trailer;
-hunk ./lib/util.php 839
-- $uri_e = urlencode($uri);
-- $longurl = unserialize(file_get_contents("http://api.longurl.org/v1/expand?format=php&url=$uri_e"));
-- if (empty($longurl['long_url']) || $uri === $longurl['long_url']) return false;
-- return stripslashes($longurl['long_url']);
-+ $uri_e = urlencode($uri);
-+ $longurl = unserialize(file_get_contents("http://api.longurl.org/v1/expand?format=php&url=$uri_e"));
-+ if (empty($longurl['long_url']) || $uri === $longurl['long_url']) return false;
-+ return stripslashes($longurl['long_url']);
-hunk ./lib/util.php 850
-- return $cache[$text] = preg_replace('@https?://[^)\]>\s]+@e', "common_shorten_link('\\0')", $text);
-+ return $cache[$text] = preg_replace('@https?://[^)\]>\s]+@e', "common_shorten_link('\\0')", $text);
-hunk ./lib/util.php 854
-- static $url_cache = array();
-+ static $url_cache = array();
-hunk ./lib/util.php 857
-- $user = common_current_user();
-+ $user = common_current_user();
-hunk ./lib/util.php 859
-- $curlh = curl_init();
-- curl_setopt($curlh, CURLOPT_CONNECTTIMEOUT, 20); // # seconds to wait
-- curl_setopt($curlh, CURLOPT_USERAGENT, 'Laconica');
-- curl_setopt($curlh, CURLOPT_RETURNTRANSFER, true);
-+ $curlh = curl_init();
-+ curl_setopt($curlh, CURLOPT_CONNECTTIMEOUT, 20); // # seconds to wait
-+ curl_setopt($curlh, CURLOPT_USERAGENT, 'Laconica');
-+ curl_setopt($curlh, CURLOPT_RETURNTRANSFER, true);
-hunk ./lib/util.php 864
-- switch($user->urlshorteningservice) {
-- case 'ur1.ca':
-- $short_url_service = new LilUrl;
-- $short_url = $short_url_service->shorten($url);
-- break;
-+ switch($user->urlshorteningservice) {
-+ case 'ur1.ca':
-+ $short_url_service = new LilUrl;
-+ $short_url = $short_url_service->shorten($url);
-+ break;
-hunk ./lib/util.php 870
-- case '2tu.us':
-- $short_url_service = new TightUrl;
-- $short_url = $short_url_service->shorten($url);
-- break;
-+ case '2tu.us':
-+ $short_url_service = new TightUrl;
-+ $short_url = $short_url_service->shorten($url);
-+ break;
-hunk ./lib/util.php 875
-- case 'ptiturl.com':
-- $short_url_service = new PtitUrl;
-- $short_url = $short_url_service->shorten($url);
-- break;
-+ case 'ptiturl.com':
-+ $short_url_service = new PtitUrl;
-+ $short_url = $short_url_service->shorten($url);
-+ break;
-hunk ./lib/util.php 880
-- case 'bit.ly':
-- curl_setopt($curlh, CURLOPT_URL, 'http://bit.ly/api?method=shorten&long_url='.urlencode($url));
-- $short_url = current(json_decode(curl_exec($curlh))->results)->hashUrl;
-- break;
-+ case 'bit.ly':
-+ curl_setopt($curlh, CURLOPT_URL, 'http://bit.ly/api?method=shorten&long_url='.urlencode($url));
-+ $short_url = current(json_decode(curl_exec($curlh))->results)->hashUrl;
-+ break;
-hunk ./lib/util.php 885
-- case 'is.gd':
-- curl_setopt($curlh, CURLOPT_URL, 'http://is.gd/api.php?longurl='.urlencode($url));
-- $short_url = curl_exec($curlh);
-- break;
-- case 'snipr.com':
-- curl_setopt($curlh, CURLOPT_URL, 'http://snipr.com/site/snip?r=simple&link='.urlencode($url));
-- $short_url = curl_exec($curlh);
-- break;
-- case 'metamark.net':
-- curl_setopt($curlh, CURLOPT_URL, 'http://metamark.net/api/rest/simple?long_url='.urlencode($url));
-- $short_url = curl_exec($curlh);
-- break;
-- case 'tinyurl.com':
-- curl_setopt($curlh, CURLOPT_URL, 'http://tinyurl.com/api-create.php?url='.urlencode($url));
-- $short_url = curl_exec($curlh);
-- break;
-- default:
-- $short_url = false;
-- }
-+ case 'is.gd':
-+ curl_setopt($curlh, CURLOPT_URL, 'http://is.gd/api.php?longurl='.urlencode($url));
-+ $short_url = curl_exec($curlh);
-+ break;
-+ case 'snipr.com':
-+ curl_setopt($curlh, CURLOPT_URL, 'http://snipr.com/site/snip?r=simple&link='.urlencode($url));
-+ $short_url = curl_exec($curlh);
-+ break;
-+ case 'metamark.net':
-+ curl_setopt($curlh, CURLOPT_URL, 'http://metamark.net/api/rest/simple?long_url='.urlencode($url));
-+ $short_url = curl_exec($curlh);
-+ break;
-+ case 'tinyurl.com':
-+ curl_setopt($curlh, CURLOPT_URL, 'http://tinyurl.com/api-create.php?url='.urlencode($url));
-+ $short_url = curl_exec($curlh);
-+ break;
-+ default:
-+ $short_url = false;
-+ }
-hunk ./lib/util.php 905
-- curl_close($curlh);
-+ curl_close($curlh);
-hunk ./lib/util.php 907
-- if ($short_url) {
-+ if ($short_url) {
-hunk ./lib/util.php 909
-- return (string)$short_url;
-- }
-- return $url;
-+ return (string)$short_url;
-+ }
-+ return $url;
-hunk ./lib/util.php 915
-- $xmlStr = htmlentities(iconv('UTF-8', 'UTF-8//IGNORE', $str), ENT_NOQUOTES, 'UTF-8');
-+ $xmlStr = htmlentities(iconv('UTF-8', 'UTF-8//IGNORE', $str), ENT_NOQUOTES, 'UTF-8');
-hunk ./lib/util.php 917
-- // Replace control, formatting, and surrogate characters with '*', ala Twitter
-- return preg_replace('/[\p{Cc}\p{Cf}\p{Cs}]/u', '*', $str);
-+ // Replace control, formatting, and surrogate characters with '*', ala Twitter
-+ return preg_replace('/[\p{Cc}\p{Cf}\p{Cs}]/u', '*', $str);
-hunk ./lib/util.php 922
-- $canonical = common_canonical_tag($tag);
-- $url = common_local_url('tag', array('tag' => $canonical));
-- return '<a href="' . htmlspecialchars($url) . '" rel="tag" class="hashlink">' . htmlspecialchars($tag) . '</a>';
-+ $canonical = common_canonical_tag($tag);
-+ $url = common_local_url('tag', array('tag' => $canonical));
-+ return '<a href="' . htmlspecialchars($url) . '" rel="tag" class="hashlink">' . htmlspecialchars($tag) . '</a>';
-hunk ./lib/util.php 928
-- return strtolower(str_replace(array('-', '_', '.'), '', $tag));
-+ return strtolower(str_replace(array('-', '_', '.'), '', $tag));
-hunk ./lib/util.php 932
-- return preg_match('/^[A-Za-z0-9_\-\.]{1,64}$/', $str);
-+ return preg_match('/^[A-Za-z0-9_\-\.]{1,64}$/', $str);
-hunk ./lib/util.php 936
-- $sender = Profile::staticGet($sender_id);
-- $recipient = common_relative_profile($sender, common_canonical_nickname($nickname));
-- if ($recipient) {
-- return '<a href="'.htmlspecialchars($recipient->profileurl).'" class="atlink">'.$nickname.'</a>';
-- } else {
-- return $nickname;
-- }
-+ $sender = Profile::staticGet($sender_id);
-+ $recipient = common_relative_profile($sender, common_canonical_nickname($nickname));
-+ if ($recipient) {
-+ return '<a href="'.htmlspecialchars($recipient->profileurl).'" class="atlink">'.$nickname.'</a>';
-+ } else {
-+ return $nickname;
+ }
-hunk ./lib/util.php 946
-- $user = User::staticGet($sender_id);
-- if (!$user) {
-- return $tag;
-- }
-- $tagged = Profile_tag::getTagged($user->id, common_canonical_tag($tag));
-- if ($tagged) {
-- $url = common_local_url('subscriptions',
-- array('nickname' => $user->nickname,
-- 'tag' => $tag));
-- return '<a href="'.htmlspecialchars($url).'" class="atlink">'.$tag.'</a>';
-- } else {
-- return $tag;
-- }
-+ $user = User::staticGet($sender_id);
-+ if (!$user) {
-+ return $tag;
-+ }
-+ $tagged = Profile_tag::getTagged($user->id, common_canonical_tag($tag));
-+ if ($tagged) {
-+ $url = common_local_url('subscriptions',
-+ array('nickname' => $user->nickname,
-+ 'tag' => $tag));
-+ return '<a href="'.htmlspecialchars($url).'" class="atlink">'.$tag.'</a>';
-+ } else {
-+ return $tag;
-+ }
-hunk ./lib/util.php 961
--function common_relative_profile($sender, $nickname, $dt=NULL) {
-- # Try to find profiles this profile is subscribed to that have this nickname
-- $recipient = new Profile();
-- # XXX: use a join instead of a subquery
-- $recipient->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.$sender->id.' and subscribed = id)', 'AND');
-- $recipient->whereAdd('nickname = "' . trim($nickname) . '"', 'AND');
-- if ($recipient->find(TRUE)) {
-- # XXX: should probably differentiate between profiles with
-- # the same name by date of most recent update
-- return $recipient;
-- }
-- # Try to find profiles that listen to this profile and that have this nickname
-- $recipient = new Profile();
-- # XXX: use a join instead of a subquery
-- $recipient->whereAdd('EXISTS (SELECT subscriber from subscription where subscribed = '.$sender->id.' and subscriber = id)', 'AND');
-- $recipient->whereAdd('nickname = "' . trim($nickname) . '"', 'AND');
-- if ($recipient->find(TRUE)) {
-- # XXX: should probably differentiate between profiles with
-- # the same name by date of most recent update
-- return $recipient;
-- }
-- # If this is a local user, try to find a local user with that nickname.
-- $sender = User::staticGet($sender->id);
-- if ($sender) {
-- $recipient_user = User::staticGet('nickname', $nickname);
-- if ($recipient_user) {
-- return $recipient_user->getProfile();
-- }
-- }
-- # Otherwise, no links. @messages from local users to remote users,
-- # or from remote users to other remote users, are just
-- # outside our ability to make intelligent guesses about
-- return NULL;
-+function common_relative_profile($sender, $nickname, $dt=null) {
-+ // Try to find profiles this profile is subscribed to that have this nickname
-+ $recipient = new Profile();
-+ // XXX: use a join instead of a subquery
-+ $recipient->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.$sender->id.' and subscribed = id)', 'AND');
-+ $recipient->whereAdd('nickname = "' . trim($nickname) . '"', 'AND');
-+ if ($recipient->find(TRUE)) {
-+ // XXX: should probably differentiate between profiles with
-+ // the same name by date of most recent update
-+ return $recipient;
-+ }
-+ // Try to find profiles that listen to this profile and that have this nickname
-+ $recipient = new Profile();
-+ // XXX: use a join instead of a subquery
-+ $recipient->whereAdd('EXISTS (SELECT subscriber from subscription where subscribed = '.$sender->id.' and subscriber = id)', 'AND');
-+ $recipient->whereAdd('nickname = "' . trim($nickname) . '"', 'AND');
-+ if ($recipient->find(TRUE)) {
-+ // XXX: should probably differentiate between profiles with
-+ // the same name by date of most recent update
-+ return $recipient;
-+ }
-+ // If this is a local user, try to find a local user with that nickname.
-+ $sender = User::staticGet($sender->id);
-+ if ($sender) {
-+ $recipient_user = User::staticGet('nickname', $nickname);
-+ if ($recipient_user) {
-+ return $recipient_user->getProfile();
-+ }
-+ }
-+ // Otherwise, no links. @messages from local users to remote users,
-+ // or from remote users to other remote users, are just
-+ // outside our ability to make intelligent guesses about
-+ return null;
-hunk ./lib/util.php 998
--function common_avatar_filename($id, $extension, $size=NULL, $extra=NULL) {
-- global $config;
-+function common_avatar_filename($id, $extension, $size=null, $extra=null) {
-+ global $config;
-hunk ./lib/util.php 1001
-- if ($size) {
-- return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
-- } else {
-- return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
-- }
-+ if ($size) {
-+ return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension;
-+ } else {
-+ return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension;
-+ }
-hunk ./lib/util.php 1009
-- global $config;
-- return INSTALLDIR . '/avatar/' . $filename;
-+ global $config;
-+ return INSTALLDIR . '/avatar/' . $filename;
-hunk ./lib/util.php 1014
-- return common_path('avatar/'.$filename);
-+ return common_path('avatar/'.$filename);
-hunk ./lib/util.php 1018
-- $server = common_config('avatar', 'server');
-- if ($server) {
-- return 'http://'.$server.'/'.$avatar->filename;
-- } else {
-- return $avatar->url;
+hunk ./lib/action.php 49
+- function etag() {
+- return NULL;
- }
-+ $server = common_config('avatar', 'server');
-+ if ($server) {
-+ return 'http://'.$server.'/'.$avatar->filename;
-+ } else {
-+ return $avatar->url;
++ function etag()
++ {
++ return null;
+ }
-hunk ./lib/util.php 1027
-- static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
-- AVATAR_STREAM_SIZE => 'stream',
-- AVATAR_MINI_SIZE => 'mini');
-- return theme_path('default-avatar-'.$sizenames[$size].'.png');
-+ static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
-+ AVATAR_STREAM_SIZE => 'stream',
-+ AVATAR_MINI_SIZE => 'mini');
-+ return theme_path('default-avatar-'.$sizenames[$size].'.png');
-hunk ./lib/util.php 1033
--function common_local_url($action, $args=NULL, $fragment=NULL) {
-- $url = NULL;
-- if (common_config('site','fancy')) {
-- $url = common_fancy_url($action, $args);
-- } else {
-- $url = common_simple_url($action, $args);
-- }
-- if (!is_null($fragment)) {
-- $url .= '#'.$fragment;
+hunk ./lib/action.php 54
+- function is_readonly() {
+- return false;
- }
-- return $url;
-+function common_local_url($action, $args=null, $fragment=null) {
-+ $url = null;
-+ if (common_config('site','fancy')) {
-+ $url = common_fancy_url($action, $args);
-+ } else {
-+ $url = common_simple_url($action, $args);
-+ }
-+ if (!is_null($fragment)) {
-+ $url .= '#'.$fragment;
++ function is_readonly()
++ {
++ return false;
+ }
-+ return $url;
-hunk ./lib/util.php 1046
--function common_fancy_url($action, $args=NULL) {
-- switch (strtolower($action)) {
-- case 'public':
-- if ($args && isset($args['page'])) {
-- return common_path('?page=' . $args['page']);
-- } else {
-- return common_path('');
-- }
-- case 'featured':
-- if ($args && isset($args['page'])) {
-- return common_path('featured?page=' . $args['page']);
-- } else {
-- return common_path('featured');
-- }
-- case 'favorited':
-- if ($args && isset($args['page'])) {
-- return common_path('favorited?page=' . $args['page']);
-- } else {
-- return common_path('favorited');
-- }
-- case 'publicrss':
-- return common_path('rss');
-- case 'publicatom':
-- return common_path("api/statuses/public_timeline.atom");
-- case 'publicxrds':
-- return common_path('xrds');
-- case 'featuredrss':
-- return common_path('featuredrss');
-- case 'favoritedrss':
-- return common_path('favoritedrss');
-- case 'opensearch':
-- if ($args && $args['type']) {
-- return common_path('opensearch/'.$args['type']);
-- } else {
-- return common_path('opensearch/people');
-- }
-- case 'doc':
-- return common_path('doc/'.$args['title']);
-+function common_fancy_url($action, $args=null) {
-+ switch (strtolower($action)) {
-+ case 'public':
-+ if ($args && isset($args['page'])) {
-+ return common_path('?page=' . $args['page']);
-+ } else {
-+ return common_path('');
-+ }
-+ case 'featured':
-+ if ($args && isset($args['page'])) {
-+ return common_path('featured?page=' . $args['page']);
-+ } else {
-+ return common_path('featured');
-+ }
-+ case 'favorited':
-+ if ($args && isset($args['page'])) {
-+ return common_path('favorited?page=' . $args['page']);
-+ } else {
-+ return common_path('favorited');
-+ }
-+ case 'publicrss':
-+ return common_path('rss');
-+ case 'publicatom':
-+ return common_path("api/statuses/public_timeline.atom");
-+ case 'publicxrds':
-+ return common_path('xrds');
-+ case 'featuredrss':
-+ return common_path('featuredrss');
-+ case 'favoritedrss':
-+ return common_path('favoritedrss');
-+ case 'opensearch':
-+ if ($args && $args['type']) {
-+ return common_path('opensearch/'.$args['type']);
-+ } else {
-+ return common_path('opensearch/people');
-+ }
-+ case 'doc':
-+ return common_path('doc/'.$args['title']);
-hunk ./lib/util.php 1085
-- case 'login':
-- case 'logout':
-- case 'subscribe':
-- case 'unsubscribe':
-- case 'invite':
-- return common_path('main/'.$action);
-- case 'tagother':
-- return common_path('main/tagother?id='.$args['id']);
-- case 'register':
-- if ($args && $args['code']) {
-- return common_path('main/register/'.$args['code']);
-- } else {
-- return common_path('main/register');
-- }
-- case 'remotesubscribe':
-- if ($args && $args['nickname']) {
-- return common_path('main/remote?nickname=' . $args['nickname']);
-- } else {
-- return common_path('main/remote');
-- }
-- case 'nudge':
-- return common_path($args['nickname'].'/nudge');
-- case 'openidlogin':
-- return common_path('main/openid');
-- case 'profilesettings':
-- return common_path('settings/profile');
-- case 'emailsettings':
-- return common_path('settings/email');
-- case 'openidsettings':
-- return common_path('settings/openid');
-- case 'smssettings':
-- return common_path('settings/sms');
-- case 'twittersettings':
-- return common_path('settings/twitter');
-- case 'othersettings':
-- return common_path('settings/other');
-+ case 'login':
-+ case 'logout':
-+ case 'subscribe':
-+ case 'unsubscribe':
-+ case 'invite':
-+ return common_path('main/'.$action);
-+ case 'tagother':
-+ return common_path('main/tagother?id='.$args['id']);
-+ case 'register':
-+ if ($args && $args['code']) {
-+ return common_path('main/register/'.$args['code']);
-+ } else {
-+ return common_path('main/register');
-+ }
-+ case 'remotesubscribe':
-+ if ($args && $args['nickname']) {
-+ return common_path('main/remote?nickname=' . $args['nickname']);
-+ } else {
-+ return common_path('main/remote');
-+ }
-+ case 'nudge':
-+ return common_path($args['nickname'].'/nudge');
-+ case 'openidlogin':
-+ return common_path('main/openid');
-+ case 'profilesettings':
-+ return common_path('settings/profile');
-+ case 'emailsettings':
-+ return common_path('settings/email');
-+ case 'openidsettings':
-+ return common_path('settings/openid');
-+ case 'smssettings':
-+ return common_path('settings/sms');
-+ case 'twittersettings':
-+ return common_path('settings/twitter');
-+ case 'othersettings':
-+ return common_path('settings/other');
-hunk ./lib/util.php 1123
-- case 'newnotice':
-- if ($args && $args['replyto']) {
-- return common_path('notice/new?replyto='.$args['replyto']);
+hunk ./lib/action.php 59
+- function arg($key, $def=NULL) {
+- if (array_key_exists($key, $this->args)) {
+- return $this->args[$key];
- } else {
-- return common_path('notice/new');
+- return $def;
- }
-- case 'shownotice':
-- return common_path('notice/'.$args['notice']);
-- case 'deletenotice':
-- if ($args && $args['notice']) {
-- return common_path('notice/delete/'.$args['notice']);
-- } else {
-- return common_path('notice/delete');
-- }
-- case 'microsummary':
-- case 'xrds':
-- case 'foaf':
-- return common_path($args['nickname'].'/'.$action);
-- case 'all':
-- case 'replies':
-- case 'inbox':
-- case 'outbox':
-- if ($args && isset($args['page'])) {
-- return common_path($args['nickname'].'/'.$action.'?page=' . $args['page']);
-- } else {
-- return common_path($args['nickname'].'/'.$action);
-- }
-- case 'subscriptions':
-- case 'subscribers':
-- $nickname = $args['nickname'];
-- unset($args['nickname']);
-- if (isset($args['tag'])) {
-- $tag = $args['tag'];
-- unset($args['tag']);
-- }
-- $params = http_build_query($args);
-- if ($params) {
-- return common_path($nickname.'/'.$action . (($tag) ? '/' . $tag : '') . '?' . $params);
-- } else {
-- return common_path($nickname.'/'.$action . (($tag) ? '/' . $tag : ''));
-- }
-- case 'allrss':
-- return common_path($args['nickname'].'/all/rss');
-- case 'repliesrss':
-- return common_path($args['nickname'].'/replies/rss');
-- case 'userrss':
-+ case 'newnotice':
-+ if ($args && $args['replyto']) {
-+ return common_path('notice/new?replyto='.$args['replyto']);
-+ } else {
-+ return common_path('notice/new');
-+ }
-+ case 'shownotice':
-+ return common_path('notice/'.$args['notice']);
-+ case 'deletenotice':
-+ if ($args && $args['notice']) {
-+ return common_path('notice/delete/'.$args['notice']);
-+ } else {
-+ return common_path('notice/delete');
-+ }
-+ case 'microsummary':
-+ case 'xrds':
-+ case 'foaf':
-+ return common_path($args['nickname'].'/'.$action);
-+ case 'all':
-+ case 'replies':
-+ case 'inbox':
-+ case 'outbox':
-+ if ($args && isset($args['page'])) {
-+ return common_path($args['nickname'].'/'.$action.'?page=' . $args['page']);
-+ } else {
-+ return common_path($args['nickname'].'/'.$action);
-+ }
-+ case 'subscriptions':
-+ case 'subscribers':
-+ $nickname = $args['nickname'];
-+ unset($args['nickname']);
-+ if (isset($args['tag'])) {
-+ $tag = $args['tag'];
-+ unset($args['tag']);
-+ }
-+ $params = http_build_query($args);
-+ if ($params) {
-+ return common_path($nickname.'/'.$action . (($tag) ? '/' . $tag : '') . '?' . $params);
-+ } else {
-+ return common_path($nickname.'/'.$action . (($tag) ? '/' . $tag : ''));
-+ }
-+ case 'allrss':
-+ return common_path($args['nickname'].'/all/rss');
-+ case 'repliesrss':
-+ return common_path($args['nickname'].'/replies/rss');
-+ case 'userrss':
-hunk ./lib/util.php 1170
-- return common_path($args['nickname'].'/rss?limit=' . $args['limit']);
-- return common_path($args['nickname'].'/rss');
-- case 'showstream':
-- if ($args && isset($args['page'])) {
-- return common_path($args['nickname'].'?page=' . $args['page']);
-- } else {
-- return common_path($args['nickname']);
-- }
-+ return common_path($args['nickname'].'/rss?limit=' . $args['limit']);
-+ return common_path($args['nickname'].'/rss');
-+ case 'showstream':
-+ if ($args && isset($args['page'])) {
-+ return common_path($args['nickname'].'?page=' . $args['page']);
-+ } else {
-+ return common_path($args['nickname']);
-+ }
-hunk ./lib/util.php 1179
-- case 'usertimeline':
-- return common_path("api/statuses/user_timeline/".$args['nickname'].".atom");
-- case 'confirmaddress':
-- return common_path('main/confirmaddress/'.$args['code']);
-- case 'userbyid':
-- return common_path('user/'.$args['id']);
-- case 'recoverpassword':
-- $path = 'main/recoverpassword';
-- if ($args['code']) {
-- $path .= '/' . $args['code'];
-- }
-- return common_path($path);
-- case 'imsettings':
-- return common_path('settings/im');
-- case 'peoplesearch':
-- return common_path('search/people' . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'noticesearch':
-- return common_path('search/notice' . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'noticesearchrss':
-- return common_path('search/notice/rss' . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'avatarbynickname':
-- return common_path($args['nickname'].'/avatar/'.$args['size']);
-- case 'tag':
-- if (isset($args['tag']) && $args['tag']) {
-- $path = 'tag/' . $args['tag'];
-- unset($args['tag']);
-- } else {
-- $path = 'tags';
-- }
-- return common_path($path . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'peopletag':
-- $path = 'peopletag/' . $args['tag'];
-- unset($args['tag']);
-- return common_path($path . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'tags':
-- return common_path('tags' . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'favor':
-- return common_path('main/favor');
-- case 'disfavor':
-- return common_path('main/disfavor');
-- case 'showfavorites':
-- if ($args && isset($args['page'])) {
-- return common_path($args['nickname'].'/favorites?page=' . $args['page']);
-- } else {
-- return common_path($args['nickname'].'/favorites');
-- }
-- case 'favoritesrss':
-- return common_path($args['nickname'].'/favorites/rss');
-- case 'showmessage':
-- return common_path('message/' . $args['message']);
-- case 'newmessage':
-- return common_path('message/new' . (($args) ? ('?' . http_build_query($args)) : ''));
-- case 'api':
-- # XXX: do fancy URLs for all the API methods
-- switch (strtolower($args['apiaction'])) {
-- case 'statuses':
-- switch (strtolower($args['method'])) {
-- case 'user_timeline.rss':
-- return common_path('api/statuses/user_timeline/'.$args['argument'].'.rss');
-- case 'user_timeline.atom':
-- return common_path('api/statuses/user_timeline/'.$args['argument'].'.atom');
-- case 'user_timeline.json':
-- return common_path('api/statuses/user_timeline/'.$args['argument'].'.json');
-- case 'user_timeline.xml':
-- return common_path('api/statuses/user_timeline/'.$args['argument'].'.xml');
-- default: return common_simple_url($action, $args);
-- }
-- default: return common_simple_url($action, $args);
-- }
-- case 'sup':
-- if ($args && isset($args['seconds'])) {
-- return common_path('main/sup?seconds='.$args['seconds']);
-- } else {
-- return common_path('main/sup');
-- }
-- default:
-- return common_simple_url($action, $args);
- }
-+ case 'usertimeline':
-+ return common_path("api/statuses/user_timeline/".$args['nickname'].".atom");
-+ case 'confirmaddress':
-+ return common_path('main/confirmaddress/'.$args['code']);
-+ case 'userbyid':
-+ return common_path('user/'.$args['id']);
-+ case 'recoverpassword':
-+ $path = 'main/recoverpassword';
-+ if ($args['code']) {
-+ $path .= '/' . $args['code'];
-+ }
-+ return common_path($path);
-+ case 'imsettings':
-+ return common_path('settings/im');
-+ case 'peoplesearch':
-+ return common_path('search/people' . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'noticesearch':
-+ return common_path('search/notice' . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'noticesearchrss':
-+ return common_path('search/notice/rss' . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'avatarbynickname':
-+ return common_path($args['nickname'].'/avatar/'.$args['size']);
-+ case 'tag':
-+ if (isset($args['tag']) && $args['tag']) {
-+ $path = 'tag/' . $args['tag'];
-+ unset($args['tag']);
-+ } else {
-+ $path = 'tags';
-+ }
-+ return common_path($path . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'peopletag':
-+ $path = 'peopletag/' . $args['tag'];
-+ unset($args['tag']);
-+ return common_path($path . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'tags':
-+ return common_path('tags' . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'favor':
-+ return common_path('main/favor');
-+ case 'disfavor':
-+ return common_path('main/disfavor');
-+ case 'showfavorites':
-+ if ($args && isset($args['page'])) {
-+ return common_path($args['nickname'].'/favorites?page=' . $args['page']);
-+ } else {
-+ return common_path($args['nickname'].'/favorites');
-+ }
-+ case 'favoritesrss':
-+ return common_path($args['nickname'].'/favorites/rss');
-+ case 'showmessage':
-+ return common_path('message/' . $args['message']);
-+ case 'newmessage':
-+ return common_path('message/new' . (($args) ? ('?' . http_build_query($args)) : ''));
-+ case 'api':
-+ // XXX: do fancy URLs for all the API methods
-+ switch (strtolower($args['apiaction'])) {
-+ case 'statuses':
-+ switch (strtolower($args['method'])) {
-+ case 'user_timeline.rss':
-+ return common_path('api/statuses/user_timeline/'.$args['argument'].'.rss');
-+ case 'user_timeline.atom':
-+ return common_path('api/statuses/user_timeline/'.$args['argument'].'.atom');
-+ case 'user_timeline.json':
-+ return common_path('api/statuses/user_timeline/'.$args['argument'].'.json');
-+ case 'user_timeline.xml':
-+ return common_path('api/statuses/user_timeline/'.$args['argument'].'.xml');
-+ default: return common_simple_url($action, $args);
-+ }
-+ default: return common_simple_url($action, $args);
-+ }
-+ case 'sup':
-+ if ($args && isset($args['seconds'])) {
-+ return common_path('main/sup?seconds='.$args['seconds']);
++ function arg($key, $def=null)
++ {
++ if (array_key_exists($key, $this->args)) {
++ return $this->args[$key];
+ } else {
-+ return common_path('main/sup');
-+ }
-+ default:
-+ return common_simple_url($action, $args);
-+ }
-hunk ./lib/util.php 1259
--function common_simple_url($action, $args=NULL) {
-- global $config;
-- /* XXX: pretty URLs */
-- $extra = '';
-- if ($args) {
-- foreach ($args as $key => $value) {
-- $extra .= "&${key}=${value}";
-- }
-- }
-- return common_path("index.php?action=${action}${extra}");
-+function common_simple_url($action, $args=null) {
-+ global $config;
-+ /* XXX: pretty URLs */
-+ $extra = '';
-+ if ($args) {
-+ foreach ($args as $key => $value) {
-+ $extra .= "&${key}=${value}";
++ return $def;
+ }
+ }
-+ return common_path("index.php?action=${action}${extra}");
-hunk ./lib/util.php 1272
-- global $config;
-- $pathpart = ($config['site']['path']) ? $config['site']['path']."/" : '';
-- return "http://".$config['site']['server'].'/'.$pathpart.$relative;
-+ global $config;
-+ $pathpart = ($config['site']['path']) ? $config['site']['path']."/" : '';
-+ return "http://".$config['site']['server'].'/'.$pathpart.$relative;
-hunk ./lib/util.php 1278
-- // XXX: do some sexy date formatting
-- // return date(DATE_RFC822, $dt);
-- $t = strtotime($dt);
-- $now = time();
-- $diff = $now - $t;
-+ // XXX: do some sexy date formatting
-+ // return date(DATE_RFC822, $dt);
-+ $t = strtotime($dt);
-+ $now = time();
-+ $diff = $now - $t;
-hunk ./lib/util.php 1284
-- if ($now < $t) { # that shouldn't happen!
-- return common_exact_date($dt);
-- } else if ($diff < 60) {
-- return _('a few seconds ago');
-- } else if ($diff < 92) {
-- return _('about a minute ago');
-- } else if ($diff < 3300) {
-- return sprintf(_('about %d minutes ago'), round($diff/60));
-- } else if ($diff < 5400) {
-- return _('about an hour ago');
-- } else if ($diff < 22 * 3600) {
-- return sprintf(_('about %d hours ago'), round($diff/3600));
-- } else if ($diff < 37 * 3600) {
-- return _('about a day ago');
-- } else if ($diff < 24 * 24 * 3600) {
-- return sprintf(_('about %d days ago'), round($diff/(24*3600)));
-- } else if ($diff < 46 * 24 * 3600) {
-- return _('about a month ago');
-- } else if ($diff < 330 * 24 * 3600) {
-- return sprintf(_('about %d months ago'), round($diff/(30*24*3600)));
-- } else if ($diff < 480 * 24 * 3600) {
-- return _('about a year ago');
-- } else {
-- return common_exact_date($dt);
-- }
-+ if ($now < $t) { // that shouldn't happen!
-+ return common_exact_date($dt);
-+ } else if ($diff < 60) {
-+ return _('a few seconds ago');
-+ } else if ($diff < 92) {
-+ return _('about a minute ago');
-+ } else if ($diff < 3300) {
-+ return sprintf(_('about %d minutes ago'), round($diff/60));
-+ } else if ($diff < 5400) {
-+ return _('about an hour ago');
-+ } else if ($diff < 22 * 3600) {
-+ return sprintf(_('about %d hours ago'), round($diff/3600));
-+ } else if ($diff < 37 * 3600) {
-+ return _('about a day ago');
-+ } else if ($diff < 24 * 24 * 3600) {
-+ return sprintf(_('about %d days ago'), round($diff/(24*3600)));
-+ } else if ($diff < 46 * 24 * 3600) {
-+ return _('about a month ago');
-+ } else if ($diff < 330 * 24 * 3600) {
-+ return sprintf(_('about %d months ago'), round($diff/(30*24*3600)));
-+ } else if ($diff < 480 * 24 * 3600) {
-+ return _('about a year ago');
-+ } else {
-+ return common_exact_date($dt);
-+ }
-hunk ./lib/util.php 1320
-- $dateStr = date('d F Y H:i:s', strtotime($dt));
-- $d = new DateTime($dateStr, $_utc);
-- $d->setTimezone($_siteTz);
-- return $d->format(DATE_RFC850);
-+ $dateStr = date('d F Y H:i:s', strtotime($dt));
-+ $d = new DateTime($dateStr, $_utc);
-+ $d->setTimezone($_siteTz);
-+ return $d->format(DATE_RFC850);
-hunk ./lib/util.php 1327
-- $dateStr = date('d F Y H:i:s', strtotime($dt));
-- $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-- $d->setTimezone(new DateTimeZone(common_timezone()));
-- return $d->format(DATE_W3C);
-+ $dateStr = date('d F Y H:i:s', strtotime($dt));
-+ $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-+ $d->setTimezone(new DateTimeZone(common_timezone()));
-+ return $d->format(DATE_W3C);
-hunk ./lib/util.php 1334
-- $dateStr = date('d F Y H:i:s', strtotime($dt));
-- $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-- $d->setTimezone(new DateTimeZone(common_timezone()));
-- return $d->format('r');
-+ $dateStr = date('d F Y H:i:s', strtotime($dt));
-+ $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-+ $d->setTimezone(new DateTimeZone(common_timezone()));
-+ return $d->format('r');
-hunk ./lib/util.php 1341
-- $dateStr = date('d F Y H:i:s', strtotime($dt));
-- $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-- $d->setTimezone(new DateTimeZone(common_timezone()));
-- return $d->format('c');
-+ $dateStr = date('d F Y H:i:s', strtotime($dt));
-+ $d = new DateTime($dateStr, new DateTimeZone('UTC'));
-+ $d->setTimezone(new DateTimeZone(common_timezone()));
-+ return $d->format('c');
-hunk ./lib/util.php 1348
-- return strftime('%Y-%m-%d %H:%M:%S', time());
-+ return strftime('%Y-%m-%d %H:%M:%S', time());
-hunk ./lib/util.php 1352
-- static $status = array(301 => "Moved Permanently",
-- 302 => "Found",
-- 303 => "See Other",
-- 307 => "Temporary Redirect");
-- header("Status: ${code} $status[$code]");
-- header("Location: $url");
-+ static $status = array(301 => "Moved Permanently",
-+ 302 => "Found",
-+ 303 => "See Other",
-+ 307 => "Temporary Redirect");
-+ header("Status: ${code} $status[$code]");
-+ header("Location: $url");
-hunk ./lib/util.php 1359
-- common_start_xml('a',
-- '-//W3C//DTD XHTML 1.0 Strict//EN',
-- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
-- common_element('a', array('href' => $url), $url);
-- common_end_xml();
-+ common_start_xml('a',
-+ '-//W3C//DTD XHTML 1.0 Strict//EN',
-+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
-+ common_element('a', array('href' => $url), $url);
-+ common_end_xml();
-hunk ./lib/util.php 1368
-- # Alternative reply format
-- $tname = false;
-- if (preg_match('/^T ([A-Z0-9]{1,64}) /', $notice->content, $match)) {
-- $tname = $match[1];
-- }
-- # extract all @messages
-- $cnt = preg_match_all('/(?:^|\s)@([a-z0-9]{1,64})/', $notice->content, $match);
-+ // Alternative reply format
-+ $tname = false;
-+ if (preg_match('/^T ([A-Z0-9]{1,64}) /', $notice->content, $match)) {
-+ $tname = $match[1];
-+ }
-+ // extract all @messages
-+ $cnt = preg_match_all('/(?:^|\s)@([a-z0-9]{1,64})/', $notice->content, $match);
-hunk ./lib/util.php 1376
-- $names = array();
-+ $names = array();
-hunk ./lib/util.php 1378
-- if ($cnt || $tname) {
-- # XXX: is there another way to make an array copy?
-- $names = ($tname) ? array_unique(array_merge(array(strtolower($tname)), $match[1])) : array_unique($match[1]);
-- }
-+ if ($cnt || $tname) {
-+ // XXX: is there another way to make an array copy?
-+ $names = ($tname) ? array_unique(array_merge(array(strtolower($tname)), $match[1])) : array_unique($match[1]);
-+ }
-hunk ./lib/util.php 1383
-- $sender = Profile::staticGet($notice->profile_id);
-+ $sender = Profile::staticGet($notice->profile_id);
-hunk ./lib/util.php 1385
-- $replied = array();
-+ $replied = array();
-hunk ./lib/util.php 1387
-- # store replied only for first @ (what user/notice what the reply directed,
-- # we assume first @ is it)
-+ // store replied only for first @ (what user/notice what the reply directed,
-+ // we assume first @ is it)
-hunk ./lib/util.php 1390
-- for ($i=0; $i<count($names); $i++) {
-- $nickname = $names[$i];
-- $recipient = common_relative_profile($sender, $nickname, $notice->created);
-- if (!$recipient) {
-- continue;
-- }
-- if ($i == 0 && ($recipient->id != $sender->id) && !$notice->reply_to) { # Don't save reply to self
-- $reply_for = $recipient;
-- $recipient_notice = $reply_for->getCurrentNotice();
-- if ($recipient_notice) {
-- $orig = clone($notice);
-- $notice->reply_to = $recipient_notice->id;
-- $notice->update($orig);
-- }
-- }
-- # Don't save replies from blocked profile to local user
-+ for ($i=0; $i<count($names); $i++) {
-+ $nickname = $names[$i];
-+ $recipient = common_relative_profile($sender, $nickname, $notice->created);
-+ if (!$recipient) {
-+ continue;
-+ }
-+ if ($i == 0 && ($recipient->id != $sender->id) && !$notice->reply_to) { // Don't save reply to self
-+ $reply_for = $recipient;
-+ $recipient_notice = $reply_for->getCurrentNotice();
-+ if ($recipient_notice) {
-+ $orig = clone($notice);
-+ $notice->reply_to = $recipient_notice->id;
-+ $notice->update($orig);
-+ }
-+ }
-+ // Don't save replies from blocked profile to local user
-hunk ./lib/util.php 1410
-- $reply = new Reply();
-- $reply->notice_id = $notice->id;
-- $reply->profile_id = $recipient->id;
-- $id = $reply->insert();
-- if (!$id) {
-- $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-- common_log(LOG_ERR, 'DB error inserting reply: ' . $last_error->message);
-- common_server_error(sprintf(_('DB error inserting reply: %s'), $last_error->message));
-- return;
-- } else {
-- $replied[$recipient->id] = 1;
-- }
+hunk ./lib/action.php 68
+- function trimmed($key, $def=NULL) {
+- $arg = $this->arg($key, $def);
+- return (is_string($arg)) ? trim($arg) : $arg;
- }
-+ $reply = new Reply();
-+ $reply->notice_id = $notice->id;
-+ $reply->profile_id = $recipient->id;
-+ $id = $reply->insert();
-+ if (!$id) {
-+ $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-+ common_log(LOG_ERR, 'DB error inserting reply: ' . $last_error->message);
-+ common_server_error(sprintf(_('DB error inserting reply: %s'), $last_error->message));
-+ return;
-+ } else {
-+ $replied[$recipient->id] = 1;
-+ }
-+ }
-hunk ./lib/util.php 1424
-- # Hash format replies, too
-- $cnt = preg_match_all('/(?:^|\s)@#([a-z0-9]{1,64})/', $notice->content, $match);
-- if ($cnt) {
-- foreach ($match[1] as $tag) {
-- $tagged = Profile_tag::getTagged($sender->id, $tag);
-- foreach ($tagged as $t) {
-- if (!$replied[$t->id]) {
-- # Don't save replies from blocked profile to local user
-+ // Hash format replies, too
-+ $cnt = preg_match_all('/(?:^|\s)@#([a-z0-9]{1,64})/', $notice->content, $match);
-+ if ($cnt) {
-+ foreach ($match[1] as $tag) {
-+ $tagged = Profile_tag::getTagged($sender->id, $tag);
-+ foreach ($tagged as $t) {
-+ if (!$replied[$t->id]) {
-+ // Don't save replies from blocked profile to local user
-hunk ./lib/util.php 1436
-- $reply = new Reply();
-- $reply->notice_id = $notice->id;
-- $reply->profile_id = $t->id;
-- $id = $reply->insert();
-- if (!$id) {
-- common_log_db_error($reply, 'INSERT', __FILE__);
-- return;
++ function trimmed($key, $def=null)
++ {
++ $arg = $this->arg($key, $def);
++ return (is_string($arg)) ? trim($arg) : $arg;
++ }
+hunk ./lib/action.php 74
+- # Note: argarray ignored, since it's now passed in in prepare()
++ // Note: argarray ignored, since it's now passed in in prepare()
+hunk ./lib/action.php 76
+- function handle($argarray=NULL) {
++ function handle($argarray=null)
++ {
+hunk ./lib/action.php 79
+- $lm = $this->last_modified();
+- $etag = $this->etag();
++ $lm = $this->last_modified();
++ $etag = $this->etag();
+hunk ./lib/action.php 82
+- if ($etag) {
+- header('ETag: ' . $etag);
+- }
++ if ($etag) {
++ header('ETag: ' . $etag);
++ }
+hunk ./lib/action.php 86
+- if ($lm) {
+- header('Last-Modified: ' . date(DATE_RFC1123, $lm));
+- $if_modified_since = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
+- if ($if_modified_since) {
+- $ims = strtotime($if_modified_since);
+- if ($lm <= $ims) {
+- if (!$etag || $this->_has_etag($etag, $_SERVER['HTTP_IF_NONE_MATCH'])) {
+- header('HTTP/1.1 304 Not Modified');
+- # Better way to do this?
+- exit(0);
- }
- }
- }
- }
- }
-+ $reply = new Reply();
-+ $reply->notice_id = $notice->id;
-+ $reply->profile_id = $t->id;
-+ $id = $reply->insert();
-+ if (!$id) {
-+ common_log_db_error($reply, 'INSERT', __FILE__);
-+ return;
++ if ($lm) {
++ header('Last-Modified: ' . date(DATE_RFC1123, $lm));
++ $if_modified_since = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
++ if ($if_modified_since) {
++ $ims = strtotime($if_modified_since);
++ if ($lm <= $ims) {
++ if (!$etag ||
++ $this->_has_etag($etag, $_SERVER['HTTP_IF_NONE_MATCH'])) {
++ header('HTTP/1.1 304 Not Modified');
++ // Better way to do this?
++ exit(0);
+ }
+ }
+ }
+ }
+ }
-hunk ./lib/util.php 1452
-- // Check to see if notice should go to Twitter
-- $flink = Foreign_link::getByUserID($notice->profile_id, 1); // 1 == Twitter
-- if (($flink->noticesync & FOREIGN_NOTICE_SEND) == FOREIGN_NOTICE_SEND) {
-+ // Check to see if notice should go to Twitter
-+ $flink = Foreign_link::getByUserID($notice->profile_id, 1); // 1 == Twitter
-+ if (($flink->noticesync & FOREIGN_NOTICE_SEND) == FOREIGN_NOTICE_SEND) {
-hunk ./lib/util.php 1456
-- // If it's not a Twitter-style reply, or if the user WANTS to send replies...
-+ // If it's not a Twitter-style reply, or if the user WANTS to send replies...
-hunk ./lib/util.php 1458
-- if (!preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) ||
-- (($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) == FOREIGN_NOTICE_SEND_REPLY)) {
-+ if (!preg_match('/^@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) ||
-+ (($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) == FOREIGN_NOTICE_SEND_REPLY)) {
-hunk ./lib/util.php 1461
-- $result = common_twitter_broadcast($notice, $flink);
-+ $result = common_twitter_broadcast($notice, $flink);
-hunk ./lib/util.php 1463
-- if (!$result) {
-- common_debug('Unable to send notice: ' . $notice->id . ' to Twitter.', __FILE__);
-- }
-- }
-- }
-+ if (!$result) {
-+ common_debug('Unable to send notice: ' . $notice->id . ' to Twitter.', __FILE__);
-+ }
-+ }
-+ }
-hunk ./lib/util.php 1469
-- if (common_config('queue', 'enabled')) {
-- # Do it later!
-- return common_enqueue_notice($notice);
-- } else {
-- return common_real_broadcast($notice, $remote);
-- }
-+ if (common_config('queue', 'enabled')) {
-+ // Do it later!
-+ return common_enqueue_notice($notice);
-+ } else {
-+ return common_real_broadcast($notice, $remote);
-+ }
-hunk ./lib/util.php 1478
-- global $config;
-- $success = true;
-- $fuser = $flink->getForeignUser();
-- $twitter_user = $fuser->nickname;
-- $twitter_password = $flink->credentials;
-- $uri = 'http://www.twitter.com/statuses/update.json';
-+ global $config;
-+ $success = true;
-+ $fuser = $flink->getForeignUser();
-+ $twitter_user = $fuser->nickname;
-+ $twitter_password = $flink->credentials;
-+ $uri = 'http://www.twitter.com/statuses/update.json';
-hunk ./lib/util.php 1485
-- // XXX: Hack to get around PHP cURL's use of @ being a a meta character
-- $statustxt = preg_replace('/^@/', ' @', $notice->content);
-+ // XXX: Hack to get around PHP cURL's use of @ being a a meta character
-+ $statustxt = preg_replace('/^@/', ' @', $notice->content);
-hunk ./lib/util.php 1488
-- $options = array(
-- CURLOPT_USERPWD => "$twitter_user:$twitter_password",
-- CURLOPT_POST => true,
-- CURLOPT_POSTFIELDS => array(
-- 'status' => $statustxt,
-- 'source' => $config['integration']['source']
-- ),
-- CURLOPT_RETURNTRANSFER => true,
-- CURLOPT_FAILONERROR => true,
-- CURLOPT_HEADER => false,
-- CURLOPT_FOLLOWLOCATION => true,
-- CURLOPT_USERAGENT => "Laconica",
-- CURLOPT_CONNECTTIMEOUT => 120, // XXX: Scary!!!! How long should this be?
-- CURLOPT_TIMEOUT => 120
-- );
-+ $options = array(
-+ CURLOPT_USERPWD => "$twitter_user:$twitter_password",
-+ CURLOPT_POST => true,
-+ CURLOPT_POSTFIELDS => array(
-+ 'status' => $statustxt,
-+ 'source' => $config['integration']['source']
-+ ),
-+ CURLOPT_RETURNTRANSFER => true,
-+ CURLOPT_FAILONERROR => true,
-+ CURLOPT_HEADER => false,
-+ CURLOPT_FOLLOWLOCATION => true,
-+ CURLOPT_USERAGENT => "Laconica",
-+ CURLOPT_CONNECTTIMEOUT => 120, // XXX: Scary!!!! How long should this be?
-+ CURLOPT_TIMEOUT => 120
-+ );
-hunk ./lib/util.php 1504
-- $ch = curl_init($uri);
-+ $ch = curl_init($uri);
-hunk ./lib/util.php 1509
-- if ($errmsg) {
-- common_debug("cURL error: $errmsg - trying to send notice for $twitter_user.",
-- __FILE__);
-- $success = false;
+hunk ./lib/action.php 103
+- function _has_etag($etag, $if_none_match) {
+- return ($if_none_match) && in_array($etag, explode(',', $if_none_match));
- }
-+ if ($errmsg) {
-+ common_debug("cURL error: $errmsg - trying to send notice for $twitter_user.",
-+ __FILE__);
-+ $success = false;
-+ }
-hunk ./lib/util.php 1515
-- curl_close($ch);
-+ curl_close($ch);
-hunk ./lib/util.php 1517
-- if (!$data) {
-- common_debug("No data returned by Twitter's API trying to send update for $twitter_user",
-- __FILE__);
-- $success = false;
-- }
-+ if (!$data) {
-+ common_debug("No data returned by Twitter's API trying to send update for $twitter_user",
-+ __FILE__);
-+ $success = false;
-+ }
-hunk ./lib/util.php 1523
-- // Twitter should return a status
-- $status = json_decode($data);
-+ // Twitter should return a status
-+ $status = json_decode($data);
-hunk ./lib/util.php 1526
-- if (!$status->id) {
-- common_debug("Unexpected data returned by Twitter API trying to send update for $twitter_user",
-- __FILE__);
-- $success = false;
-- }
-+ if (!$status->id) {
-+ common_debug("Unexpected data returned by Twitter API trying to send update for $twitter_user",
-+ __FILE__);
-+ $success = false;
++ function _has_etag($etag, $if_none_match)
++ {
++ return ($if_none_match) && in_array($etag, explode(',', $if_none_match));
+ }
-hunk ./lib/util.php 1532
-- return $success;
-+ return $success;
-hunk ./lib/util.php 1535
--# Stick the notice on the queue
-+// Stick the notice on the queue
-hunk ./lib/util.php 1538
-- foreach (array('jabber', 'omb', 'sms', 'public') as $transport) {
-- $qi = new Queue_item();
-- $qi->notice_id = $notice->id;
-- $qi->transport = $transport;
-- $qi->created = $notice->created;
-+ foreach (array('jabber', 'omb', 'sms', 'public') as $transport) {
-+ $qi = new Queue_item();
-+ $qi->notice_id = $notice->id;
-+ $qi->transport = $transport;
-+ $qi->created = $notice->created;
-hunk ./lib/util.php 1544
-- if (!$result) {
-- $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-- common_log(LOG_ERR, 'DB error inserting queue item: ' . $last_error->message);
+hunk ./lib/action.php 108
+- function boolean($key, $def=false) {
+- $arg = strtolower($this->trimmed($key));
++ function boolean($key, $def=false)
++ {
++ $arg = strtolower($this->trimmed($key));
+hunk ./lib/action.php 112
+- if (is_null($arg)) {
+- return $def;
+- } else if (in_array($arg, array('true', 'yes', '1'))) {
+- return true;
+- } else if (in_array($arg, array('false', 'no', '0'))) {
- return false;
-- }
-- common_log(LOG_DEBUG, 'complete queueing notice ID = ' . $notice->id . ' for ' . $transport);
-- }
-- return $result;
-+ if (!$result) {
-+ $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-+ common_log(LOG_ERR, 'DB error inserting queue item: ' . $last_error->message);
-+ return false;
-+ }
-+ common_log(LOG_DEBUG, 'complete queueing notice ID = ' . $notice->id . ' for ' . $transport);
-+ }
-+ return $result;
-hunk ./lib/util.php 1555
-- $qi = Queue_item::staticGet($notice->id);
-- if ($qi) {
-- $result = $qi->delete();
-- if (!$result) {
-- $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-- common_log(LOG_ERR, 'DB error deleting queue item: ' . $last_error->message);
-- return false;
-- }
-- common_log(LOG_DEBUG, 'complete dequeueing notice ID = ' . $notice->id);
-- return $result;
-- } else {
-+ $qi = Queue_item::staticGet($notice->id);
-+ if ($qi) {
-+ $result = $qi->delete();
-+ if (!$result) {
-+ $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-+ common_log(LOG_ERR, 'DB error deleting queue item: ' . $last_error->message);
-hunk ./lib/util.php 1563
-+ common_log(LOG_DEBUG, 'complete dequeueing notice ID = ' . $notice->id);
-+ return $result;
-+ } else {
-+ return false;
-+ }
-hunk ./lib/util.php 1571
-- $success = true;
-- if (!$remote) {
-- # Make sure we have the OMB stuff
-- require_once(INSTALLDIR.'/lib/omb.php');
-- $success = omb_broadcast_remote_subscribers($notice);
-- if (!$success) {
-- common_log(LOG_ERR, 'Error in OMB broadcast for notice ' . $notice->id);
-- }
-- }
-- if ($success) {
-- require_once(INSTALLDIR.'/lib/jabber.php');
-- $success = jabber_broadcast_notice($notice);
-- if (!$success) {
-- common_log(LOG_ERR, 'Error in jabber broadcast for notice ' . $notice->id);
-- }
-- }
-- if ($success) {
-- require_once(INSTALLDIR.'/lib/mail.php');
-- $success = mail_broadcast_notice_sms($notice);
-- if (!$success) {
-- common_log(LOG_ERR, 'Error in sms broadcast for notice ' . $notice->id);
-- }
-- }
-- if ($success) {
-- $success = jabber_public_notice($notice);
-- if (!$success) {
-- common_log(LOG_ERR, 'Error in public broadcast for notice ' . $notice->id);
-- }
-- }
-- // XXX: broadcast notices to other IM
-- return $success;
-+ $success = true;
-+ if (!$remote) {
-+ // Make sure we have the OMB stuff
-+ require_once(INSTALLDIR.'/lib/omb.php');
-+ $success = omb_broadcast_remote_subscribers($notice);
-+ if (!$success) {
-+ common_log(LOG_ERR, 'Error in OMB broadcast for notice ' . $notice->id);
-+ }
-+ }
-+ if ($success) {
-+ require_once(INSTALLDIR.'/lib/jabber.php');
-+ $success = jabber_broadcast_notice($notice);
-+ if (!$success) {
-+ common_log(LOG_ERR, 'Error in jabber broadcast for notice ' . $notice->id);
-+ }
-+ }
-+ if ($success) {
-+ require_once(INSTALLDIR.'/lib/mail.php');
-+ $success = mail_broadcast_notice_sms($notice);
-+ if (!$success) {
-+ common_log(LOG_ERR, 'Error in sms broadcast for notice ' . $notice->id);
-+ }
-+ }
-+ if ($success) {
-+ $success = jabber_public_notice($notice);
-+ if (!$success) {
-+ common_log(LOG_ERR, 'Error in public broadcast for notice ' . $notice->id);
-+ }
-+ }
-+ // XXX: broadcast notices to other IM
-+ return $success;
-hunk ./lib/util.php 1605
-- // XXX: optionally use a queue system like http://code.google.com/p/microapps/wiki/NQDQ
-- require_once(INSTALLDIR.'/lib/omb.php');
-- omb_broadcast_profile($profile);
-- // XXX: Other broadcasts...?
-- return true;
-+ // XXX: optionally use a queue system like http://code.google.com/p/microapps/wiki/NQDQ
-+ require_once(INSTALLDIR.'/lib/omb.php');
-+ omb_broadcast_profile($profile);
-+ // XXX: Other broadcasts...?
-+ return true;
-hunk ./lib/util.php 1613
-- return common_local_url('showstream', array('nickname' => $nickname));
-+ return common_local_url('showstream', array('nickname' => $nickname));
-hunk ./lib/util.php 1616
--# Don't call if nobody's logged in
-+// Don't call if nobody's logged in
-hunk ./lib/util.php 1618
--function common_notice_form($action=NULL, $content=NULL) {
-- $user = common_current_user();
-- assert(!is_null($user));
-- common_element_start('form', array('id' => 'status_form',
-- 'method' => 'post',
-- 'action' => common_local_url('newnotice')));
-- common_element_start('p');
-- common_element('label', array('for' => 'status_textarea',
-- 'id' => 'status_label'),
-- sprintf(_('What\'s up, %s?'), $user->nickname));
-+function common_notice_form($action=null, $content=null) {
-+ $user = common_current_user();
-+ assert(!is_null($user));
-+ common_element_start('form', array('id' => 'status_form',
-+ 'method' => 'post',
-+ 'action' => common_local_url('newnotice')));
-+ common_element_start('p');
-+ common_element('label', array('for' => 'status_textarea',
-+ 'id' => 'status_label'),
-+ sprintf(_('What\'s up, %s?'), $user->nickname));
-hunk ./lib/util.php 1629
-- common_element('textarea', array('id' => 'status_textarea',
-- 'cols' => 60,
-- 'rows' => 3,
-- 'name' => 'status_textarea'),
-- ($content) ? $content : '');
-- common_hidden('token', common_session_token());
-- if ($action) {
-- common_hidden('returnto', $action);
-- }
-- # set by JavaScript
-- common_hidden('inreplyto', 'false');
-- common_element('input', array('id' => 'status_submit',
-- 'name' => 'status_submit',
-- 'type' => 'submit',
-- 'value' => _('Send')));
-- common_element_end('p');
-- common_element_end('form');
-+ common_element('textarea', array('id' => 'status_textarea',
-+ 'cols' => 60,
-+ 'rows' => 3,
-+ 'name' => 'status_textarea'),
-+ ($content) ? $content : '');
-+ common_hidden('token', common_session_token());
-+ if ($action) {
-+ common_hidden('returnto', $action);
-+ }
-+ // set by JavaScript
-+ common_hidden('inreplyto', 'false');
-+ common_element('input', array('id' => 'status_submit',
-+ 'name' => 'status_submit',
-+ 'type' => 'submit',
-+ 'value' => _('Send')));
-+ common_element_end('p');
-+ common_element_end('form');
-hunk ./lib/util.php 1648
--# Should make up a reasonable root URL
-+// Should make up a reasonable root URL
-hunk ./lib/util.php 1651
-- return common_path('');
-+ return common_path('');
-hunk ./lib/util.php 1654
--# returns $bytes bytes of random data as a hexadecimal string
--# "good" here is a goal and not a guarantee
-+// returns $bytes bytes of random data as a hexadecimal string
-+// "good" here is a goal and not a guarantee
-hunk ./lib/util.php 1658
-- # XXX: use random.org...?
-- if (file_exists('/dev/urandom')) {
-- return common_urandom($bytes);
-- } else { # FIXME: this is probably not good enough
-- return common_mtrand($bytes);
-- }
-+ // XXX: use random.org...?
-+ if (file_exists('/dev/urandom')) {
-+ return common_urandom($bytes);
-+ } else { // FIXME: this is probably not good enough
-+ return common_mtrand($bytes);
-+ }
-hunk ./lib/util.php 1667
-- $h = fopen('/dev/urandom', 'rb');
-- # should not block
-- $src = fread($h, $bytes);
-- fclose($h);
-- $enc = '';
-- for ($i = 0; $i < $bytes; $i++) {
-- $enc .= sprintf("%02x", (ord($src[$i])));
-- }
-- return $enc;
-+ $h = fopen('/dev/urandom', 'rb');
-+ // should not block
-+ $src = fread($h, $bytes);
-+ fclose($h);
-+ $enc = '';
-+ for ($i = 0; $i < $bytes; $i++) {
-+ $enc .= sprintf("%02x", (ord($src[$i])));
-+ }
-+ return $enc;
-hunk ./lib/util.php 1679
-- $enc = '';
-- for ($i = 0; $i < $bytes; $i++) {
-- $enc .= sprintf("%02x", mt_rand(0, 255));
-- }
-- return $enc;
-+ $enc = '';
-+ for ($i = 0; $i < $bytes; $i++) {
-+ $enc .= sprintf("%02x", mt_rand(0, 255));
-+ }
-+ return $enc;
-hunk ./lib/util.php 1687
-- common_ensure_session();
-- $_SESSION['returnto'] = $url;
-+ common_ensure_session();
-+ $_SESSION['returnto'] = $url;
-hunk ./lib/util.php 1692
-- common_ensure_session();
-- return $_SESSION['returnto'];
-+ common_ensure_session();
-+ return $_SESSION['returnto'];
-hunk ./lib/util.php 1697
-- return date('YmdHis');
-+ return date('YmdHis');
-hunk ./lib/util.php 1701
-- static $initialized = false;
-- if (!$initialized) {
-- global $config;
-- openlog($config['syslog']['appname'], 0, LOG_USER);
-- $initialized = true;
-- }
-+ static $initialized = false;
-+ if (!$initialized) {
-+ global $config;
-+ openlog($config['syslog']['appname'], 0, LOG_USER);
-+ $initialized = true;
-+ }
-hunk ./lib/util.php 1709
--function common_log($priority, $msg, $filename=NULL) {
-- $logfile = common_config('site', 'logfile');
-- if ($logfile) {
-- $log = fopen($logfile, "a");
-- if ($log) {
-- static $syslog_priorities = array('LOG_EMERG', 'LOG_ALERT', 'LOG_CRIT', 'LOG_ERR',
-- 'LOG_WARNING', 'LOG_NOTICE', 'LOG_INFO', 'LOG_DEBUG');
-- $output = date('Y-m-d H:i:s') . ' ' . $syslog_priorities[$priority] . ': ' . $msg . "\n";
-- fwrite($log, $output);
-- fclose($log);
-- }
-- } else {
-- common_ensure_syslog();
-- syslog($priority, $msg);
-- }
-+function common_log($priority, $msg, $filename=null) {
-+ $logfile = common_config('site', 'logfile');
-+ if ($logfile) {
-+ $log = fopen($logfile, "a");
-+ if ($log) {
-+ static $syslog_priorities = array('LOG_EMERG', 'LOG_ALERT', 'LOG_CRIT', 'LOG_ERR',
-+ 'LOG_WARNING', 'LOG_NOTICE', 'LOG_INFO', 'LOG_DEBUG');
-+ $output = date('Y-m-d H:i:s') . ' ' . $syslog_priorities[$priority] . ': ' . $msg . "\n";
-+ fwrite($log, $output);
-+ fclose($log);
-+ }
-+ } else {
-+ common_ensure_syslog();
-+ syslog($priority, $msg);
-+ }
-hunk ./lib/util.php 1726
--function common_debug($msg, $filename=NULL) {
-- if ($filename) {
-- common_log(LOG_DEBUG, basename($filename).' - '.$msg);
-- } else {
-- common_log(LOG_DEBUG, $msg);
-- }
-+function common_debug($msg, $filename=null) {
-+ if ($filename) {
-+ common_log(LOG_DEBUG, basename($filename).' - '.$msg);
-+ } else {
-+ common_log(LOG_DEBUG, $msg);
-+ }
-hunk ./lib/util.php 1734
--function common_log_db_error(&$object, $verb, $filename=NULL) {
-- $objstr = common_log_objstring($object);
-- $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-- common_log(LOG_ERR, $last_error->message . '(' . $verb . ' on ' . $objstr . ')', $filename);
-+function common_log_db_error(&$object, $verb, $filename=null) {
-+ $objstr = common_log_objstring($object);
-+ $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-+ common_log(LOG_ERR, $last_error->message . '(' . $verb . ' on ' . $objstr . ')', $filename);
-hunk ./lib/util.php 1741
-- if (is_null($object)) {
-- return "NULL";
-- }
-- $arr = $object->toArray();
-- $fields = array();
-- foreach ($arr as $k => $v) {
-- $fields[] = "$k='$v'";
-- }
-- $objstring = $object->tableName() . '[' . implode(',', $fields) . ']';
-- return $objstring;
-+ if (is_null($object)) {
-+ return "null";
-+ }
-+ $arr = $object->toArray();
-+ $fields = array();
-+ foreach ($arr as $k => $v) {
-+ $fields[] = "$k='$v'";
-+ }
-+ $objstring = $object->tableName() . '[' . implode(',', $fields) . ']';
-+ return $objstring;
-hunk ./lib/util.php 1754
-- return Validate::uri($url, array('allowed_schemes' => array('http', 'https')));
-+ return Validate::uri($url, array('allowed_schemes' => array('http', 'https')));
-hunk ./lib/util.php 1758
-- if (preg_match('/^tag:(.*?),(\d{4}(-\d{2}(-\d{2})?)?):(.*)$/', $tag, $matches)) {
-- return (Validate::email($matches[1]) ||
-- preg_match('/^([\w-\.]+)$/', $matches[1]));
-- }
-- return false;
-+ if (preg_match('/^tag:(.*?),(\d{4}(-\d{2}(-\d{2})?)?):(.*)$/', $tag, $matches)) {
-+ return (Validate::email($matches[1]) ||
-+ preg_match('/^([\w-\.]+)$/', $matches[1]));
-+ }
-+ return false;
-hunk ./lib/util.php 1765
--# Does a little before-after block for next/prev page
-+// Does a little before-after block for next/prev page
-hunk ./lib/util.php 1767
--function common_pagination($have_before, $have_after, $page, $action, $args=NULL) {
-+function common_pagination($have_before, $have_after, $page, $action, $args=null) {
-hunk ./lib/util.php 1769
-- if ($have_before || $have_after) {
-- common_element_start('div', array('id' => 'pagination'));
-- common_element_start('ul', array('id' => 'nav_pagination'));
-- }
-+ if ($have_before || $have_after) {
-+ common_element_start('div', array('id' => 'pagination'));
-+ common_element_start('ul', array('id' => 'nav_pagination'));
-+ }
-hunk ./lib/util.php 1774
-- if ($have_before) {
-- $pargs = array('page' => $page-1);
-- $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-+ if ($have_before) {
-+ $pargs = array('page' => $page-1);
-+ $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-hunk ./lib/util.php 1778
-- common_element_start('li', 'before');
-- common_element('a', array('href' => common_local_url($action, $newargs), 'rel' => 'prev'),
-- _('« After'));
-- common_element_end('li');
-- }
-+ common_element_start('li', 'before');
-+ common_element('a', array('href' => common_local_url($action, $newargs), 'rel' => 'prev'),
-+ _('« After'));
-+ common_element_end('li');
-+ }
-hunk ./lib/util.php 1784
-- if ($have_after) {
-- $pargs = array('page' => $page+1);
-- $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-- common_element_start('li', 'after');
-- common_element('a', array('href' => common_local_url($action, $newargs), 'rel' => 'next'),
-- _('Before »'));
-- common_element_end('li');
-- }
-+ if ($have_after) {
-+ $pargs = array('page' => $page+1);
-+ $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-+ common_element_start('li', 'after');
-+ common_element('a', array('href' => common_local_url($action, $newargs), 'rel' => 'next'),
-+ _('Before »'));
-+ common_element_end('li');
-+ }
-hunk ./lib/util.php 1793
-- if ($have_before || $have_after) {
-- common_element_end('ul');
-- common_element_end('div');
-- }
-+ if ($have_before || $have_after) {
-+ common_element_end('ul');
-+ common_element_end('div');
-+ }
-hunk ./lib/util.php 1803
-- # No arg means accept anything (per HTTP spec)
-- if(!$accept) {
-- return array($def => 1);
-- }
-+ // No arg means accept anything (per HTTP spec)
-+ if(!$accept) {
-+ return array($def => 1);
-+ }
-hunk ./lib/util.php 1808
-- $prefs = array();
-+ $prefs = array();
-hunk ./lib/util.php 1810
-- $parts = explode(',', $accept);
-+ $parts = explode(',', $accept);
-hunk ./lib/util.php 1812
-- foreach($parts as $part) {
-- # FIXME: doesn't deal with params like 'text/html; level=1'
-- @list($value, $qpart) = explode(';', $part);
-- $match = array();
-- if(!isset($qpart)) {
-- $prefs[$value] = 1;
-- } elseif(preg_match('/q\s*=\s*(\d*\.\d+)/', $qpart, $match)) {
-- $prefs[$value] = $match[1];
-- }
-- }
-+ foreach($parts as $part) {
-+ // FIXME: doesn't deal with params like 'text/html; level=1'
-+ @list($value, $qpart) = explode(';', $part);
-+ $match = array();
-+ if(!isset($qpart)) {
-+ $prefs[$value] = 1;
-+ } elseif(preg_match('/q\s*=\s*(\d*\.\d+)/', $qpart, $match)) {
-+ $prefs[$value] = $match[1];
-+ }
-+ }
-hunk ./lib/util.php 1823
-- return $prefs;
-+ return $prefs;
-hunk ./lib/util.php 1827
-- if(array_key_exists($type, $avail)) {
-- return $type;
-- } else {
-- $parts = explode('/', $type);
-- if(array_key_exists($parts[0] . '/*', $avail)) {
-- return $parts[0] . '/*';
-- } elseif(array_key_exists('*/*', $avail)) {
-- return '*/*';
- } else {
-- return NULL;
+- return $def;
- }
- }
-+ if(array_key_exists($type, $avail)) {
-+ return $type;
-+ } else {
-+ $parts = explode('/', $type);
-+ if(array_key_exists($parts[0] . '/*', $avail)) {
-+ return $parts[0] . '/*';
-+ } elseif(array_key_exists('*/*', $avail)) {
-+ return '*/*';
++ if (is_null($arg)) {
++ return $def;
++ } else if (in_array($arg, array('true', 'yes', '1'))) {
++ return true;
++ } else if (in_array($arg, array('false', 'no', '0'))) {
++ return false;
+ } else {
-+ return null;
++ return $def;
+ }
+ }
-hunk ./lib/util.php 1842
-- $combine = array();
-+ $combine = array();
-hunk ./lib/util.php 1844
-- foreach(array_keys($sprefs) as $type) {
-- $parts = explode('/', $type);
-- if($parts[1] != '*') {
-- $ckey = common_mime_type_match($type, $cprefs);
-- if($ckey) {
-- $combine[$type] = $sprefs[$type] * $cprefs[$ckey];
-- }
-- }
-- }
-+ foreach(array_keys($sprefs) as $type) {
-+ $parts = explode('/', $type);
-+ if($parts[1] != '*') {
-+ $ckey = common_mime_type_match($type, $cprefs);
-+ if($ckey) {
-+ $combine[$type] = $sprefs[$type] * $cprefs[$ckey];
-+ }
-+ }
-+ }
-hunk ./lib/util.php 1854
-- foreach(array_keys($cprefs) as $type) {
-- $parts = explode('/', $type);
-- if($parts[1] != '*' && !array_key_exists($type, $sprefs)) {
-- $skey = common_mime_type_match($type, $sprefs);
-- if($skey) {
-- $combine[$type] = $sprefs[$skey] * $cprefs[$type];
-- }
-- }
-- }
-+ foreach(array_keys($cprefs) as $type) {
-+ $parts = explode('/', $type);
-+ if($parts[1] != '*' && !array_key_exists($type, $sprefs)) {
-+ $skey = common_mime_type_match($type, $sprefs);
-+ if($skey) {
-+ $combine[$type] = $sprefs[$skey] * $cprefs[$type];
-+ }
-+ }
-+ }
-hunk ./lib/util.php 1864
-- $bestq = 0;
-- $besttype = "text/html";
-+ $bestq = 0;
-+ $besttype = "text/html";
-hunk ./lib/util.php 1867
-- foreach(array_keys($combine) as $type) {
-- if($combine[$type] > $bestq) {
-- $besttype = $type;
-- $bestq = $combine[$type];
-- }
-- }
-+ foreach(array_keys($combine) as $type) {
-+ if($combine[$type] > $bestq) {
-+ $besttype = $type;
-+ $bestq = $combine[$type];
-+ }
-+ }
-hunk ./lib/util.php 1874
-- return $besttype;
-+ return $besttype;
-hunk ./lib/util.php 1878
-- global $config;
-- return isset($config[$main][$sub]) ? $config[$main][$sub] : false;
-+ global $config;
-+ return isset($config[$main][$sub]) ? $config[$main][$sub] : false;
-hunk ./lib/util.php 1883
-- $to = array();
-- $strip = get_magic_quotes_gpc();
-- foreach ($from as $k => $v) {
-- $to[$k] = ($strip) ? stripslashes($v) : $v;
-- }
-- return $to;
-+ $to = array();
-+ $strip = get_magic_quotes_gpc();
-+ foreach ($from as $k => $v) {
-+ $to[$k] = ($strip) ? stripslashes($v) : $v;
-+ }
-+ return $to;
-hunk ./lib/util.php 1894
-- if(get_magic_quotes_gpc()) {
-- $_POST=array_map('stripslashes',$_POST);
-- $_GET=array_map('stripslashes',$_GET);
-- }
-+ if(get_magic_quotes_gpc()) {
-+ $_POST=array_map('stripslashes',$_POST);
-+ $_GET=array_map('stripslashes',$_GET);
-+ }
-hunk ./lib/util.php 1901
-- return common_local_url('userbyid', array('id' => $user->id));
-+ return common_local_url('userbyid', array('id' => $user->id));
-hunk ./lib/util.php 1905
-- return common_local_url('shownotice',
-- array('notice' => $notice->id));
-+ return common_local_url('shownotice',
-+ array('notice' => $notice->id));
-hunk ./lib/util.php 1909
--# 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
-+// 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
-hunk ./lib/util.php 1912
-- # 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
-- static $codechars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
-- $chars = ceil($bits/5);
-- $code = '';
-- for ($i = 0; $i < $chars; $i++) {
-- # XXX: convert to string and back
-- $num = hexdec(common_good_rand(1));
-- # XXX: randomness is too precious to throw away almost
-- # 40% of the bits we get!
-- $code .= $codechars[$num%32];
-- }
-- return $code;
-+ // 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
-+ static $codechars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
-+ $chars = ceil($bits/5);
-+ $code = '';
-+ for ($i = 0; $i < $chars; $i++) {
-+ // XXX: convert to string and back
-+ $num = hexdec(common_good_rand(1));
-+ // XXX: randomness is too precious to throw away almost
-+ // 40% of the bits we get!
-+ $code .= $codechars[$num%32];
-+ }
-+ return $code;
-hunk ./lib/util.php 1926
--# convert markup to HTML
-+// convert markup to HTML
-hunk ./lib/util.php 1929
-- $c = preg_replace('/%%action.(\w+)%%/e', "common_local_url('\\1')", $c);
-- $c = preg_replace('/%%doc.(\w+)%%/e', "common_local_url('doc', array('title'=>'\\1'))", $c);
-- $c = preg_replace('/%%(\w+).(\w+)%%/e', 'common_config(\'\\1\', \'\\2\')', $c);
-- return Markdown($c);
-+ $c = preg_replace('/%%action.(\w+)%%/e', "common_local_url('\\1')", $c);
-+ $c = preg_replace('/%%doc.(\w+)%%/e', "common_local_url('doc', array('title'=>'\\1'))", $c);
-+ $c = preg_replace('/%%(\w+).(\w+)%%/e', 'common_config(\'\\1\', \'\\2\')', $c);
-+ return Markdown($c);
-hunk ./lib/util.php 1936
-- $avatar = $profile->getAvatar($size);
-- if ($avatar) {
-- return common_avatar_display_url($avatar);
-- } else {
-- return common_default_avatar($size);
+hunk ./lib/action.php 123
+- function server_error($msg, $code=500) {
+- $action = $this->trimmed('action');
+- common_debug("Server error '$code' on '$action': $msg", __FILE__);
+- common_server_error($msg, $code);
- }
-+ $avatar = $profile->getAvatar($size);
-+ if ($avatar) {
-+ return common_avatar_display_url($avatar);
-+ } else {
-+ return common_default_avatar($size);
-+ }
-hunk ./lib/util.php 1945
-- if (!$profile) {
-- return NULL;
-- }
-- $user = User::staticGet($profile->id);
-- if ($user) {
-- return $user->uri;
-- }
-+ if (!$profile) {
-+ return null;
-+ }
-+ $user = User::staticGet($profile->id);
-+ if ($user) {
-+ return $user->uri;
-+ }
-hunk ./lib/util.php 1953
-- $remote = Remote_profile::staticGet($profile->id);
-- if ($remote) {
-- return $remote->uri;
-- }
-- # XXX: this is a very bad profile!
-- return NULL;
-+ $remote = Remote_profile::staticGet($profile->id);
-+ if ($remote) {
-+ return $remote->uri;
-+ }
-+ // XXX: this is a very bad profile!
-+ return null;
-hunk ./lib/util.php 1962
-- # strip non-digits
-- preg_replace('/\D/', '', $sms);
-- return $sms;
-+ // strip non-digits
-+ preg_replace('/\D/', '', $sms);
-+ return $sms;
-hunk ./lib/util.php 1970
-- common_log(LOG_ERR, "[$errno] $errstr ($errfile:$errline)");
-- exit(1);
-- break;
-+ common_log(LOG_ERR, "[$errno] $errstr ($errfile:$errline)");
-+ exit(1);
-+ break;
-hunk ./lib/util.php 1974
-- case E_USER_WARNING:
-- common_log(LOG_WARNING, "[$errno] $errstr ($errfile:$errline)");
-- break;
-+ case E_USER_WARNING:
-+ common_log(LOG_WARNING, "[$errno] $errstr ($errfile:$errline)");
-+ break;
-hunk ./lib/util.php 1979
-- common_log(LOG_NOTICE, "[$errno] $errstr ($errfile:$errline)");
-- break;
-+ common_log(LOG_NOTICE, "[$errno] $errstr ($errfile:$errline)");
-+ break;
-hunk ./lib/util.php 1983
-- # FIXME: show error page if we're on the Web
-+ // FIXME: show error page if we're on the Web
-hunk ./lib/util.php 1989
-- common_ensure_session();
-- if (!array_key_exists('token', $_SESSION)) {
-- $_SESSION['token'] = common_good_rand(64);
-- }
-- return $_SESSION['token'];
-+ common_ensure_session();
-+ if (!array_key_exists('token', $_SESSION)) {
-+ $_SESSION['token'] = common_good_rand(64);
++ function server_error($msg, $code=500)
++ {
++ $action = $this->trimmed('action');
++ common_debug("Server error '$code' on '$action': $msg", __FILE__);
++ common_server_error($msg, $code);
+ }
-+ return $_SESSION['token'];
-hunk ./lib/util.php 1997
-- common_element_start('form', array('id' => 'disfavor-' . $notice->id,
-- 'method' => 'post',
-- 'class' => 'disfavor',
-- 'action' => common_local_url('disfavor')));
-+ common_element_start('form', array('id' => 'disfavor-' . $notice->id,
-+ 'method' => 'post',
-+ 'class' => 'disfavor',
-+ 'action' => common_local_url('disfavor')));
-hunk ./lib/util.php 2002
-- common_element('input', array('type' => 'hidden',
-- 'name' => 'token-'. $notice->id,
-- 'id' => 'token-'. $notice->id,
-- 'class' => 'token',
-- 'value' => common_session_token()));
-+ common_element('input', array('type' => 'hidden',
-+ 'name' => 'token-'. $notice->id,
-+ 'id' => 'token-'. $notice->id,
-+ 'class' => 'token',
-+ 'value' => common_session_token()));
-hunk ./lib/util.php 2008
-- common_element('input', array('type' => 'hidden',
-- 'name' => 'notice',
-- 'id' => 'notice-n'. $notice->id,
-- 'class' => 'notice',
-- 'value' => $notice->id));
-+ common_element('input', array('type' => 'hidden',
-+ 'name' => 'notice',
-+ 'id' => 'notice-n'. $notice->id,
-+ 'class' => 'notice',
-+ 'value' => $notice->id));
-hunk ./lib/util.php 2014
-- common_element('input', array('type' => 'submit',
-- 'id' => 'disfavor-submit-' . $notice->id,
-- 'name' => 'disfavor-submit-' . $notice->id,
-- 'class' => 'disfavor',
-- 'value' => 'Disfavor favorite',
-- 'title' => 'Remove this message from favorites'));
-- common_element_end('form');
-+ common_element('input', array('type' => 'submit',
-+ 'id' => 'disfavor-submit-' . $notice->id,
-+ 'name' => 'disfavor-submit-' . $notice->id,
-+ 'class' => 'disfavor',
-+ 'value' => 'Disfavor favorite',
-+ 'title' => 'Remove this message from favorites'));
-+ common_element_end('form');
-hunk ./lib/util.php 2024
-- common_element_start('form', array('id' => 'favor-' . $notice->id,
-- 'method' => 'post',
-- 'class' => 'favor',
-- 'action' => common_local_url('favor')));
-+ common_element_start('form', array('id' => 'favor-' . $notice->id,
-+ 'method' => 'post',
-+ 'class' => 'favor',
-+ 'action' => common_local_url('favor')));
-hunk ./lib/util.php 2029
-- common_element('input', array('type' => 'hidden',
-- 'name' => 'token-'. $notice->id,
-- 'id' => 'token-'. $notice->id,
-- 'class' => 'token',
-- 'value' => common_session_token()));
-+ common_element('input', array('type' => 'hidden',
-+ 'name' => 'token-'. $notice->id,
-+ 'id' => 'token-'. $notice->id,
-+ 'class' => 'token',
-+ 'value' => common_session_token()));
-hunk ./lib/util.php 2035
-- common_element('input', array('type' => 'hidden',
-- 'name' => 'notice',
-- 'id' => 'notice-n'. $notice->id,
-- 'class' => 'notice',
-- 'value' => $notice->id));
-+ common_element('input', array('type' => 'hidden',
-+ 'name' => 'notice',
-+ 'id' => 'notice-n'. $notice->id,
-+ 'class' => 'notice',
-+ 'value' => $notice->id));
-hunk ./lib/util.php 2041
-- common_element('input', array('type' => 'submit',
-- 'id' => 'favor-submit-' . $notice->id,
-- 'name' => 'favor-submit-' . $notice->id,
-- 'class' => 'favor',
-- 'value' => 'Add to favorites',
-- 'title' => 'Add this message to favorites'));
-- common_element_end('form');
-+ common_element('input', array('type' => 'submit',
-+ 'id' => 'favor-submit-' . $notice->id,
-+ 'name' => 'favor-submit-' . $notice->id,
-+ 'class' => 'favor',
-+ 'value' => 'Add to favorites',
-+ 'title' => 'Add this message to favorites'));
-+ common_element_end('form');
-hunk ./lib/util.php 2051
-- common_element_start('form', array('id' => 'nudge', 'method' => 'post',
-- 'action' => common_local_url('nudge', array('nickname' => $profile->nickname))));
-- common_hidden('token', common_session_token());
-- common_element('input', array('type' => 'submit',
-- 'class' => 'submit',
-- 'value' => _('Send a nudge')));
-- common_element_end('form');
-+ common_element_start('form', array('id' => 'nudge', 'method' => 'post',
-+ 'action' => common_local_url('nudge', array('nickname' => $profile->nickname))));
-+ common_hidden('token', common_session_token());
-+ common_element('input', array('type' => 'submit',
-+ 'class' => 'submit',
-+ 'value' => _('Send a nudge')));
-+ common_element_end('form');
-hunk ./lib/util.php 2060
-- common_element('p', array('id' => 'nudge_response'), _('Nudge sent!'));
-+ common_element('p', array('id' => 'nudge_response'), _('Nudge sent!'));
-hunk ./lib/util.php 2064
-- common_element_start('form', array('id' => 'subscribe-' . $profile->id,
-- 'method' => 'post',
-- 'class' => 'subscribe',
-- 'action' => common_local_url('subscribe')));
-- common_hidden('token', common_session_token());
-- common_element('input', array('id' => 'subscribeto-' . $profile->id,
-- 'name' => 'subscribeto',
-- 'type' => 'hidden',
-- 'value' => $profile->id));
-- common_element('input', array('type' => 'submit',
-- 'class' => 'submit',
-- 'value' => _('Subscribe')));
-- common_element_end('form');
-+ common_element_start('form', array('id' => 'subscribe-' . $profile->id,
-+ 'method' => 'post',
-+ 'class' => 'subscribe',
-+ 'action' => common_local_url('subscribe')));
-+ common_hidden('token', common_session_token());
-+ common_element('input', array('id' => 'subscribeto-' . $profile->id,
-+ 'name' => 'subscribeto',
-+ 'type' => 'hidden',
-+ 'value' => $profile->id));
-+ common_element('input', array('type' => 'submit',
-+ 'class' => 'submit',
-+ 'value' => _('Subscribe')));
-+ common_element_end('form');
-hunk ./lib/util.php 2080
-- common_element_start('form', array('id' => 'unsubscribe-' . $profile->id,
-- 'method' => 'post',
-- 'class' => 'unsubscribe',
-- 'action' => common_local_url('unsubscribe')));
-- common_hidden('token', common_session_token());
-- common_element('input', array('id' => 'unsubscribeto-' . $profile->id,
-- 'name' => 'unsubscribeto',
-- 'type' => 'hidden',
-- 'value' => $profile->id));
-- common_element('input', array('type' => 'submit',
-- 'class' => 'submit',
-- 'value' => _('Unsubscribe')));
-- common_element_end('form');
-+ common_element_start('form', array('id' => 'unsubscribe-' . $profile->id,
-+ 'method' => 'post',
-+ 'class' => 'unsubscribe',
-+ 'action' => common_local_url('unsubscribe')));
-+ common_hidden('token', common_session_token());
-+ common_element('input', array('id' => 'unsubscribeto-' . $profile->id,
-+ 'name' => 'unsubscribeto',
-+ 'type' => 'hidden',
-+ 'value' => $profile->id));
-+ common_element('input', array('type' => 'submit',
-+ 'class' => 'submit',
-+ 'value' => _('Unsubscribe')));
-+ common_element_end('form');
-hunk ./lib/util.php 2097
-- $user = User::staticGet('id', $profile->id);
-+ $user = User::staticGet('id', $profile->id);
-hunk ./lib/util.php 2099
-- if ($cur && $cur->id != $user->id && $cur->mutuallySubscribed($user)) {
-+ if ($cur && $cur->id != $user->id && $cur->mutuallySubscribed($user)) {
-hunk ./lib/util.php 2101
-- common_element('a', array('href' => common_local_url('newmessage', array('to' => $user->id))),
-- _('Send a message'));
-+ common_element('a', array('href' => common_local_url('newmessage', array('to' => $user->id))),
-+ _('Send a message'));
-hunk ./lib/util.php 2105
-- if ($user->email && $user->emailnotifynudge) {
-+ if ($user->email && $user->emailnotifynudge) {
-hunk ./lib/util.php 2110
+hunk ./lib/action.php 130
+- function client_error($msg, $code=400) {
+- $action = $this->trimmed('action');
+- common_debug("User error '$code' on '$action': $msg", __FILE__);
+- common_user_error($msg, $code);
- }
++ function client_error($msg, $code=400)
++ {
++ $action = $this->trimmed('action');
++ common_debug("User error '$code' on '$action': $msg", __FILE__);
++ common_user_error($msg, $code);
+ }
-hunk ./lib/util.php 2114
-- return 'laconica:' . common_keyize(common_config('site', 'name')) . ':' . $extra;
-+ return 'laconica:' . common_keyize(common_config('site', 'name')) . ':' . $extra;
-hunk ./lib/util.php 2118
-- $str = strtolower($str);
-- $str = preg_replace('/\s/', '_', $str);
-- return $str;
-+ $str = strtolower($str);
-+ $str = preg_replace('/\s/', '_', $str);
-+ return $str;
-hunk ./lib/util.php 2125
-- common_element_start('form', array('id' => 'message_form',
-- 'method' => 'post',
-- 'action' => common_local_url('newmessage')));
-+ common_element_start('form', array('id' => 'message_form',
-+ 'method' => 'post',
-+ 'action' => common_local_url('newmessage')));
-hunk ./lib/util.php 2129
-- $mutual_users = $user->mutuallySubscribedUsers();
-+ $mutual_users = $user->mutuallySubscribedUsers();
-hunk ./lib/util.php 2131
-- $mutual = array();
-+ $mutual = array();
-hunk ./lib/util.php 2133
-- while ($mutual_users->fetch()) {
-- if ($mutual_users->id != $user->id) {
-- $mutual[$mutual_users->id] = $mutual_users->nickname;
+hunk ./lib/action.php 137
+- function self_url() {
+- $action = $this->trimmed('action');
+- $args = $this->args;
+- unset($args['action']);
+- foreach (array_keys($_COOKIE) as $cookie) {
+- unset($args[$cookie]);
- }
+- return common_local_url($action, $args);
- }
-+ while ($mutual_users->fetch()) {
-+ if ($mutual_users->id != $user->id) {
-+ $mutual[$mutual_users->id] = $mutual_users->nickname;
++ function self_url()
++ {
++ $action = $this->trimmed('action');
++ $args = $this->args;
++ unset($args['action']);
++ foreach (array_keys($_COOKIE) as $cookie) {
++ unset($args[$cookie]);
+ }
++ return common_local_url($action, $args);
+ }
-hunk ./lib/util.php 2139
-- $mutual_users->free();
-- unset($mutual_users);
-+ $mutual_users->free();
-+ unset($mutual_users);
-hunk ./lib/util.php 2142
-- common_dropdown('to', _('To'), $mutual, NULL, FALSE, $to->id);
-+ common_dropdown('to', _('To'), $mutual, null, FALSE, $to->id);
-hunk ./lib/util.php 2144
-- common_element_start('p');
-+ common_element_start('p');
-hunk ./lib/util.php 2146
-- common_element('textarea', array('id' => 'message_content',
-- 'cols' => 60,
-- 'rows' => 3,
-- 'name' => 'content'),
-- ($content) ? $content : '');
-+ common_element('textarea', array('id' => 'message_content',
-+ 'cols' => 60,
-+ 'rows' => 3,
-+ 'name' => 'content'),
-+ ($content) ? $content : '');
-hunk ./lib/util.php 2152
-- common_element('input', array('id' => 'message_send',
-- 'name' => 'message_send',
-- 'type' => 'submit',
-- 'value' => _('Send')));
-+ common_element('input', array('id' => 'message_send',
-+ 'name' => 'message_send',
-+ 'type' => 'submit',
-+ 'value' => _('Send')));
-hunk ./lib/util.php 2157
-- common_hidden('token', common_session_token());
-+ common_hidden('token', common_session_token());
-hunk ./lib/util.php 2159
-- common_element_end('p');
-- common_element_end('form');
-+ common_element_end('p');
-+ common_element_end('form');
-hunk ./lib/util.php 2164
-- static $cache = NULL;
-- if (!common_config('memcached', 'enabled')) {
-- return NULL;
-- } else {
-- if (!$cache) {
-- $cache = new Memcache();
-- $servers = common_config('memcached', 'server');
-- if (is_array($servers)) {
-- foreach($servers as $server) {
-- $cache->addServer($server);
-- }
-- } else {
-- $cache->addServer($servers);
-- }
-- }
-- return $cache;
+hunk ./lib/action.php 148
+- function nav_menu($menu) {
++ function nav_menu($menu)
++ {
+hunk ./lib/action.php 153
+- common_menu_item(common_local_url($menuaction, isset($menudesc[2]) ? $menudesc[2] : NULL),
+- $menudesc[0],
+- $menudesc[1],
+- $action == $menuaction);
++ common_menu_item(common_local_url($menuaction,
++ isset($menudesc[2]) ? $menudesc[2] : null),
++ $menudesc[0],
++ $menudesc[1],
++ $action == $menuaction);
+hunk ./lib/action.php 160
- }
-+ static $cache = null;
-+ if (!common_config('memcached', 'enabled')) {
-+ return null;
-+ } else {
-+ if (!$cache) {
-+ $cache = new Memcache();
-+ $servers = common_config('memcached', 'server');
-+ if (is_array($servers)) {
-+ foreach($servers as $server) {
-+ $cache->addServer($server);
-+ }
-+ } else {
-+ $cache->addServer($servers);
-+ }
-+ }
-+ return $cache;
+ }
-hunk ./lib/util.php 2184
-- # XXX: better compatibility check needed here!
-- return ($from == $to);
-+ // XXX: better compatibility check needed here!
-+ return ($from == $to);
-hunk ./lib/util.php 2190
--function common_block_form($profile, $args=NULL) {
-+function common_block_form($profile, $args=null) {
-hunk ./lib/util.php 2194
--function common_unblock_form($profile, $args=NULL) {
-+function common_unblock_form($profile, $args=null) {
-hunk ./lib/util.php 2198
--function common_blocking_form($type, $label, $profile, $args=NULL) {
-+function common_blocking_form($type, $label, $profile, $args=null) {
-hunk ./lib/util.php 2220
--