2008-05-20 22:05:35 +09:00
< ? php
2008-05-21 04:14:12 +09:00
/*
2008-05-20 22:05:35 +09:00
* Laconica - a distributed open - source microblogging tool
* Copyright ( C ) 2008 , Controlez - Vous , Inc .
2008-05-21 04:14:12 +09:00
*
2008-05-20 22:05:35 +09:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
2008-05-21 04:14:12 +09:00
*
2008-05-20 22:05:35 +09:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
2008-05-21 04:14:12 +09:00
*
2008-05-20 22:05:35 +09:00
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*/
/* XXX: break up into separate modules (HTTP, HTML, user, files) */
# Show a server error
2008-06-07 01:04:37 +09:00
function common_server_error ( $msg , $code = 500 ) {
static $status = array ( 500 => 'Internal Server Error' ,
501 => 'Not Implemented' ,
502 => 'Bad Gateway' ,
503 => 'Service Unavailable' ,
504 => 'Gateway Timeout' ,
505 => 'HTTP Version Not Supported' );
if ( ! array_key_exists ( $code , $status )) {
$code = 500 ;
}
$status_string = $status [ $code ];
header ( 'HTTP/1.1 ' . $code . ' ' . $status_string );
2008-05-20 22:05:35 +09:00
header ( 'Content-type: text/plain' );
print $msg ;
2008-06-03 04:38:51 +09:00
print " \n " ;
2008-05-20 22:05:35 +09:00
exit ();
}
# Show a user error
2008-06-27 07:50:02 +09:00
function common_user_error ( $msg , $code = 400 ) {
2008-06-07 01:04:37 +09:00
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' );
if ( ! array_key_exists ( $code , $status )) {
$code = 400 ;
}
$status_string = $status [ $code ];
header ( 'HTTP/1.1 ' . $code . ' ' . $status_string );
2008-05-20 22:05:35 +09:00
common_show_header ( 'Error' );
common_element ( 'div' , array ( 'class' => 'error' ), $msg );
common_show_footer ();
}
2008-05-20 22:27:22 +09:00
$xw = null ;
2008-05-20 22:05:35 +09:00
# Start an HTML element
function common_element_start ( $tag , $attrs = NULL ) {
2008-05-20 22:27:22 +09:00
global $xw ;
$xw -> startElement ( $tag );
2008-05-20 22:05:35 +09:00
if ( is_array ( $attrs )) {
foreach ( $attrs as $name => $value ) {
2008-05-20 22:27:22 +09:00
$xw -> writeAttribute ( $name , $value );
2008-05-20 22:05:35 +09:00
}
} else if ( is_string ( $attrs )) {
2008-05-20 22:27:22 +09:00
$xw -> writeAttribute ( 'class' , $attrs );
2008-05-20 22:05:35 +09:00
}
}
function common_element_end ( $tag ) {
2008-07-09 08:32:18 +09:00
static $empty_tag = array ( 'base' , 'meta' , 'link' , 'hr' ,
'br' , 'param' , 'img' , 'area' ,
2008-07-10 07:46:30 +09:00
'input' , 'col' );
2008-05-20 22:27:22 +09:00
global $xw ;
2008-07-09 08:50:04 +09:00
# XXX: check namespace
2008-07-09 08:32:18 +09:00
if ( in_array ( $tag , $empty_tag )) {
$xw -> endElement ();
} else {
$xw -> fullEndElement ();
}
2008-05-20 22:05:35 +09:00
}
function common_element ( $tag , $attrs = NULL , $content = NULL ) {
2008-07-09 08:50:04 +09:00
common_element_start ( $tag , $attrs );
global $xw ;
2008-07-23 01:36:18 +09:00
if ( ! is_null ( $content )) {
2008-07-09 08:50:04 +09:00
$xw -> text ( $content );
}
common_element_end ( $tag );
2008-05-20 22:05:35 +09:00
}
2008-11-24 06:13:48 +09:00
function common_start_xml ( $doc = NULL , $public = NULL , $system = NULL , $indent = true ) {
2008-05-21 23:33:51 +09:00
global $xw ;
$xw = new XMLWriter ();
$xw -> openURI ( 'php://output' );
2008-11-24 06:13:48 +09:00
$xw -> setIndent ( $indent );
2008-05-21 23:33:51 +09:00
$xw -> startDocument ( '1.0' , 'UTF-8' );
if ( $doc ) {
$xw -> writeDTD ( $doc , $public , $system );
}
}
function common_end_xml () {
global $xw ;
$xw -> endDocument ();
$xw -> flush ();
}
2008-12-05 05:34:33 +09:00
function common_init_locale ( $language = null ) {
if ( ! $language ) {
$language = common_language ();
}
putenv ( 'LANGUAGE=' . $language );
putenv ( 'LANG=' . $language );
return setlocale ( LC_ALL , $language . " .utf8 " ,
$language . " .UTF8 " ,
$language . " .utf-8 " ,
$language . " .UTF-8 " ,
$language );
}
2008-08-06 12:45:15 +09:00
function common_init_language () {
2008-08-18 00:30:24 +09:00
mb_internal_encoding ( 'UTF-8' );
2008-07-30 12:54:46 +09:00
$language = common_language ();
2008-07-31 11:04:33 +09:00
# So we don't have to make people install the gettext locales
2008-12-05 05:34:33 +09:00
$locale_set = common_init_locale ( $language );
2008-08-06 21:21:19 +09:00
bindtextdomain ( " laconica " , common_config ( 'site' , 'locale_path' ));
2008-07-31 11:04:33 +09:00
bind_textdomain_codeset ( " laconica " , " UTF-8 " );
2008-07-30 12:54:46 +09:00
textdomain ( " laconica " );
2008-08-06 13:04:33 +09:00
setlocale ( LC_CTYPE , 'C' );
2008-10-08 00:50:38 +09:00
if ( ! $locale_set ) {
2008-10-07 23:52:32 +09:00
common_log ( LOG_INFO , 'Language requested:' . $language . ' - locale could not be set:' , __FILE__ );
}
2008-08-06 13:04:33 +09:00
}
define ( 'PAGE_TYPE_PREFS' , 'text/html,application/xhtml+xml,application/xml;q=0.3,text/xml;q=0.2' );
function common_show_header ( $pagetitle , $callable = NULL , $data = NULL , $headercall = NULL ) {
2008-12-03 12:27:43 +09:00
2008-08-06 13:04:33 +09:00
global $config , $xw ;
2008-12-08 14:50:23 +09:00
global $action ; /* XXX: kind of cheating here. */
2008-08-06 13:04:33 +09:00
2008-09-18 22:56:08 +09:00
common_start_html ();
2008-12-03 12:27:43 +09:00
2008-05-20 22:05:35 +09:00
common_element_start ( 'head' );
2008-05-21 04:14:12 +09:00
common_element ( 'title' , NULL ,
2008-05-20 22:05:35 +09:00
$pagetitle . " - " . $config [ 'site' ][ 'name' ]);
2008-05-21 02:34:27 +09:00
common_element ( 'link' , array ( 'rel' => 'stylesheet' ,
'type' => 'text/css' ,
2008-09-23 15:52:11 +09:00
'href' => theme_path ( 'display.css' ) . '?version=' . LACONICA_VERSION ,
2008-05-21 02:34:27 +09:00
'media' => 'screen, projection, tv' ));
2008-06-11 03:52:38 +09:00
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" ' .
2008-09-23 15:52:11 +09:00
'href="' . theme_path ( 'ie' . $ver . '.css' ) . '?version=' . LACONICA_VERSION . '" /><![endif]' );
2008-06-11 03:52:38 +09:00
}
}
2008-06-20 15:56:19 +09:00
2008-06-17 13:36:50 +09:00
common_element ( 'script' , array ( 'type' => 'text/javascript' ,
2008-06-17 13:40:54 +09:00
'src' => common_path ( 'js/jquery.min.js' )),
2008-06-17 13:36:50 +09:00
' ' );
2008-09-09 06:16:10 +09:00
common_element ( 'script' , array ( 'type' => 'text/javascript' ,
'src' => common_path ( 'js/jquery.form.js' )),
' ' );
2008-11-15 12:35:49 +09:00
common_element ( 'script' , array ( 'type' => 'text/javascript' ,
'src' => common_path ( 'js/xbImportNode.js' )),
' ' );
2008-06-25 02:46:13 +09:00
common_element ( 'script' , array ( 'type' => 'text/javascript' ,
2008-10-21 02:42:31 +09:00
'src' => common_path ( 'js/util.js?version=' . LACONICA_VERSION )),
2008-06-25 02:46:13 +09:00
' ' );
2008-07-20 10:58:23 +09:00
common_element ( 'link' , array ( 'rel' => 'search' , 'type' => 'application/opensearchdescription+xml' ,
2008-07-21 04:55:05 +09:00
'href' => common_local_url ( 'opensearch' , array ( 'type' => 'people' )),
'title' => common_config ( 'site' , 'name' ) . ' People 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' ));
2008-06-20 15:56:19 +09:00
2008-05-22 00:24:04 +09:00
if ( $callable ) {
if ( $data ) {
call_user_func ( $callable , $data );
} else {
call_user_func ( $callable );
}
}
2008-05-20 22:05:35 +09:00
common_element_end ( 'head' );
2008-12-08 14:50:23 +09:00
common_element_start ( 'body' , $action );
2008-06-11 03:52:38 +09:00
common_element_start ( 'div' , array ( 'id' => 'wrap' ));
2008-05-21 04:14:12 +09:00
common_element_start ( 'div' , array ( 'id' => 'header' ));
2008-06-11 03:52:38 +09:00
common_nav_menu ();
2008-07-20 11:32:59 +09:00
if (( isset ( $config [ 'site' ][ 'logo' ]) && is_string ( $config [ 'site' ][ 'logo' ]) && ( strlen ( $config [ 'site' ][ 'logo' ]) > 0 ))
2008-06-19 00:30:36 +09:00
|| file_exists ( theme_file ( 'logo.png' )))
{
2008-06-14 00:46:32 +09:00
common_element_start ( 'a' , array ( 'href' => common_local_url ( 'public' )));
2008-07-20 11:32:59 +09:00
common_element ( 'img' , array ( 'src' => isset ( $config [ 'site' ][ 'logo' ]) ?
2008-06-14 00:46:32 +09:00
( $config [ 'site' ][ 'logo' ]) : theme_path ( 'logo.png' ),
'alt' => $config [ 'site' ][ 'name' ],
'id' => 'logo' ));
common_element_end ( 'a' );
2008-06-19 00:20:04 +09:00
} else {
2008-06-19 00:46:43 +09:00
common_element_start ( 'p' , array ( 'id' => 'branding' ));
common_element ( 'a' , array ( 'href' => common_local_url ( 'public' )),
$config [ 'site' ][ 'name' ]);
common_element_end ( 'p' );
2008-06-14 00:46:32 +09:00
}
2008-06-20 15:56:19 +09:00
2008-06-14 00:46:32 +09:00
common_element ( 'h1' , 'pagetitle' , $pagetitle );
2008-06-20 15:56:19 +09:00
2008-06-12 03:36:34 +09:00
if ( $headercall ) {
if ( $data ) {
call_user_func ( $headercall , $data );
} else {
call_user_func ( $headercall );
}
}
2008-05-21 02:34:27 +09:00
common_element_end ( 'div' );
2008-06-11 03:52:38 +09:00
common_element_start ( 'div' , array ( 'id' => 'content' ));
2008-05-20 22:05:35 +09:00
}
2008-11-24 06:13:48 +09:00
function common_start_html ( $type = NULL , $indent = true ) {
2008-12-03 12:27:43 +09:00
2008-09-18 22:56:08 +09:00
if ( ! $type ) {
$httpaccept = isset ( $_SERVER [ 'HTTP_ACCEPT' ]) ? $_SERVER [ 'HTTP_ACCEPT' ] : NULL ;
2008-12-03 12:27:43 +09:00
2008-09-18 22:56:08 +09:00
# XXX: allow content negotiation for RDF, RSS, or XRDS
2008-12-03 12:27:43 +09:00
2008-09-18 22:56:08 +09:00
$type = common_negotiate_type ( common_accept_to_prefs ( $httpaccept ),
common_accept_to_prefs ( PAGE_TYPE_PREFS ));
2008-12-03 12:27:43 +09:00
2008-09-18 22:56:08 +09:00
if ( ! $type ) {
common_user_error ( _ ( 'This page is not available in a media type you accept' ), 406 );
exit ( 0 );
}
}
2008-12-03 12:27:43 +09:00
2008-09-18 22:56:08 +09:00
header ( 'Content-Type: ' . $type );
common_start_xml ( 'html' ,
'-//W3C//DTD XHTML 1.0 Strict//EN' ,
2008-11-24 06:13:48 +09:00
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' , $indent );
2008-09-18 22:56:08 +09:00
# FIXME: correct language for interface
$language = common_language ();
common_element_start ( 'html' , array ( 'xmlns' => 'http://www.w3.org/1999/xhtml' ,
'xml:lang' => $language ,
'lang' => $language ));
}
2008-05-20 22:05:35 +09:00
function common_show_footer () {
2008-05-21 02:13:53 +09:00
global $xw , $config ;
2008-06-11 03:52:38 +09:00
common_element_end ( 'div' ); # content div
2008-05-20 22:05:35 +09:00
common_foot_menu ();
2008-06-11 04:55:02 +09:00
common_element_start ( 'div' , array ( 'id' => 'footer' ));
2008-07-02 22:15:07 +09:00
common_element_start ( 'div' , 'laconica' );
2008-07-02 02:56:11 +09:00
if ( common_config ( 'site' , 'broughtby' )) {
2008-07-08 18:45:31 +09:00
$instr = _ ( '**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%). ' );
2008-07-02 02:56:11 +09:00
} else {
2008-07-08 18:45:31 +09:00
$instr = _ ( '**%%site.name%%** is a microblogging service. ' );
2008-07-02 02:56:11 +09:00
}
2008-07-14 15:05:17 +09:00
$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 );
2008-07-02 02:56:11 +09:00
$output = common_markup_to_html ( $instr );
common_raw ( $output );
2008-07-02 22:15:07 +09:00
common_element_end ( 'div' );
2008-06-11 04:55:02 +09:00
common_element ( 'img' , array ( 'id' => 'cc' ,
2008-06-11 04:51:34 +09:00
'src' => $config [ 'license' ][ 'image' ],
'alt' => $config [ 'license' ][ 'title' ]));
common_element_start ( 'p' );
2008-07-08 18:45:31 +09:00
common_text ( _ ( 'Unless otherwise specified, contents of this site are copyright by the contributors and available under the ' ));
2008-06-11 04:51:34 +09:00
common_element ( 'a' , array ( 'class' => 'license' ,
'rel' => 'license' ,
2008-07-20 11:35:10 +09:00
'href' => $config [ 'license' ][ 'url' ]),
2008-06-11 04:51:34 +09:00
$config [ 'license' ][ 'title' ]);
2008-07-08 18:45:31 +09:00
common_text ( _ ( '. Contributors should be attributed by full name or nickname.' ));
2008-06-11 04:51:34 +09:00
common_element_end ( 'p' );
2008-05-21 06:04:37 +09:00
common_element_end ( 'div' );
2008-05-21 02:34:27 +09:00
common_element_end ( 'div' );
2008-05-20 22:05:35 +09:00
common_element_end ( 'body' );
common_element_end ( 'html' );
2008-05-21 23:33:51 +09:00
common_end_xml ();
2008-05-20 22:05:35 +09:00
}
2008-05-21 02:13:53 +09:00
function common_text ( $txt ) {
global $xw ;
$xw -> text ( $txt );
}
2008-05-29 03:27:07 +09:00
function common_raw ( $xml ) {
global $xw ;
$xw -> writeRaw ( $xml );
}
2008-06-11 03:52:38 +09:00
function common_nav_menu () {
2008-05-20 22:05:35 +09:00
$user = common_current_user ();
2008-06-11 03:52:38 +09:00
common_element_start ( 'ul' , array ( 'id' => 'nav' ));
2008-06-11 10:56:09 +09:00
if ( $user ) {
common_menu_item ( common_local_url ( 'all' , array ( 'nickname' => $user -> nickname )),
2008-07-08 18:45:31 +09:00
_ ( 'Home' ));
2008-06-11 10:56:09 +09:00
}
2008-07-10 13:51:26 +09:00
common_menu_item ( common_local_url ( 'peoplesearch' ), _ ( 'Search' ));
2008-05-20 22:05:35 +09:00
if ( $user ) {
common_menu_item ( common_local_url ( 'profilesettings' ),
2008-07-08 18:45:31 +09:00
_ ( 'Settings' ));
2008-08-26 04:32:35 +09:00
common_menu_item ( common_local_url ( 'invite' ),
_ ( 'Invite' ));
2008-05-20 22:05:35 +09:00
common_menu_item ( common_local_url ( 'logout' ),
2008-07-08 18:45:31 +09:00
_ ( 'Logout' ));
2008-05-20 22:05:35 +09:00
} else {
2008-07-08 18:45:31 +09:00
common_menu_item ( common_local_url ( 'login' ), _ ( 'Login' ));
2008-07-25 08:58:04 +09:00
if ( ! common_config ( 'site' , 'closed' )) {
common_menu_item ( common_local_url ( 'register' ), _ ( 'Register' ));
}
2008-07-08 18:45:31 +09:00
common_menu_item ( common_local_url ( 'openidlogin' ), _ ( 'OpenID' ));
2008-05-20 22:05:35 +09:00
}
2008-11-24 06:25:32 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'help' )),
_ ( 'Help' ));
2008-05-20 22:05:35 +09:00
common_element_end ( 'ul' );
}
function common_foot_menu () {
2008-06-11 03:57:59 +09:00
common_element_start ( 'ul' , array ( 'id' => 'nav_sub' ));
2008-07-31 11:09:33 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'help' )),
_ ( 'Help' ));
2008-05-20 22:05:35 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'about' )),
2008-07-08 18:45:31 +09:00
_ ( 'About' ));
2008-07-01 01:12:01 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'faq' )),
2008-07-08 18:45:31 +09:00
_ ( 'FAQ' ));
2008-05-20 22:05:35 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'privacy' )),
2008-07-08 18:45:31 +09:00
_ ( 'Privacy' ));
2008-05-23 02:20:06 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'source' )),
2008-07-08 18:45:31 +09:00
_ ( 'Source' ));
2008-07-02 02:56:11 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'contact' )),
2008-07-08 18:45:31 +09:00
_ ( 'Contact' ));
2008-05-21 05:30:02 +09:00
common_element_end ( 'ul' );
2008-05-20 22:05:35 +09:00
}
2008-06-12 00:56:49 +09:00
function common_menu_item ( $url , $text , $title = NULL , $is_selected = false ) {
2008-06-12 00:52:58 +09:00
$lattrs = array ();
if ( $is_selected ) {
$lattrs [ 'class' ] = 'current' ;
}
common_element_start ( 'li' , $lattrs );
2008-05-20 22:05:35 +09:00
$attrs [ 'href' ] = $url ;
if ( $title ) {
$attrs [ 'title' ] = $title ;
}
common_element ( 'a' , $attrs , $text );
common_element_end ( 'li' );
}
2008-06-13 01:52:01 +09:00
function common_input ( $id , $label , $value = NULL , $instructions = NULL ) {
2008-05-21 02:47:59 +09:00
common_element_start ( 'p' );
2008-05-20 22:05:35 +09:00
common_element ( 'label' , array ( 'for' => $id ), $label );
$attrs = array ( 'name' => $id ,
'type' => 'text' ,
2008-06-27 23:55:53 +09:00
'class' => 'input_text' ,
2008-05-20 22:05:35 +09:00
'id' => $id );
if ( $value ) {
$attrs [ 'value' ] = htmlspecialchars ( $value );
}
common_element ( 'input' , $attrs );
2008-06-13 01:52:01 +09:00
if ( $instructions ) {
common_element ( 'span' , 'input_instructions' , $instructions );
}
2008-05-21 02:51:05 +09:00
common_element_end ( 'p' );
2008-05-20 22:05:35 +09:00
}
2008-09-24 06:38:29 +09:00
function common_checkbox ( $id , $label , $checked = false , $instructions = NULL , $value = 'true' , $disabled = false )
2008-06-24 09:15:23 +09:00
{
common_element_start ( 'p' );
$attrs = array ( 'name' => $id ,
'type' => 'checkbox' ,
2008-06-27 23:55:53 +09:00
'class' => 'checkbox' ,
2008-06-27 03:27:05 +09:00
'id' => $id );
2008-06-24 09:15:23 +09:00
if ( $value ) {
$attrs [ 'value' ] = htmlspecialchars ( $value );
}
2008-06-27 03:27:05 +09:00
if ( $checked ) {
$attrs [ 'checked' ] = 'checked' ;
}
2008-09-24 06:38:29 +09:00
if ( $disabled ) {
$attrs [ 'disabled' ] = 'true' ;
}
2008-06-27 03:22:31 +09:00
common_element ( 'input' , $attrs );
common_text ( ' ' );
2008-11-29 07:36:46 +09:00
common_element ( 'label' , array ( 'class' => 'checkbox_label' , 'for' => $id ), $label );
2008-06-27 03:22:31 +09:00
common_text ( ' ' );
2008-06-24 09:15:23 +09:00
if ( $instructions ) {
common_element ( 'span' , 'input_instructions' , $instructions );
}
common_element_end ( 'p' );
}
2008-07-19 09:34:17 +09:00
function common_dropdown ( $id , $label , $content , $instructions = NULL , $blank_select = FALSE , $selected = NULL ) {
2008-07-20 19:00:24 +09:00
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' );
2008-07-19 09:34:17 +09:00
if ( $instructions ) {
common_element ( 'span' , 'input_instructions' , $instructions );
}
common_element_end ( 'p' );
}
2008-05-31 02:43:10 +09:00
function common_hidden ( $id , $value ) {
common_element ( 'input' , array ( 'name' => $id ,
'type' => 'hidden' ,
'id' => $id ,
'value' => $value ));
}
2008-06-13 01:52:01 +09:00
function common_password ( $id , $label , $instructions = NULL ) {
2008-05-21 02:47:59 +09:00
common_element_start ( 'p' );
2008-05-20 22:05:35 +09:00
common_element ( 'label' , array ( 'for' => $id ), $label );
$attrs = array ( 'name' => $id ,
'type' => 'password' ,
2008-06-27 23:55:53 +09:00
'class' => 'password' ,
2008-05-20 22:05:35 +09:00
'id' => $id );
common_element ( 'input' , $attrs );
2008-06-13 01:52:01 +09:00
if ( $instructions ) {
common_element ( 'span' , 'input_instructions' , $instructions );
}
2008-05-21 02:51:05 +09:00
common_element_end ( 'p' );
2008-05-21 02:47:59 +09:00
}
2008-09-09 03:35:15 +09:00
function common_submit ( $id , $label , $cls = 'submit' ) {
2008-05-21 03:06:40 +09:00
global $xw ;
2008-05-21 02:47:59 +09:00
common_element_start ( 'p' );
common_element ( 'input' , array ( 'type' => 'submit' ,
'id' => $id ,
'name' => $id ,
2008-09-09 03:35:15 +09:00
'class' => $cls ,
2008-06-11 10:56:09 +09:00
'value' => $label ));
2008-05-21 02:51:05 +09:00
common_element_end ( 'p' );
2008-05-20 22:05:35 +09:00
}
2008-06-13 01:52:01 +09:00
function common_textarea ( $id , $label , $content = NULL , $instructions = NULL ) {
2008-05-21 06:19:45 +09:00
common_element_start ( 'p' );
common_element ( 'label' , array ( 'for' => $id ), $label );
2008-06-18 12:00:19 +09:00
common_element ( 'textarea' , array ( 'rows' => 3 ,
'cols' => 40 ,
'name' => $id ,
'id' => $id ),
2008-07-02 22:15:07 +09:00
( $content ) ? $content : '' );
2008-06-13 01:52:01 +09:00
if ( $instructions ) {
common_element ( 'span' , 'input_instructions' , $instructions );
}
2008-05-21 06:19:45 +09:00
common_element_end ( 'p' );
}
2008-07-20 23:13:25 +09:00
function common_timezone () {
if ( common_logged_in ()) {
$user = common_current_user ();
if ( $user -> timezone ) {
return $user -> timezone ;
}
}
global $config ;
return $config [ 'site' ][ 'timezone' ];
}
2008-07-19 09:34:17 +09:00
function common_language () {
2008-10-03 03:13:38 +09:00
// If there is a user logged in and they've set a language preference
// then return that one...
2008-07-19 09:34:17 +09:00
if ( common_logged_in ()) {
$user = common_current_user ();
$user_language = $user -> language ;
2008-10-03 03:13:38 +09:00
if ( $user_language )
return $user_language ;
2008-07-19 09:34:17 +09:00
}
2008-10-03 03:13:38 +09:00
// 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 ;
}
// Finally, if none of the above worked, use the site's default...
return common_config ( 'site' , 'language' );
2008-07-19 09:34:17 +09:00
}
2008-05-20 22:05:35 +09:00
# salted, hashed passwords are stored in the DB
2008-06-19 06:14:54 +09:00
function common_munge_password ( $password , $id ) {
return md5 ( $password . $id );
2008-05-20 22:05:35 +09:00
}
# check if a username exists and has matching password
function common_check_user ( $nickname , $password ) {
2008-08-26 03:52:45 +09:00
# NEVER allow blank passwords, even if they match the DB
if ( mb_strlen ( $password ) == 0 ) {
return false ;
}
2008-05-20 22:05:35 +09:00
$user = User :: staticGet ( 'nickname' , $nickname );
if ( is_null ( $user )) {
return false ;
} else {
2008-07-09 14:53:43 +09:00
if ( 0 == strcmp ( common_munge_password ( $password , $user -> id ),
$user -> password )) {
return $user ;
} else {
return false ;
}
2008-05-20 22:05:35 +09:00
}
}
# is the current user logged in?
function common_logged_in () {
return ( ! is_null ( common_current_user ()));
}
function common_have_session () {
return ( 0 != strcmp ( session_id (), '' ));
}
function common_ensure_session () {
if ( ! common_have_session ()) {
@ session_start ();
}
}
2008-07-09 14:53:43 +09:00
# Three kinds of arguments:
# 1) a user object
# 2) a nickname
# 3) NULL to clear
2008-12-10 02:34:02 +09:00
# Initialize to false; set to NULL if none found
$_cur = false ;
2008-07-09 14:53:43 +09:00
function common_set_user ( $user ) {
2008-12-10 02:34:02 +09:00
global $_cur ;
2008-07-09 15:25:02 +09:00
if ( is_null ( $user ) && common_have_session ()) {
2008-12-10 02:34:02 +09:00
$_cur = NULL ;
2008-05-20 22:05:35 +09:00
unset ( $_SESSION [ 'userid' ]);
return true ;
2008-07-09 14:53:43 +09:00
} else if ( is_string ( $user )) {
$nickname = $user ;
2008-05-20 22:05:35 +09:00
$user = User :: staticGet ( 'nickname' , $nickname );
2008-07-09 14:53:43 +09:00
} else if ( ! ( $user instanceof User )) {
return false ;
}
2008-07-10 07:46:30 +09:00
2008-07-09 14:53:43 +09:00
if ( $user ) {
common_ensure_session ();
$_SESSION [ 'userid' ] = $user -> id ;
2008-12-10 02:34:02 +09:00
$_cur = $user ;
return $_cur ;
2008-05-20 22:05:35 +09:00
}
return false ;
}
2008-06-24 12:08:34 +09:00
function common_set_cookie ( $key , $value , $expiration = 0 ) {
2008-06-24 11:52:34 +09:00
$path = common_config ( 'site' , 'path' );
$server = common_config ( 'site' , 'server' );
if ( $path && ( $path != '/' )) {
$cookiepath = '/' . $path . '/' ;
} else {
$cookiepath = '/' ;
}
return setcookie ( $key ,
$value ,
$expiration ,
$cookiepath ,
$server );
}
define ( 'REMEMBERME' , 'rememberme' );
2008-12-10 02:54:46 +09:00
define ( 'REMEMBERME_EXPIRY' , 30 * 24 * 60 * 60 ); # 30 days
2008-06-24 11:52:34 +09:00
2008-07-09 14:53:43 +09:00
function common_rememberme ( $user = NULL ) {
2008-06-24 11:52:34 +09:00
if ( ! $user ) {
2008-07-09 14:53:43 +09:00
$user = common_current_user ();
if ( ! $user ) {
common_debug ( 'No current user to remember' , __FILE__ );
return false ;
}
2008-06-24 11:52:34 +09:00
}
2008-12-10 02:54:46 +09:00
2008-06-24 11:52:34 +09:00
$rm = new Remember_me ();
2008-12-10 03:54:24 +09:00
2008-06-24 11:52:34 +09:00
$rm -> code = common_good_rand ( 16 );
2008-06-24 12:17:46 +09:00
$rm -> user_id = $user -> id ;
2008-12-10 03:54:24 +09:00
# Wrap the insert in some good ol' fashioned transaction code
$rm -> query ( 'BEGIN' );
2008-06-24 12:24:08 +09:00
$result = $rm -> insert ();
2008-12-10 02:54:46 +09:00
2008-06-24 12:24:08 +09:00
if ( ! $result ) {
2008-06-24 11:52:34 +09:00
common_log_db_error ( $rm , 'INSERT' , __FILE__ );
2008-07-09 14:19:43 +09:00
common_debug ( 'Error adding rememberme record for ' . $user -> nickname , __FILE__ );
2008-06-24 11:52:34 +09:00
return false ;
2008-12-10 02:54:46 +09:00
}
2008-12-10 03:54:24 +09:00
$rm -> query ( 'COMMIT' );
2008-12-10 02:54:46 +09:00
common_debug ( 'Inserted rememberme record (' . $rm -> code . ', ' . $rm -> user_id . '); result = ' . $result . '.' , __FILE__ );
$cookieval = $rm -> user_id . ':' . $rm -> code ;
common_log ( LOG_INFO , 'adding rememberme cookie "' . $cookieval . '" for ' . $user -> nickname );
common_set_cookie ( REMEMBERME , $cookieval , time () + REMEMBERME_EXPIRY );
2008-07-06 01:21:42 +09:00
return true ;
2008-06-24 11:52:34 +09:00
}
function common_remembered_user () {
2008-12-10 02:04:13 +09:00
2008-06-24 11:52:34 +09:00
$user = NULL ;
2008-12-10 02:04:13 +09:00
$packed = isset ( $_COOKIE [ REMEMBERME ]) ? $_COOKIE [ REMEMBERME ] : NULL ;
if ( ! $packed ) {
return NULL ;
}
list ( $id , $code ) = explode ( ':' , $packed );
if ( ! $id || ! $code ) {
2008-12-10 02:42:33 +09:00
common_log ( LOG_WARNING , 'Malformed rememberme cookie: ' . $packed );
2008-12-10 02:04:13 +09:00
common_forgetme ();
return NULL ;
}
$rm = Remember_me :: staticGet ( $code );
if ( ! $rm ) {
2008-12-10 02:42:33 +09:00
common_log ( LOG_WARNING , 'No such remember code: ' . $code );
2008-12-10 02:04:13 +09:00
common_forgetme ();
return NULL ;
}
if ( $rm -> user_id != $id ) {
2008-12-10 02:42:33 +09:00
common_log ( LOG_WARNING , 'Rememberme code for wrong user: ' . $rm -> user_id . ' != ' . $id );
2008-12-10 02:04:13 +09:00
common_forgetme ();
return NULL ;
}
$user = User :: staticGet ( $rm -> user_id );
if ( ! $user ) {
2008-12-10 02:42:33 +09:00
common_log ( LOG_WARNING , 'No such user for rememberme: ' . $rm -> user_id );
2008-12-10 02:04:13 +09:00
common_forgetme ();
return NULL ;
}
# successful!
$result = $rm -> delete ();
if ( ! $result ) {
common_log_db_error ( $rm , 'DELETE' , __FILE__ );
2008-12-10 02:42:33 +09:00
common_log ( LOG_WARNING , 'Could not delete rememberme: ' . $code );
2008-12-10 02:04:13 +09:00
common_forgetme ();
return NULL ;
}
common_log ( LOG_INFO , 'logging in ' . $user -> nickname . ' using rememberme code ' . $rm -> code );
2008-12-10 02:34:02 +09:00
common_set_user ( $user );
2008-12-10 02:04:13 +09:00
common_real_login ( false );
# We issue a new cookie, so they can log in
# automatically again after this session
common_rememberme ( $user );
2008-06-24 11:52:34 +09:00
return $user ;
}
# must be called with a valid user!
function common_forgetme () {
common_set_cookie ( REMEMBERME , '' , 0 );
}
2008-05-20 22:05:35 +09:00
# who is the current user?
function common_current_user () {
2008-12-10 02:34:02 +09:00
global $_cur ;
if ( $_cur === false ) {
if ( isset ( $_REQUEST [ session_name ()]) || ( isset ( $_SESSION [ 'userid' ]) && $_SESSION [ 'userid' ])) {
common_ensure_session ();
$id = isset ( $_SESSION [ 'userid' ]) ? $_SESSION [ 'userid' ] : false ;
if ( $id ) {
$_cur = User :: staticGet ( $id );
return $_cur ;
}
}
# that didn't work; try to remember; will init $_cur to NULL on failure
$_cur = common_remembered_user ();
if ( $_cur ) {
common_debug ( " Got User " . $_cur -> nickname );
common_debug ( " Faking session on remembered user " );
# XXX: Is this necessary?
$_SESSION [ 'userid' ] = $_cur -> id ;
}
}
return $_cur ;
2008-05-20 22:05:35 +09:00
}
2008-06-24 11:52:34 +09:00
# 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.
function common_real_login ( $real = true ) {
common_ensure_session ();
$_SESSION [ 'real_login' ] = $real ;
}
function common_is_real_login () {
return common_logged_in () && $_SESSION [ 'real_login' ];
}
2008-05-20 22:05:35 +09:00
# get canonical version of nickname for comparison
function common_canonical_nickname ( $nickname ) {
# XXX: UTF-8 canonicalization (like combining chars)
2008-06-11 23:18:24 +09:00
return strtolower ( $nickname );
2008-05-20 22:05:35 +09:00
}
# get canonical version of email for comparison
function common_canonical_email ( $email ) {
# XXX: canonicalize UTF-8
# XXX: lcase the domain part
return $email ;
}
2008-05-30 03:12:44 +09:00
define ( 'URL_REGEX' , '^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))' );
2008-05-30 02:25:49 +09:00
function common_render_content ( $text , $notice ) {
2008-09-17 20:27:30 +09:00
$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 );
2008-11-24 12:58:14 +09:00
$r = preg_replace ( '/(^|\s+)@#([A-Za-z0-9]{1,64})/e' , " ' \\ 1@#'.common_at_hash_link( $id , ' \\ 2') " , $r );
2008-09-17 20:27:30 +09:00
return $r ;
}
function common_render_text ( $text ) {
2008-11-04 17:40:27 +09:00
$r = htmlspecialchars ( $text );
2008-07-20 21:28:32 +09:00
$r = preg_replace ( '/[\x{0}-\x{8}\x{b}-\x{c}\x{e}-\x{19}]/' , '' , $r );
2008-11-02 18:02:41 +09:00
$r = preg_replace_callback ( '@https?://[^\]>\s]+@' , 'common_render_uri_thingy' , $r );
2008-09-01 11:59:32 +09:00
$r = preg_replace ( '/(^|\s+)#([A-Za-z0-9_\-\.]{1,64})/e' , " ' \\ 1#'.common_tag_link(' \\ 2') " , $r );
2008-05-20 22:05:35 +09:00
# XXX: machine tags
2008-05-30 02:08:01 +09:00
return $r ;
}
2008-11-02 18:02:41 +09:00
function common_render_uri_thingy ( $matches ) {
$uri = $matches [ 0 ];
$trailer = '' ;
# Some heuristics for extracting URIs from surrounding punctuation
# Strip from trailing text...
if ( preg_match ( '/^(.*)([,.:"\']+)$/' , $uri , $matches )) {
$uri = $matches [ 1 ];
$trailer = $matches [ 2 ];
}
$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 ;
}
}
2008-11-14 03:28:34 +09:00
if ( $longurl = common_longurl ( $uri )) {
$longurl = htmlentities ( $longurl , ENT_QUOTES , 'UTF-8' );
2008-11-14 23:22:28 +09:00
$title = " title=' $longurl ' " ;
2008-11-14 03:28:34 +09:00
}
else $title = '' ;
2008-12-03 12:27:43 +09:00
2008-11-14 03:28:34 +09:00
return '<a href="' . $uri . '"' . $title . ' class="extlink">' . $uri . '</a>' . $trailer ;
}
2008-11-29 05:00:04 +09:00
function common_longurl ( $short_url ) {
$long_url = common_shorten_link ( $short_url , true );
if ( $long_url === $short_url ) return false ;
return $long_url ;
}
function common_longurl2 ( $uri ) {
2008-11-14 03:28:34 +09:00
$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 ;
2008-11-15 04:26:49 +09:00
return stripslashes ( $longurl [ 'long_url' ]);
2008-11-02 18:02:41 +09:00
}
2008-11-07 05:59:26 +09:00
function common_shorten_links ( $text ) {
2008-11-29 05:00:04 +09:00
if ( mb_strlen ( $text ) <= 140 ) return $text ;
2008-11-29 06:01:14 +09:00
static $cache = array ();
if ( isset ( $cache [ $text ])) return $cache [ $text ];
2008-11-08 05:30:39 +09:00
// \s = not a horizontal whitespace character (since PHP 5.2.4)
2008-11-29 06:01:14 +09:00
return $cache [ $text ] = preg_replace ( '@https?://[^)\]>\s]+@e' , " common_shorten_link(' \\ 0') " , $text );
2008-11-07 05:59:26 +09:00
}
2008-12-03 13:17:30 +09:00
function common_shorten_link ( $url , $reverse = false ) {
static $url_cache = array ();
if ( $reverse ) return isset ( $url_cache [ $url ]) ? $url_cache [ $url ] : $url ;
2008-11-07 05:59:26 +09:00
$user = common_current_user ();
2008-12-03 12:27:43 +09:00
2008-11-07 05:59:26 +09:00
$curlh = curl_init ();
curl_setopt ( $curlh , CURLOPT_CONNECTTIMEOUT , 20 ); // # seconds to wait
curl_setopt ( $curlh , CURLOPT_USERAGENT , 'Laconica' );
curl_setopt ( $curlh , CURLOPT_RETURNTRANSFER , true );
2008-12-03 12:27:43 +09:00
2008-11-07 05:59:26 +09:00
switch ( $user -> urlshorteningservice ) {
2008-11-08 04:47:35 +09:00
case 'ur1.ca' :
$short_url_service = new LilUrl ;
2008-11-29 05:00:04 +09:00
$short_url = $short_url_service -> shorten ( $url );
2008-11-08 04:47:35 +09:00
break ;
2008-12-03 12:27:43 +09:00
2008-11-14 00:27:18 +09:00
case '2tu.us' :
2008-11-08 04:47:35 +09:00
$short_url_service = new TightUrl ;
2008-11-29 05:00:04 +09:00
$short_url = $short_url_service -> shorten ( $url );
2008-11-08 04:47:35 +09:00
break ;
2008-12-03 12:27:43 +09:00
2008-11-08 04:47:35 +09:00
case 'ptiturl.com' :
$short_url_service = new PtitUrl ;
2008-11-29 05:00:04 +09:00
$short_url = $short_url_service -> shorten ( $url );
2008-11-08 04:47:35 +09:00
break ;
2008-11-08 05:19:26 +09:00
case 'bit.ly' :
2008-11-29 05:00:04 +09:00
curl_setopt ( $curlh , CURLOPT_URL , 'http://bit.ly/api?method=shorten&long_url=' . urlencode ( $url ));
2008-11-08 05:19:26 +09:00
$short_url = current ( json_decode ( curl_exec ( $curlh )) -> results ) -> hashUrl ;
break ;
2008-11-07 05:59:26 +09:00
case 'is.gd' :
2008-11-29 05:00:04 +09:00
curl_setopt ( $curlh , CURLOPT_URL , 'http://is.gd/api.php?longurl=' . urlencode ( $url ));
2008-11-07 05:59:26 +09:00
$short_url = curl_exec ( $curlh );
break ;
case 'snipr.com' :
2008-11-29 05:00:04 +09:00
curl_setopt ( $curlh , CURLOPT_URL , 'http://snipr.com/site/snip?r=simple&link=' . urlencode ( $url ));
2008-11-07 05:59:26 +09:00
$short_url = curl_exec ( $curlh );
break ;
case 'metamark.net' :
2008-11-29 05:00:04 +09:00
curl_setopt ( $curlh , CURLOPT_URL , 'http://metamark.net/api/rest/simple?long_url=' . urlencode ( $url ));
2008-11-07 05:59:26 +09:00
$short_url = curl_exec ( $curlh );
break ;
case 'tinyurl.com' :
2008-11-29 05:00:04 +09:00
curl_setopt ( $curlh , CURLOPT_URL , 'http://tinyurl.com/api-create.php?url=' . urlencode ( $url ));
2008-11-07 05:59:26 +09:00
$short_url = curl_exec ( $curlh );
break ;
default :
$short_url = false ;
}
2008-12-03 12:27:43 +09:00
2008-11-07 05:59:26 +09:00
curl_close ( $curlh );
2008-12-03 12:27:43 +09:00
2008-11-07 05:59:26 +09:00
if ( $short_url ) {
2008-11-29 05:00:04 +09:00
$url_cache [( string ) $short_url ] = $url ;
return ( string ) $short_url ;
2008-11-07 05:59:26 +09:00
}
2008-11-29 05:00:04 +09:00
return $url ;
2008-11-07 05:59:26 +09:00
}
2008-11-04 17:40:27 +09:00
function common_xml_safe_str ( $str ) {
$xmlStr = htmlentities ( iconv ( 'UTF-8' , 'UTF-8//IGNORE' , $str ), ENT_NOQUOTES , 'UTF-8' );
2008-12-03 12:27:43 +09:00
2008-11-04 17:40:27 +09:00
// Replace control, formatting, and surrogate characters with '*', ala Twitter
return preg_replace ( '/[\p{Cc}\p{Cf}\p{Cs}]/u' , '*' , $str );
}
2008-07-20 14:57:02 +09:00
function common_tag_link ( $tag ) {
2008-09-17 20:22:34 +09:00
$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>' ;
}
2008-12-03 12:27:43 +09:00
function common_canonical_tag ( $tag ) {
2008-09-17 20:22:34 +09:00
return strtolower ( str_replace ( array ( '-' , '_' , '.' ), '' , $tag ));
2008-07-20 14:57:02 +09:00
}
2008-11-21 06:48:21 +09:00
function common_valid_profile_tag ( $str ) {
return preg_match ( '/^[A-Za-z0-9_\-\.]{1,64}$/' , $str );
}
2008-05-30 02:18:53 +09:00
function common_at_link ( $sender_id , $nickname ) {
2008-07-07 14:43:58 +09:00
$sender = Profile :: staticGet ( $sender_id );
2008-09-05 07:41:29 +09:00
$recipient = common_relative_profile ( $sender , common_canonical_nickname ( $nickname ));
2008-07-07 14:43:58 +09:00
if ( $recipient ) {
2008-12-03 12:59:47 +09:00
return '<span class="vcard"><a class="fn nickname url" rel="reply" href="' . htmlspecialchars ( $recipient -> profileurl ) . '" class="atlink">' . $nickname . '</a></span>' ;
2008-07-07 14:43:58 +09:00
} else {
2008-12-03 12:59:47 +09:00
return '<span class="vcard"> <span class="fn nickname">' . $nickname . '</span> </span>' ;
2008-07-07 14:43:58 +09:00
}
}
2008-11-24 12:49:52 +09:00
function common_at_hash_link ( $sender_id , $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 ;
}
}
2008-07-07 15:07:33 +09:00
function common_relative_profile ( $sender , $nickname , $dt = NULL ) {
2008-05-30 02:08:01 +09:00
# Try to find profiles this profile is subscribed to that have this nickname
2008-05-30 02:18:53 +09:00
$recipient = new Profile ();
2008-07-07 14:43:58 +09:00
# XXX: use a join instead of a subquery
2008-07-20 14:55:58 +09:00
$recipient -> whereAdd ( 'EXISTS (SELECT subscribed from subscription where subscriber = ' . $sender -> id . ' and subscribed = id)' , 'AND' );
2008-05-30 02:18:53 +09:00
$recipient -> whereAdd ( 'nickname = "' . trim ( $nickname ) . '"' , 'AND' );
if ( $recipient -> find ( TRUE )) {
2008-07-07 14:43:58 +09:00
# XXX: should probably differentiate between profiles with
# the same name by date of most recent update
return $recipient ;
2008-05-30 02:08:01 +09:00
}
# Try to find profiles that listen to this profile and that have this nickname
2008-05-30 02:18:53 +09:00
$recipient = new Profile ();
2008-07-07 14:43:58 +09:00
# XXX: use a join instead of a subquery
2008-07-20 14:55:58 +09:00
$recipient -> whereAdd ( 'EXISTS (SELECT subscriber from subscription where subscribed = ' . $sender -> id . ' and subscriber = id)' , 'AND' );
2008-05-30 02:18:53 +09:00
$recipient -> whereAdd ( 'nickname = "' . trim ( $nickname ) . '"' , 'AND' );
if ( $recipient -> find ( TRUE )) {
2008-07-07 14:43:58 +09:00
# XXX: should probably differentiate between profiles with
# the same name by date of most recent update
return $recipient ;
2008-05-30 02:08:01 +09:00
}
# If this is a local user, try to find a local user with that nickname.
2008-07-07 14:43:58 +09:00
$sender = User :: staticGet ( $sender -> id );
2008-05-30 02:08:01 +09:00
if ( $sender ) {
2008-05-30 02:18:53 +09:00
$recipient_user = User :: staticGet ( 'nickname' , $nickname );
if ( $recipient_user ) {
2008-07-07 14:43:58 +09:00
return $recipient_user -> getProfile ();
2008-05-30 02:08:01 +09:00
}
}
# 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
2008-07-07 14:43:58 +09:00
return NULL ;
2008-05-20 22:05:35 +09:00
}
// where should the avatar go for this user?
2008-06-06 04:37:08 +09:00
function common_avatar_filename ( $id , $extension , $size = NULL , $extra = NULL ) {
2008-05-20 22:05:35 +09:00
global $config ;
if ( $size ) {
2008-06-06 04:37:08 +09:00
return $id . '-' . $size . (( $extra ) ? ( '-' . $extra ) : '' ) . $extension ;
2008-05-20 22:05:35 +09:00
} else {
2008-06-06 04:37:08 +09:00
return $id . '-original' . (( $extra ) ? ( '-' . $extra ) : '' ) . $extension ;
2008-05-20 22:05:35 +09:00
}
}
function common_avatar_path ( $filename ) {
global $config ;
2008-05-31 01:24:29 +09:00
return INSTALLDIR . '/avatar/' . $filename ;
2008-05-20 22:05:35 +09:00
}
function common_avatar_url ( $filename ) {
2008-05-31 01:24:29 +09:00
return common_path ( 'avatar/' . $filename );
2008-07-04 02:03:47 +09:00
}
function common_avatar_display_url ( $avatar ) {
$server = common_config ( 'avatar' , 'server' );
if ( $server ) {
return 'http://' . $server . '/' . $avatar -> filename ;
} else {
return $avatar -> url ;
}
2008-05-20 22:05:35 +09:00
}
2008-05-22 00:54:48 +09:00
function common_default_avatar ( $size ) {
static $sizenames = array ( AVATAR_PROFILE_SIZE => 'profile' ,
AVATAR_STREAM_SIZE => 'stream' ,
AVATAR_MINI_SIZE => 'mini' );
2008-06-12 04:02:30 +09:00
return theme_path ( 'default-avatar-' . $sizenames [ $size ] . '.png' );
2008-05-22 00:54:48 +09:00
}
2008-10-25 11:28:49 +09:00
function common_local_url ( $action , $args = NULL , $fragment = NULL ) {
$url = NULL ;
if ( common_config ( 'site' , 'fancy' )) {
$url = common_fancy_url ( $action , $args );
2008-05-31 06:25:55 +09:00
} else {
2008-10-25 11:28:49 +09:00
$url = common_simple_url ( $action , $args );
}
if ( ! is_null ( $fragment )) {
$url .= '#' . $fragment ;
2008-05-31 06:25:55 +09:00
}
2008-10-25 11:28:49 +09:00
return $url ;
2008-05-31 06:25:55 +09:00
}
function common_fancy_url ( $action , $args = NULL ) {
switch ( strtolower ( $action )) {
2008-06-07 05:01:51 +09:00
case 'public' :
2008-07-20 12:32:36 +09:00
if ( $args && isset ( $args [ 'page' ])) {
2008-06-15 12:50:12 +09:00
return common_path ( '?page=' . $args [ 'page' ]);
} else {
return common_path ( '' );
}
2008-11-20 16:19:30 +09:00
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' );
}
2008-06-07 05:01:51 +09:00
case 'publicrss' :
return common_path ( 'rss' );
2008-12-06 07:14:02 +09:00
case 'publicatom' :
return common_path ( " api/statuses/public_timeline.atom " );
2008-06-19 03:26:47 +09:00
case 'publicxrds' :
return common_path ( 'xrds' );
2008-11-20 16:19:30 +09:00
case 'featuredrss' :
return common_path ( 'featuredrss' );
case 'favoritedrss' :
return common_path ( 'favoritedrss' );
2008-07-20 10:58:23 +09:00
case 'opensearch' :
2008-07-21 04:55:05 +09:00
if ( $args && $args [ 'type' ]) {
return common_path ( 'opensearch/' . $args [ 'type' ]);
} else {
return common_path ( 'opensearch/people' );
}
2008-06-07 05:01:51 +09:00
case 'doc' :
return common_path ( 'doc/' . $args [ 'title' ]);
2008-12-08 16:15:21 +09:00
case 'block' :
2008-06-07 05:01:51 +09:00
case 'login' :
case 'logout' :
case 'subscribe' :
case 'unsubscribe' :
2008-08-26 04:34:50 +09:00
case 'invite' :
2008-06-07 05:01:51 +09:00
return common_path ( 'main/' . $action );
2008-11-21 09:52:16 +09:00
case 'tagother' :
return common_path ( 'main/tagother?id=' . $args [ 'id' ]);
2008-08-27 09:19:27 +09:00
case 'register' :
if ( $args && $args [ 'code' ]) {
return common_path ( 'main/register/' . $args [ 'code' ]);
} else {
return common_path ( 'main/register' );
}
2008-07-02 01:40:58 +09:00
case 'remotesubscribe' :
if ( $args && $args [ 'nickname' ]) {
return common_path ( 'main/remote?nickname=' . $args [ 'nickname' ]);
} else {
return common_path ( 'main/remote' );
}
2008-11-16 11:27:35 +09:00
case 'nudge' :
return common_path ( $args [ 'nickname' ] . '/nudge' );
2008-06-19 01:07:33 +09:00
case 'openidlogin' :
return common_path ( 'main/openid' );
2008-06-07 05:01:51 +09:00
case 'profilesettings' :
return common_path ( 'settings/profile' );
2008-07-16 07:18:26 +09:00
case 'emailsettings' :
return common_path ( 'settings/email' );
2008-06-19 01:13:21 +09:00
case 'openidsettings' :
return common_path ( 'settings/openid' );
2008-07-21 17:37:58 +09:00
case 'smssettings' :
return common_path ( 'settings/sms' );
2008-08-22 12:41:57 +09:00
case 'twittersettings' :
return common_path ( 'settings/twitter' );
2008-11-07 07:40:06 +09:00
case 'othersettings' :
return common_path ( 'settings/other' );
2008-12-05 03:02:33 +09:00
case 'deleteprofile' :
return common_path ( 'settings/delete' );
2008-06-07 05:01:51 +09:00
case 'newnotice' :
2008-07-09 16:28:33 +09:00
if ( $args && $args [ 'replyto' ]) {
return common_path ( 'notice/new?replyto=' . $args [ 'replyto' ]);
} else {
return common_path ( 'notice/new' );
}
2008-06-07 05:01:51 +09:00
case 'shownotice' :
return common_path ( 'notice/' . $args [ 'notice' ]);
2008-07-16 12:20:45 +09:00
case 'deletenotice' :
if ( $args && $args [ 'notice' ]) {
2008-07-26 12:42:09 +09:00
return common_path ( 'notice/delete/' . $args [ 'notice' ]);
2008-07-16 12:20:45 +09:00
} else {
2008-07-26 12:42:09 +09:00
return common_path ( 'notice/delete' );
2008-07-16 12:20:45 +09:00
}
2008-11-25 07:35:33 +09:00
case 'microsummary' :
2008-06-20 15:56:19 +09:00
case 'xrds' :
2008-06-10 21:11:32 +09:00
case 'foaf' :
2008-06-07 05:01:51 +09:00
return common_path ( $args [ 'nickname' ] . '/' . $action );
2008-06-15 12:50:12 +09:00
case 'all' :
2008-07-07 12:23:48 +09:00
case 'replies' :
2008-09-17 04:53:46 +09:00
case 'inbox' :
case 'outbox' :
2008-07-20 11:32:59 +09:00
if ( $args && isset ( $args [ 'page' ])) {
2008-06-15 12:50:12 +09:00
return common_path ( $args [ 'nickname' ] . '/' . $action . '?page=' . $args [ 'page' ]);
} else {
return common_path ( $args [ 'nickname' ] . '/' . $action );
2008-11-20 23:43:00 +09:00
}
case 'subscriptions' :
case 'subscribers' :
$nickname = $args [ 'nickname' ];
unset ( $args [ 'nickname' ]);
2008-11-21 11:57:49 +09:00
if ( isset ( $args [ 'tag' ])) {
$tag = $args [ 'tag' ];
unset ( $args [ 'tag' ]);
}
2008-11-20 23:43:00 +09:00
$params = http_build_query ( $args );
if ( $params ) {
2008-11-22 00:42:18 +09:00
return common_path ( $nickname . '/' . $action . (( $tag ) ? '/' . $tag : '' ) . '?' . $params );
2008-11-20 23:43:00 +09:00
} else {
2008-11-22 00:42:18 +09:00
return common_path ( $nickname . '/' . $action . (( $tag ) ? '/' . $tag : '' ));
2008-06-15 12:50:12 +09:00
}
2008-06-07 05:01:51 +09:00
case 'allrss' :
return common_path ( $args [ 'nickname' ] . '/all/rss' );
2008-07-07 16:30:25 +09:00
case 'repliesrss' :
return common_path ( $args [ 'nickname' ] . '/replies/rss' );
2008-06-07 05:01:51 +09:00
case 'userrss' :
2008-11-24 09:50:54 +09:00
if ( isset ( $args [ 'limit' ]))
return common_path ( $args [ 'nickname' ] . '/rss?limit=' . $args [ 'limit' ]);
2008-06-07 05:01:51 +09:00
return common_path ( $args [ 'nickname' ] . '/rss' );
case 'showstream' :
2008-07-20 11:55:46 +09:00
if ( $args && isset ( $args [ 'page' ])) {
2008-06-15 12:50:12 +09:00
return common_path ( $args [ 'nickname' ] . '?page=' . $args [ 'page' ]);
} else {
return common_path ( $args [ 'nickname' ]);
}
2008-11-15 06:05:06 +09:00
case 'usertimeline' :
2008-11-15 06:43:15 +09:00
return common_path ( " api/statuses/user_timeline/ " . $args [ 'nickname' ] . " .atom " );
2008-06-23 00:52:50 +09:00
case 'confirmaddress' :
return common_path ( 'main/confirmaddress/' . $args [ 'code' ]);
2008-06-20 16:17:00 +09:00
case 'userbyid' :
return common_path ( 'user/' . $args [ 'id' ]);
2008-06-25 07:03:35 +09:00
case 'recoverpassword' :
2008-06-25 07:06:26 +09:00
$path = 'main/recoverpassword' ;
if ( $args [ 'code' ]) {
$path .= '/' . $args [ 'code' ];
}
return common_path ( $path );
2008-06-27 03:49:31 +09:00
case 'imsettings' :
return common_path ( 'settings/im' );
2008-07-10 07:31:44 +09:00
case 'peoplesearch' :
2008-07-10 07:38:03 +09:00
return common_path ( 'search/people' . (( $args ) ? ( '?' . http_build_query ( $args )) : '' ));
2008-07-10 07:31:44 +09:00
case 'noticesearch' :
2008-07-10 07:38:03 +09:00
return common_path ( 'search/notice' . (( $args ) ? ( '?' . http_build_query ( $args )) : '' ));
2008-07-10 08:42:28 +09:00
case 'noticesearchrss' :
return common_path ( 'search/notice/rss' . (( $args ) ? ( '?' . http_build_query ( $args )) : '' ));
2008-07-11 15:00:45 +09:00
case 'avatarbynickname' :
return common_path ( $args [ 'nickname' ] . '/avatar/' . $args [ 'size' ]);
2008-07-20 14:57:02 +09:00
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 )) : '' ));
2008-11-21 07:42:07 +09:00
case 'peopletag' :
$path = 'peopletag/' . $args [ 'tag' ];
unset ( $args [ 'tag' ]);
return common_path ( $path . (( $args ) ? ( '?' . http_build_query ( $args )) : '' ));
2008-07-20 14:57:02 +09:00
case 'tags' :
return common_path ( 'tags' . (( $args ) ? ( '?' . http_build_query ( $args )) : '' ));
2008-09-09 03:16:24 +09:00
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' );
}
2008-09-29 02:56:26 +09:00
case 'favoritesrss' :
return common_path ( $args [ 'nickname' ] . '/favorites/rss' );
2008-09-18 03:02:44 +09:00
case 'showmessage' :
2008-09-18 03:59:50 +09:00
return common_path ( 'message/' . $args [ 'message' ]);
2008-09-18 03:02:44 +09:00
case 'newmessage' :
return common_path ( 'message/new' . (( $args ) ? ( '?' . http_build_query ( $args )) : '' ));
2008-10-24 06:26:59 +09:00
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' );
2008-11-20 16:19:30 +09:00
case 'user_timeline.atom' :
2008-11-25 08:41:15 +09:00
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' );
2008-10-24 06:26:59 +09:00
default : return common_simple_url ( $action , $args );
}
default : return common_simple_url ( $action , $args );
}
2008-10-25 11:28:49 +09:00
case 'sup' :
2008-10-27 00:06:23 +09:00
if ( $args && isset ( $args [ 'seconds' ])) {
2008-11-20 16:19:30 +09:00
return common_path ( 'main/sup?seconds=' . $args [ 'seconds' ]);
2008-10-27 00:06:23 +09:00
} else {
return common_path ( 'main/sup' );
}
2008-05-31 06:25:55 +09:00
default :
return common_simple_url ( $action , $args );
}
}
function common_simple_url ( $action , $args = NULL ) {
global $config ;
2008-05-20 22:05:35 +09:00
/* XXX: pretty URLs */
$extra = '' ;
if ( $args ) {
foreach ( $args as $key => $value ) {
$extra .= " & ${ key}=${value } " ;
}
}
2008-05-31 01:24:29 +09:00
return common_path ( " index.php?action= ${ action}${extra } " );
}
function common_path ( $relative ) {
global $config ;
2008-05-20 22:05:35 +09:00
$pathpart = ( $config [ 'site' ][ 'path' ]) ? $config [ 'site' ][ 'path' ] . " / " : '' ;
2008-05-31 01:24:29 +09:00
return " http:// " . $config [ 'site' ][ 'server' ] . '/' . $pathpart . $relative ;
2008-05-20 22:05:35 +09:00
}
function common_date_string ( $dt ) {
// XXX: do some sexy date formatting
// return date(DATE_RFC822, $dt);
2008-06-28 07:25:22 +09:00
$t = strtotime ( $dt );
$now = time ();
$diff = $now - $t ;
if ( $now < $t ) { # that shouldn't happen!
2008-06-28 07:29:30 +09:00
return common_exact_date ( $dt );
2008-06-28 07:25:22 +09:00
} else if ( $diff < 60 ) {
2008-07-08 18:45:31 +09:00
return _ ( 'a few seconds ago' );
2008-06-28 07:25:22 +09:00
} else if ( $diff < 92 ) {
2008-07-08 18:45:31 +09:00
return _ ( 'about a minute ago' );
2008-06-28 07:25:22 +09:00
} else if ( $diff < 3300 ) {
2008-07-08 18:45:31 +09:00
return sprintf ( _ ( 'about %d minutes ago' ), round ( $diff / 60 ));
2008-06-28 07:25:22 +09:00
} else if ( $diff < 5400 ) {
2008-07-08 18:45:31 +09:00
return _ ( 'about an hour ago' );
2008-06-28 07:25:22 +09:00
} else if ( $diff < 22 * 3600 ) {
2008-07-08 18:45:31 +09:00
return sprintf ( _ ( 'about %d hours ago' ), round ( $diff / 3600 ));
2008-06-28 07:25:22 +09:00
} else if ( $diff < 37 * 3600 ) {
2008-07-08 18:45:31 +09:00
return _ ( 'about a day ago' );
2008-06-28 07:25:22 +09:00
} else if ( $diff < 24 * 24 * 3600 ) {
2008-07-08 22:04:08 +09:00
return sprintf ( _ ( 'about %d days ago' ), round ( $diff / ( 24 * 3600 )));
2008-06-28 07:25:22 +09:00
} else if ( $diff < 46 * 24 * 3600 ) {
2008-07-08 18:45:31 +09:00
return _ ( 'about a month ago' );
2008-06-28 07:25:22 +09:00
} else if ( $diff < 330 * 24 * 3600 ) {
2008-07-08 18:45:31 +09:00
return sprintf ( _ ( 'about %d months ago' ), round ( $diff / ( 30 * 24 * 3600 )));
2008-06-28 07:25:22 +09:00
} else if ( $diff < 480 * 24 * 3600 ) {
2008-07-08 18:45:31 +09:00
return _ ( 'about a year ago' );
2008-06-28 07:25:22 +09:00
} else {
2008-06-28 07:29:30 +09:00
return common_exact_date ( $dt );
2008-06-28 07:25:22 +09:00
}
}
2008-06-28 07:29:30 +09:00
function common_exact_date ( $dt ) {
2008-07-25 08:46:19 +09:00
static $_utc ;
static $_siteTz ;
if ( ! $_utc ) {
$_utc = new DateTimeZone ( 'UTC' );
$_siteTz = new DateTimeZone ( common_timezone ());
}
2008-07-20 23:13:25 +09:00
$dateStr = date ( 'd F Y H:i:s' , strtotime ( $dt ));
2008-07-25 08:46:19 +09:00
$d = new DateTime ( $dateStr , $_utc );
$d -> setTimezone ( $_siteTz );
2008-07-20 23:13:25 +09:00
return $d -> format ( DATE_RFC850 );
2008-05-20 22:05:35 +09:00
}
2008-05-21 23:59:16 +09:00
function common_date_w3dtf ( $dt ) {
2008-07-20 23:13:25 +09:00
$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 );
2008-05-21 23:59:16 +09:00
}
2008-07-17 07:02:23 +09:00
function common_date_rfc2822 ( $dt ) {
2008-07-20 23:13:25 +09:00
$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' );
2008-07-17 07:02:23 +09:00
}
function common_date_iso8601 ( $dt ) {
2008-07-20 23:13:25 +09:00
$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' );
2008-07-17 07:02:23 +09:00
}
2008-08-26 03:23:38 +09:00
function common_sql_now () {
return strftime ( '%Y-%m-%d %H:%M:%S' , time ());
}
2008-05-20 22:05:35 +09:00
function common_redirect ( $url , $code = 307 ) {
static $status = array ( 301 => " Moved Permanently " ,
302 => " Found " ,
303 => " See Other " ,
307 => " Temporary Redirect " );
header ( " Status: ${ code } $status[$code] " );
header ( " Location: $url " );
2008-06-20 15:56:19 +09:00
2008-06-19 05:25:00 +09:00
common_start_xml ( 'a' ,
'-//W3C//DTD XHTML 1.0 Strict//EN' ,
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' );
2008-05-20 22:05:35 +09:00
common_element ( 'a' , array ( 'href' => $url ), $url );
2008-06-19 05:25:00 +09:00
common_end_xml ();
2008-07-10 14:57:26 +09:00
exit ;
2008-05-20 22:05:35 +09:00
}
2008-06-23 12:08:37 +09:00
function common_save_replies ( $notice ) {
2008-07-16 11:58:42 +09:00
# Alternative reply format
2008-07-20 12:32:36 +09:00
$tname = false ;
2008-07-16 11:58:42 +09:00
if ( preg_match ( '/^T ([A-Z0-9]{1,64}) /' , $notice -> content , $match )) {
$tname = $match [ 1 ];
}
2008-07-07 14:43:58 +09:00
# extract all @messages
$cnt = preg_match_all ( '/(?:^|\s)@([a-z0-9]{1,64})/' , $notice -> content , $match );
2008-11-24 12:58:14 +09:00
$names = array ();
2008-12-03 12:27:43 +09:00
2008-11-24 12:58:14 +09:00
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 ]);
2008-07-07 14:43:58 +09:00
}
2008-12-03 12:27:43 +09:00
2008-07-07 14:43:58 +09:00
$sender = Profile :: staticGet ( $notice -> profile_id );
2008-12-03 12:27:43 +09:00
2008-11-24 12:58:14 +09:00
$replied = array ();
2008-12-03 12:27:43 +09:00
2008-07-07 14:43:58 +09:00
# store replied only for first @ (what user/notice what the reply directed,
# we assume first @ is it)
2008-12-03 12:27:43 +09:00
2008-07-16 11:58:42 +09:00
for ( $i = 0 ; $i < count ( $names ); $i ++ ) {
$nickname = $names [ $i ];
2008-07-07 14:43:58 +09:00
$recipient = common_relative_profile ( $sender , $nickname , $notice -> created );
if ( ! $recipient ) {
continue ;
}
2008-10-21 02:08:28 +09:00
if ( $i == 0 && ( $recipient -> id != $sender -> id ) && ! $notice -> reply_to ) { # Don't save reply to self
2008-07-07 14:43:58 +09:00
$reply_for = $recipient ;
2008-07-10 05:27:16 +09:00
$recipient_notice = $reply_for -> getCurrentNotice ();
2008-07-22 17:27:24 +09:00
if ( $recipient_notice ) {
$orig = clone ( $notice );
$notice -> reply_to = $recipient_notice -> id ;
$notice -> update ( $orig );
}
2008-07-07 14:43:58 +09:00
}
2008-12-08 12:14:08 +09:00
# Don't save replies from blocked profile to local user
$recipient_user = User :: staticGet ( 'id' , $recipient -> id );
if ( $recipient_user && $recipient_user -> hasBlocked ( $sender )) {
continue ;
}
2008-07-07 14:43:58 +09:00
$reply = new Reply ();
$reply -> notice_id = $notice -> id ;
$reply -> profile_id = $recipient -> id ;
$id = $reply -> insert ();
if ( ! $id ) {
2008-07-07 16:44:34 +09:00
$last_error = & PEAR :: getStaticProperty ( 'DB_DataObject' , 'lastError' );
2008-07-19 04:08:35 +09:00
common_log ( LOG_ERR , 'DB error inserting reply: ' . $last_error -> message );
2008-07-10 14:04:59 +09:00
common_server_error ( sprintf ( _ ( 'DB error inserting reply: %s' ), $last_error -> message ));
2008-07-07 14:43:58 +09:00
return ;
2008-11-24 12:49:52 +09:00
} else {
$replied [ $recipient -> id ] = 1 ;
}
}
2008-12-03 12:27:43 +09:00
2008-11-24 12:49:52 +09:00
# Hash format replies, too
$cnt = preg_match_all ( '/(?:^|\s)@#([a-z0-9]{1,64})/' , $notice -> content , $match );
2008-11-24 13:02:24 +09:00
if ( $cnt ) {
foreach ( $match [ 1 ] as $tag ) {
$tagged = Profile_tag :: getTagged ( $sender -> id , $tag );
foreach ( $tagged as $t ) {
if ( ! $replied [ $t -> id ]) {
2008-12-08 12:14:08 +09:00
# Don't save replies from blocked profile to local user
$t_user = User :: staticGet ( 'id' , $t -> id );
if ( $t_user && $t_user -> hasBlocked ( $sender )) {
continue ;
}
2008-11-24 13:02:24 +09:00
$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 ;
}
2008-11-24 12:49:52 +09:00
}
}
2008-07-07 14:43:58 +09:00
}
}
2008-06-23 12:08:37 +09:00
}
2008-06-07 01:04:37 +09:00
function common_broadcast_notice ( $notice , $remote = false ) {
2008-09-24 11:36:15 +09:00
2008-08-29 04:25:09 +09:00
// Check to see if notice should go to Twitter
2008-11-17 11:46:24 +09:00
$flink = Foreign_link :: getByUserID ( $notice -> profile_id , 1 ); // 1 == Twitter
2008-09-27 04:05:43 +09:00
if (( $flink -> noticesync & FOREIGN_NOTICE_SEND ) == FOREIGN_NOTICE_SEND ) {
2008-09-25 05:07:10 +09:00
// If it's not a Twitter-style reply, or if the user WANTS to send replies...
2008-09-27 04:05:43 +09:00
2008-10-28 04:16:29 +09:00
if ( ! preg_match ( '/^@[a-zA-Z0-9_]{1,15}\b/u' , $notice -> content ) ||
2008-10-07 09:44:32 +09:00
(( $flink -> noticesync & FOREIGN_NOTICE_SEND_REPLY ) == FOREIGN_NOTICE_SEND_REPLY )) {
2008-09-27 04:05:43 +09:00
2008-09-24 11:36:15 +09:00
$result = common_twitter_broadcast ( $notice , $flink );
if ( ! $result ) {
common_debug ( 'Unable to send notice: ' . $notice -> id . ' to Twitter.' , __FILE__ );
}
2008-08-29 04:25:09 +09:00
}
}
2008-09-24 11:36:15 +09:00
2008-07-04 14:04:25 +09:00
if ( common_config ( 'queue' , 'enabled' )) {
# Do it later!
2008-07-04 17:32:16 +09:00
return common_enqueue_notice ( $notice );
2008-07-04 14:04:25 +09:00
} else {
2008-07-05 09:22:07 +09:00
return common_real_broadcast ( $notice , $remote );
2008-07-04 14:04:25 +09:00
}
}
2008-09-24 11:36:15 +09:00
function common_twitter_broadcast ( $notice , $flink ) {
2008-09-07 15:21:18 +09:00
global $config ;
2008-08-29 04:25:09 +09:00
$success = true ;
$fuser = $flink -> getForeignUser ();
$twitter_user = $fuser -> nickname ;
$twitter_password = $flink -> credentials ;
$uri = 'http://www.twitter.com/statuses/update.json' ;
2008-09-24 11:36:15 +09:00
2008-09-23 17:36:32 +09:00
// XXX: Hack to get around PHP cURL's use of @ being a a meta character
$statustxt = preg_replace ( '/^@/' , ' @' , $notice -> content );
2008-09-24 11:36:15 +09:00
2008-08-29 04:25:09 +09:00
$options = array (
CURLOPT_USERPWD => " $twitter_user : $twitter_password " ,
CURLOPT_POST => true ,
CURLOPT_POSTFIELDS => array (
'status' => $statustxt ,
2008-09-07 15:21:18 +09:00
'source' => $config [ 'integration' ][ 'source' ]
2008-08-29 04:25:09 +09:00
),
CURLOPT_RETURNTRANSFER => true ,
CURLOPT_FAILONERROR => true ,
CURLOPT_HEADER => false ,
CURLOPT_FOLLOWLOCATION => true ,
2008-09-07 15:21:18 +09:00
CURLOPT_USERAGENT => " Laconica " ,
2008-08-29 04:25:09 +09:00
CURLOPT_CONNECTTIMEOUT => 120 , // XXX: Scary!!!! How long should this be?
CURLOPT_TIMEOUT => 120
);
2008-09-24 11:36:15 +09:00
2008-08-29 04:25:09 +09:00
$ch = curl_init ( $uri );
curl_setopt_array ( $ch , $options );
$data = curl_exec ( $ch );
$errmsg = curl_error ( $ch );
if ( $errmsg ) {
2008-09-24 11:36:15 +09:00
common_debug ( " cURL error: $errmsg - trying to send notice for $twitter_user . " ,
2008-08-29 04:25:09 +09:00
__FILE__ );
$success = false ;
}
curl_close ( $ch );
2008-09-24 11:36:15 +09:00
2008-08-29 04:25:09 +09:00
if ( ! $data ) {
common_debug ( " No data returned by Twitter's API trying to send update for $twitter_user " ,
__FILE__ );
$success = false ;
}
2008-09-24 11:36:15 +09:00
// Twitter should return a status
2008-08-29 04:25:09 +09:00
$status = json_decode ( $data );
if ( ! $status -> id ) {
common_debug ( " Unexpected data returned by Twitter API trying to send update for $twitter_user " ,
__FILE__ );
$success = false ;
}
2008-09-24 11:36:15 +09:00
return $success ;
2008-08-29 04:25:09 +09:00
}
2008-07-04 14:04:25 +09:00
# Stick the notice on the queue
function common_enqueue_notice ( $notice ) {
2008-08-30 03:17:02 +09:00
foreach ( array ( 'jabber' , 'omb' , 'sms' , 'public' ) as $transport ) {
2008-08-28 05:54:07 +09:00
$qi = new Queue_item ();
$qi -> notice_id = $notice -> id ;
$qi -> transport = $transport ;
$qi -> created = $notice -> created ;
2008-07-08 16:04:57 +09:00
$result = $qi -> insert ();
2008-08-28 06:19:40 +09:00
if ( ! $result ) {
2008-08-28 05:54:07 +09:00
$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 );
2008-07-04 15:20:56 +09:00
}
2008-08-28 09:14:14 +09:00
return $result ;
2008-07-04 14:04:25 +09:00
}
2008-07-08 18:45:31 +09:00
2008-07-16 12:20:45 +09:00
function common_dequeue_notice ( $notice ) {
2008-07-26 12:39:58 +09:00
$qi = Queue_item :: staticGet ( $notice -> id );
2008-07-16 12:20:45 +09:00
if ( $qi ) {
$result = $qi -> delete ();
if ( ! $result ) {
$last_error = & PEAR :: getStaticProperty ( 'DB_DataObject' , 'lastError' );
2008-08-08 08:42:27 +09:00
common_log ( LOG_ERR , 'DB error deleting queue item: ' . $last_error -> message );
2008-07-16 12:20:45 +09:00
return false ;
}
common_log ( LOG_DEBUG , 'complete dequeueing notice ID = ' . $notice -> id );
return $result ;
} else {
return false ;
}
}
2008-07-04 14:04:25 +09:00
function common_real_broadcast ( $notice , $remote = false ) {
2008-07-05 09:22:07 +09:00
$success = true ;
2008-06-07 01:04:37 +09:00
if ( ! $remote ) {
2008-06-07 01:22:26 +09:00
# Make sure we have the OMB stuff
require_once ( INSTALLDIR . '/lib/omb.php' );
2008-07-05 09:22:07 +09:00
$success = omb_broadcast_remote_subscribers ( $notice );
2008-07-05 09:56:02 +09:00
if ( ! $success ) {
2008-07-19 04:08:35 +09:00
common_log ( LOG_ERR , 'Error in OMB broadcast for notice ' . $notice -> id );
2008-07-05 09:56:02 +09:00
}
2008-07-05 09:22:07 +09:00
}
if ( $success ) {
require_once ( INSTALLDIR . '/lib/jabber.php' );
$success = jabber_broadcast_notice ( $notice );
2008-07-05 09:56:02 +09:00
if ( ! $success ) {
2008-07-19 04:08:35 +09:00
common_log ( LOG_ERR , 'Error in jabber broadcast for notice ' . $notice -> id );
2008-07-05 09:56:02 +09:00
}
2008-06-07 01:04:37 +09:00
}
2008-07-21 04:55:49 +09:00
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 );
}
}
2008-08-30 03:17:02 +09:00
if ( $success ) {
$success = jabber_public_notice ( $notice );
if ( ! $success ) {
common_log ( LOG_ERR , 'Error in public broadcast for notice ' . $notice -> id );
}
}
2008-05-20 22:05:35 +09:00
// XXX: broadcast notices to other IM
2008-07-05 09:22:07 +09:00
return $success ;
2008-05-20 22:05:35 +09:00
}
2008-06-13 03:40:28 +09:00
function common_broadcast_profile ( $profile ) {
// 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 ;
}
2008-06-07 01:04:37 +09:00
2008-05-20 22:05:35 +09:00
function common_profile_url ( $nickname ) {
return common_local_url ( 'showstream' , array ( 'nickname' => $nickname ));
}
2008-06-11 03:52:38 +09:00
# Don't call if nobody's logged in
2008-06-27 06:46:54 +09:00
function common_notice_form ( $action = NULL , $content = NULL ) {
2008-06-11 03:52:38 +09:00
$user = common_current_user ();
assert ( ! is_null ( $user ));
common_element_start ( 'form' , array ( 'id' => 'status_form' ,
2008-07-02 22:15:07 +09:00
'method' => 'post' ,
2008-05-21 05:11:20 +09:00
'action' => common_local_url ( 'newnotice' )));
2008-06-11 04:36:49 +09:00
common_element_start ( 'p' );
2008-07-02 22:15:07 +09:00
common_element ( 'label' , array ( 'for' => 'status_textarea' ,
2008-06-11 03:52:38 +09:00
'id' => 'status_label' ),
2008-07-08 18:45:31 +09:00
sprintf ( _ ( 'What\'s up, %s?' ), $user -> nickname ));
2008-11-11 11:23:30 +09:00
common_element ( 'span' , array ( 'id' => 'counter' , 'class' => 'counter' ), '140' );
2008-06-18 12:00:19 +09:00
common_element ( 'textarea' , array ( 'id' => 'status_textarea' ,
2008-07-02 22:15:07 +09:00
'cols' => 60 ,
'rows' => 3 ,
2008-06-18 12:00:19 +09:00
'name' => 'status_textarea' ),
2008-07-02 22:00:29 +09:00
( $content ) ? $content : '' );
2008-11-11 11:23:30 +09:00
common_hidden ( 'token' , common_session_token ());
2008-06-20 01:18:14 +09:00
if ( $action ) {
common_hidden ( 'returnto' , $action );
}
2008-10-21 02:02:45 +09:00
# set by JavaScript
common_hidden ( 'inreplyto' , 'false' );
2008-06-11 03:52:38 +09:00
common_element ( 'input' , array ( 'id' => 'status_submit' ,
2008-06-11 06:16:14 +09:00
'name' => 'status_submit' ,
2008-06-11 03:52:38 +09:00
'type' => 'submit' ,
2008-07-08 18:45:31 +09:00
'value' => _ ( 'Send' )));
2008-06-11 04:36:49 +09:00
common_element_end ( 'p' );
2008-05-21 05:11:20 +09:00
common_element_end ( 'form' );
2008-05-21 05:25:00 +09:00
}
2008-05-21 05:11:20 +09:00
2008-05-27 20:42:19 +09:00
# Should make up a reasonable root URL
function common_root_url () {
2008-05-31 01:24:29 +09:00
return common_path ( '' );
2008-05-27 20:42:19 +09:00
}
2008-05-28 05:07:21 +09:00
# returns $bytes bytes of random data as a hexadecimal string
# "good" here is a goal and not a guarantee
function common_good_rand ( $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 );
}
}
function common_urandom ( $bytes ) {
$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 ;
}
function common_mtrand ( $bytes ) {
$enc = '' ;
for ( $i = 0 ; $i < $bytes ; $i ++ ) {
$enc .= sprintf ( " %02x " , mt_rand ( 0 , 255 ));
}
return $enc ;
}
2008-05-30 23:23:24 +09:00
function common_set_returnto ( $url ) {
common_ensure_session ();
$_SESSION [ 'returnto' ] = $url ;
}
function common_get_returnto () {
common_ensure_session ();
return $_SESSION [ 'returnto' ];
}
2008-05-28 23:03:21 +09:00
function common_timestamp () {
2008-05-28 23:30:30 +09:00
return date ( 'YmdHis' );
2008-05-28 23:03:21 +09:00
}
2008-06-07 01:04:37 +09:00
2008-05-31 03:22:30 +09:00
function common_ensure_syslog () {
static $initialized = false ;
if ( ! $initialized ) {
2008-06-05 11:40:35 +09:00
global $config ;
2008-06-05 11:47:17 +09:00
openlog ( $config [ 'syslog' ][ 'appname' ], 0 , LOG_USER );
2008-05-31 03:22:30 +09:00
$initialized = true ;
}
}
2008-06-05 11:40:35 +09:00
function common_log ( $priority , $msg , $filename = NULL ) {
2008-07-13 00:15:21 +09:00
$logfile = common_config ( 'site' , 'logfile' );
if ( $logfile ) {
$log = fopen ( $logfile , " a " );
if ( $log ) {
2008-07-13 13:46:08 +09:00
static $syslog_priorities = array ( 'LOG_EMERG' , 'LOG_ALERT' , 'LOG_CRIT' , 'LOG_ERR' ,
2008-07-13 00:15:21 +09:00
'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 );
2008-07-11 16:00:21 +09:00
}
2008-05-31 03:22:30 +09:00
}
2008-06-05 11:40:35 +09:00
function common_debug ( $msg , $filename = NULL ) {
2008-06-05 11:47:17 +09:00
if ( $filename ) {
common_log ( LOG_DEBUG , basename ( $filename ) . ' - ' . $msg );
} else {
common_log ( LOG_DEBUG , $msg );
}
2008-06-05 03:51:31 +09:00
}
2008-06-22 23:27:13 +09:00
function common_log_db_error ( & $object , $verb , $filename = NULL ) {
$objstr = common_log_objstring ( $object );
2008-06-22 23:09:41 +09:00
$last_error = & PEAR :: getStaticProperty ( 'DB_DataObject' , 'lastError' );
2008-07-07 15:19:12 +09:00
common_log ( LOG_ERR , $last_error -> message . '(' . $verb . ' on ' . $objstr . ')' , $filename );
2008-06-22 23:09:41 +09:00
}
2008-06-22 23:27:13 +09:00
function common_log_objstring ( & $object ) {
2008-06-22 23:09:41 +09:00
if ( is_null ( $object )) {
return " NULL " ;
}
$arr = $object -> toArray ();
$fields = array ();
foreach ( $arr as $k => $v ) {
$fields [] = " $k =' $v ' " ;
}
2008-06-22 23:29:06 +09:00
$objstring = $object -> tableName () . '[' . implode ( ',' , $fields ) . ']' ;
2008-06-22 23:09:41 +09:00
return $objstring ;
}
2008-06-05 03:51:31 +09:00
function common_valid_http_url ( $url ) {
return Validate :: uri ( $url , array ( 'allowed_schemes' => array ( 'http' , 'https' )));
}
2008-06-05 13:01:53 +09:00
function common_valid_tag ( $tag ) {
if ( preg_match ( '/^tag:(.*?),(\d{4}(-\d{2}(-\d{2})?)?):(.*)$/' , $tag , $matches )) {
2008-06-07 01:04:37 +09:00
return ( Validate :: email ( $matches [ 1 ]) ||
2008-06-05 13:01:53 +09:00
preg_match ( '/^([\w-\.]+)$/' , $matches [ 1 ]));
}
return false ;
}
2008-06-11 04:21:01 +09:00
# Does a little before-after block for next/prev page
2008-06-20 15:56:19 +09:00
function common_pagination ( $have_before , $have_after , $page , $action , $args = NULL ) {
2008-06-11 04:21:01 +09:00
if ( $have_before || $have_after ) {
common_element_start ( 'div' , array ( 'id' => 'pagination' ));
common_element_start ( 'ul' , array ( 'id' => 'nav_pagination' ));
}
2008-06-20 15:56:19 +09:00
2008-06-11 04:21:01 +09:00
if ( $have_before ) {
$pargs = array ( 'page' => $page - 1 );
$newargs = ( $args ) ? array_merge ( $args , $pargs ) : $pargs ;
2008-06-20 15:56:19 +09:00
2008-06-11 04:21:01 +09:00
common_element_start ( 'li' , 'before' );
2008-12-03 12:59:47 +09:00
common_element ( 'a' , array ( 'href' => common_local_url ( $action , $newargs ), 'rel' => 'prev' ),
2008-07-08 18:45:31 +09:00
_ ( '« After' ));
2008-06-11 04:21:01 +09:00
common_element_end ( 'li' );
}
if ( $have_after ) {
$pargs = array ( 'page' => $page + 1 );
$newargs = ( $args ) ? array_merge ( $args , $pargs ) : $pargs ;
common_element_start ( 'li' , 'after' );
2008-12-03 12:59:47 +09:00
common_element ( 'a' , array ( 'href' => common_local_url ( $action , $newargs ), 'rel' => 'next' ),
2008-07-08 18:45:31 +09:00
_ ( 'Before »' ));
2008-06-11 04:21:01 +09:00
common_element_end ( 'li' );
}
2008-06-20 15:56:19 +09:00
2008-06-11 04:21:01 +09:00
if ( $have_before || $have_after ) {
common_element_end ( 'ul' );
common_element_end ( 'div' );
}
}
2008-06-13 23:49:13 +09:00
/* Following functions are copied from MediaWiki GlobalFunctions . php
* and written by Evan Prodromou . */
function common_accept_to_prefs ( $accept , $def = '*/*' ) {
# No arg means accept anything (per HTTP spec)
if ( ! $accept ) {
return array ( $def => 1 );
}
$prefs = array ();
$parts = explode ( ',' , $accept );
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 ];
}
}
return $prefs ;
}
function common_mime_type_match ( $type , $avail ) {
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 ;
}
}
}
function common_negotiate_type ( $cprefs , $sprefs ) {
$combine = array ();
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 ( $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 ];
}
}
}
$bestq = 0 ;
2008-06-24 02:30:43 +09:00
$besttype = " text/html " ;
2008-06-13 23:49:13 +09:00
foreach ( array_keys ( $combine ) as $type ) {
if ( $combine [ $type ] > $bestq ) {
$besttype = $type ;
$bestq = $combine [ $type ];
}
}
return $besttype ;
}
2008-06-14 02:53:44 +09:00
function common_config ( $main , $sub ) {
global $config ;
2008-07-22 17:28:40 +09:00
return isset ( $config [ $main ][ $sub ]) ? $config [ $main ][ $sub ] : false ;
2008-06-14 02:53:44 +09:00
}
2008-06-19 23:11:07 +09:00
function common_copy_args ( $from ) {
$to = array ();
$strip = get_magic_quotes_gpc ();
foreach ( $from as $k => $v ) {
$to [ $k ] = ( $strip ) ? stripslashes ( $v ) : $v ;
}
return $to ;
2008-06-20 15:54:55 +09:00
}
2008-06-20 16:17:00 +09:00
2008-09-04 15:55:04 +09:00
// Neutralise the evil effects of magic_quotes_gpc in the current request.
// This is used before handing a request off to OAuthRequest::from_request.
function common_remove_magic_from_request () {
if ( get_magic_quotes_gpc ()) {
$_POST = array_map ( 'stripslashes' , $_POST );
$_GET = array_map ( 'stripslashes' , $_GET );
}
}
2008-06-20 16:17:00 +09:00
function common_user_uri ( & $user ) {
return common_local_url ( 'userbyid' , array ( 'id' => $user -> id ));
}
function common_notice_uri ( & $notice ) {
2008-06-24 11:52:34 +09:00
return common_local_url ( 'shownotice' ,
2008-06-20 16:17:00 +09:00
array ( 'notice' => $notice -> id ));
}
2008-06-23 01:32:41 +09:00
# 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
function common_confirmation_code ( $bits ) {
2008-06-23 01:34:58 +09:00
# 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
static $codechars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ' ;
2008-06-23 01:32:41 +09:00
$chars = ceil ( $bits / 5 );
$code = '' ;
for ( $i = 0 ; $i < $chars ; $i ++ ) {
# XXX: convert to string and back
$num = hexdec ( common_good_rand ( 1 ));
2008-06-28 07:25:22 +09:00
# XXX: randomness is too precious to throw away almost
# 40% of the bits we get!
2008-06-23 01:34:58 +09:00
$code .= $codechars [ $num % 32 ];
2008-06-23 01:32:41 +09:00
}
return $code ;
}
2008-07-01 02:03:42 +09:00
# convert markup to HTML
function common_markup_to_html ( $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 );
}
2008-07-14 12:44:43 +09:00
function common_profile_avatar_url ( $profile , $size = AVATAR_PROFILE_SIZE ) {
$avatar = $profile -> getAvatar ( $size );
if ( $avatar ) {
return common_avatar_display_url ( $avatar );
} else {
return common_default_avatar ( $size );
}
}
2008-07-17 00:25:11 +09:00
function common_profile_uri ( $profile ) {
if ( ! $profile ) {
return NULL ;
}
$user = User :: staticGet ( $profile -> id );
if ( $user ) {
return $user -> uri ;
}
2008-07-20 14:57:02 +09:00
2008-07-17 00:25:11 +09:00
$remote = Remote_profile :: staticGet ( $profile -> id );
if ( $remote ) {
return $remote -> uri ;
}
# XXX: this is a very bad profile!
return NULL ;
2008-07-21 04:30:05 +09:00
}
function common_canonical_sms ( $sms ) {
# strip non-digits
preg_replace ( '/\D/' , '' , $sms );
return $sms ;
2008-07-29 17:06:41 +09:00
}
2008-08-30 02:40:12 +09:00
function common_error_handler ( $errno , $errstr , $errfile , $errline , $errcontext ) {
switch ( $errno ) {
case E_USER_ERROR :
2008-08-30 14:30:52 +09:00
common_log ( LOG_ERR , " [ $errno ] $errstr ( $errfile : $errline ) " );
2008-08-30 02:40:12 +09:00
exit ( 1 );
break ;
case E_USER_WARNING :
2008-08-30 14:30:52 +09:00
common_log ( LOG_WARNING , " [ $errno ] $errstr ( $errfile : $errline ) " );
2008-08-30 02:40:12 +09:00
break ;
case E_USER_NOTICE :
2008-08-30 14:30:52 +09:00
common_log ( LOG_NOTICE , " [ $errno ] $errstr ( $errfile : $errline ) " );
2008-08-30 02:40:12 +09:00
break ;
}
2008-08-30 14:30:52 +09:00
# FIXME: show error page if we're on the Web
2008-08-30 02:40:12 +09:00
/* Don't execute PHP internal error handler */
return true ;
}
function common_session_token () {
common_ensure_session ();
if ( ! array_key_exists ( 'token' , $_SESSION )) {
$_SESSION [ 'token' ] = common_good_rand ( 64 );
}
return $_SESSION [ 'token' ];
}
2008-09-15 15:56:16 +09:00
2008-09-09 03:16:24 +09:00
function common_disfavor_form ( $notice ) {
common_element_start ( 'form' , array ( 'id' => 'disfavor-' . $notice -> id ,
'method' => 'post' ,
2008-09-09 05:17:51 +09:00
'class' => 'disfavor' ,
2008-09-09 03:16:24 +09:00
'action' => common_local_url ( 'disfavor' )));
2008-11-15 12:35:49 +09:00
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' => 'notice' ,
'id' => 'notice-n' . $notice -> id ,
'class' => 'notice' ,
'value' => $notice -> id ));
2008-09-09 05:22:26 +09:00
common_element ( 'input' , array ( 'type' => 'submit' ,
'id' => 'disfavor-submit-' . $notice -> id ,
'name' => 'disfavor-submit-' . $notice -> id ,
'class' => 'disfavor' ,
2008-11-15 12:35:49 +09:00
'value' => 'Disfavor favorite' ,
'title' => 'Remove this message from favorites' ));
2008-09-09 03:16:24 +09:00
common_element_end ( 'form' );
}
function common_favor_form ( $notice ) {
common_element_start ( 'form' , array ( 'id' => 'favor-' . $notice -> id ,
'method' => 'post' ,
2008-09-09 05:17:51 +09:00
'class' => 'favor' ,
2008-09-09 03:25:59 +09:00
'action' => common_local_url ( 'favor' )));
2008-11-15 12:35:49 +09:00
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' => 'notice' ,
'id' => 'notice-n' . $notice -> id ,
'class' => 'notice' ,
'value' => $notice -> id ));
2008-12-03 12:27:43 +09:00
2008-09-09 05:22:26 +09:00
common_element ( 'input' , array ( 'type' => 'submit' ,
'id' => 'favor-submit-' . $notice -> id ,
'name' => 'favor-submit-' . $notice -> id ,
'class' => 'favor' ,
2008-11-15 12:35:49 +09:00
'value' => 'Add to favorites' ,
'title' => 'Add this message to favorites' ));
2008-09-09 03:16:24 +09:00
common_element_end ( 'form' );
}
2008-11-16 11:27:35 +09:00
function common_nudge_form ( $profile ) {
common_element_start ( 'form' , array ( 'id' => 'nudge' , 'method' => 'post' ,
'action' => common_local_url ( 'nudge' , array ( 'nickname' => $profile -> nickname ))));
2008-11-19 00:56:43 +09:00
common_hidden ( 'token' , common_session_token ());
2008-11-16 11:27:35 +09:00
common_element ( 'input' , array ( 'type' => 'submit' ,
'class' => 'submit' ,
'value' => _ ( 'Send a nudge' )));
common_element_end ( 'form' );
}
2008-11-21 08:26:55 +09:00
function common_nudge_response () {
common_element ( 'p' , array ( 'id' => 'nudge_response' ), _ ( 'Nudge sent!' ));
}
2008-11-16 11:27:35 +09:00
2008-11-21 05:35:28 +09:00
function common_subscribe_form ( $profile ) {
2008-12-08 12:13:12 +09:00
common_element_start ( 'form' , array ( 'id' => 'subscribe-' . $profile -> id ,
2008-11-21 05:35:28 +09:00
'method' => 'post' ,
'class' => 'subscribe' ,
2008-11-21 05:24:48 +09:00
'action' => common_local_url ( 'subscribe' )));
common_hidden ( 'token' , common_session_token ());
2008-12-08 12:13:12 +09:00
common_element ( 'input' , array ( 'id' => 'subscribeto-' . $profile -> id ,
2008-11-21 05:24:48 +09:00
'name' => 'subscribeto' ,
'type' => 'hidden' ,
2008-12-08 12:13:12 +09:00
'value' => $profile -> id ));
2008-11-21 05:24:48 +09:00
common_element ( 'input' , array ( 'type' => 'submit' ,
'class' => 'submit' ,
'value' => _ ( 'Subscribe' )));
common_element_end ( 'form' );
2008-11-19 02:48:57 +09:00
}
2008-11-21 05:35:28 +09:00
function common_unsubscribe_form ( $profile ) {
common_element_start ( 'form' , array ( 'id' => 'unsubscribe-' . $profile -> nickname ,
'method' => 'post' ,
'class' => 'unsubscribe' ,
2008-11-21 05:24:48 +09:00
'action' => common_local_url ( 'unsubscribe' )));
common_hidden ( 'token' , common_session_token ());
2008-12-04 03:09:45 +09:00
common_element ( 'input' , array ( 'id' => 'unsubscribeto-' . $profile -> id ,
2008-11-21 05:24:48 +09:00
'name' => 'unsubscribeto' ,
'type' => 'hidden' ,
2008-12-04 03:09:45 +09:00
'value' => $profile -> id ));
2008-11-21 05:24:48 +09:00
common_element ( 'input' , array ( 'type' => 'submit' ,
'class' => 'submit' ,
'value' => _ ( 'Unsubscribe' )));
common_element_end ( 'form' );
2008-11-19 02:48:57 +09:00
}
2008-11-21 08:26:55 +09:00
// XXX: Refactor this code
function common_profile_new_message_nudge ( $cur , $profile ) {
$user = User :: staticGet ( 'id' , $profile -> id );
if ( $cur && $cur -> id != $user -> id && $cur -> mutuallySubscribed ( $user )) {
common_element_start ( 'li' , array ( 'id' => 'profile_send_a_new_message' ));
common_element ( 'a' , array ( 'href' => common_local_url ( 'newmessage' , array ( 'to' => $user -> id ))),
_ ( 'Send a message' ));
common_element_end ( 'li' );
2008-12-03 12:27:43 +09:00
2008-11-21 08:26:55 +09:00
if ( $user -> email && $user -> emailnotifynudge ) {
common_element_start ( 'li' , array ( 'id' => 'profile_nudge' ));
common_nudge_form ( $user );
common_element_end ( 'li' );
}
}
2008-11-16 11:27:35 +09:00
}
2008-09-15 15:56:16 +09:00
function common_cache_key ( $extra ) {
return 'laconica:' . common_keyize ( common_config ( 'site' , 'name' )) . ':' . $extra ;
}
function common_keyize ( $str ) {
$str = strtolower ( $str );
$str = preg_replace ( '/\s/' , '_' , $str );
return $str ;
}
2008-09-25 05:41:31 +09:00
function common_message_form ( $content , $user , $to ) {
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_element_start ( 'form' , array ( 'id' => 'message_form' ,
'method' => 'post' ,
2008-09-25 06:02:54 +09:00
'action' => common_local_url ( 'newmessage' )));
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
$mutual_users = $user -> mutuallySubscribedUsers ();
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
$mutual = array ();
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
while ( $mutual_users -> fetch ()) {
if ( $mutual_users -> id != $user -> id ) {
$mutual [ $mutual_users -> id ] = $mutual_users -> nickname ;
}
}
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
$mutual_users -> free ();
unset ( $mutual_users );
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_dropdown ( 'to' , _ ( 'To' ), $mutual , NULL , FALSE , $to -> id );
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_element_start ( 'p' );
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_element ( 'textarea' , array ( 'id' => 'message_content' ,
'cols' => 60 ,
'rows' => 3 ,
'name' => 'content' ),
( $content ) ? $content : '' );
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_element ( 'input' , array ( 'id' => 'message_send' ,
'name' => 'message_send' ,
'type' => 'submit' ,
'value' => _ ( 'Send' )));
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_hidden ( 'token' , common_session_token ());
2008-12-03 12:27:43 +09:00
2008-09-25 05:41:31 +09:00
common_element_end ( 'p' );
common_element_end ( 'form' );
2008-09-27 05:01:02 +09:00
}
function common_memcache () {
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 ;
}
}
2008-12-03 12:27:05 +09:00
function common_compatible_license ( $from , $to ) {
# XXX: better compatibility check needed here!
return ( $from == $to );
2008-12-05 03:02:33 +09:00
}
2008-12-08 14:55:11 +09:00
2008-12-09 02:37:22 +09:00
/* These are almost identical, so we use a helper function */
2008-12-09 02:09:31 +09:00
function common_block_form ( $profile , $args = NULL ) {
2008-12-09 02:37:22 +09:00
common_blocking_form ( 'block' , _ ( 'Block' ), $profile , $args );
}
function common_unblock_form ( $profile , $args = NULL ) {
common_blocking_form ( 'unblock' , _ ( 'Unblock' ), $profile , $args );
}
function common_blocking_form ( $type , $label , $profile , $args = NULL ) {
common_element_start ( 'form' , array ( 'id' => $type . '-' . $profile -> id ,
2008-12-08 14:55:11 +09:00
'method' => 'post' ,
2008-12-09 02:37:22 +09:00
'class' => $type ,
'action' => common_local_url ( $type )));
2008-12-08 14:55:11 +09:00
common_hidden ( 'token' , common_session_token ());
2008-12-09 02:37:22 +09:00
common_element ( 'input' , array ( 'id' => $type . 'to-' . $profile -> id ,
'name' => $type . 'to' ,
2008-12-08 14:55:11 +09:00
'type' => 'hidden' ,
'value' => $profile -> id ));
common_element ( 'input' , array ( 'type' => 'submit' ,
'class' => 'submit' ,
2008-12-09 02:37:22 +09:00
'name' => $type ,
'value' => $label ));
2008-12-09 02:09:31 +09:00
if ( $args ) {
foreach ( $args as $k => $v ) {
common_hidden ( 'returnto-' . $k , $v );
}
}
2008-12-08 14:55:11 +09:00
common_element_end ( 'form' );
return ;
}
2008-12-09 02:37:22 +09:00