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 ;
if ( $content ) {
$xw -> text ( $content );
}
common_element_end ( $tag );
2008-05-20 22:05:35 +09:00
}
2008-05-21 23:33:51 +09:00
function common_start_xml ( $doc = NULL , $public = NULL , $system = NULL ) {
global $xw ;
$xw = new XMLWriter ();
$xw -> openURI ( 'php://output' );
$xw -> setIndent ( true );
$xw -> startDocument ( '1.0' , 'UTF-8' );
if ( $doc ) {
$xw -> writeDTD ( $doc , $public , $system );
}
}
function common_end_xml () {
global $xw ;
$xw -> endDocument ();
$xw -> flush ();
}
2008-07-07 07:00:20 +09:00
define ( 'PAGE_TYPE_PREFS' , 'text/html,application/xhtml+xml,application/xml;q=0.3,text/xml;q=0.2' );
2008-06-20 15:56:19 +09:00
2008-06-12 03:36:34 +09:00
function common_show_header ( $pagetitle , $callable = NULL , $data = NULL , $headercall = NULL ) {
2008-05-20 22:27:22 +09:00
global $config , $xw ;
2008-05-20 22:36:40 +09:00
2008-06-13 23:49:13 +09:00
$httpaccept = isset ( $_SERVER [ 'HTTP_ACCEPT' ]) ? $_SERVER [ 'HTTP_ACCEPT' ] : NULL ;
# XXX: allow content negotiation for RDF, RSS, or XRDS
2008-06-20 15:56:19 +09:00
2008-06-13 23:49:13 +09:00
$type = common_negotiate_type ( common_accept_to_prefs ( $httpaccept ),
common_accept_to_prefs ( PAGE_TYPE_PREFS ));
if ( ! $type ) {
2008-07-08 18:45:31 +09:00
common_user_error ( _ ( 'This page is not available in a media type you accept' ), 406 );
2008-06-13 23:49:13 +09:00
exit ( 0 );
}
2008-06-20 15:56:19 +09:00
2008-06-13 23:49:13 +09:00
header ( 'Content-Type: ' . $type );
2008-05-21 04:14:12 +09:00
2008-05-21 23:33:51 +09:00
common_start_xml ( 'html' ,
'-//W3C//DTD XHTML 1.0 Strict//EN' ,
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' );
2008-05-20 22:27:22 +09:00
# FIXME: correct language for interface
2008-05-21 04:14:12 +09:00
2008-05-20 22:27:22 +09:00
common_element_start ( 'html' , array ( 'xmlns' => 'http://www.w3.org/1999/xhtml' ,
'xml:lang' => 'en' ,
'lang' => 'en' ));
2008-05-21 04:14:12 +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-06-11 03:52:38 +09:00
'href' => theme_path ( 'display.css' ),
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-06-25 02:13:05 +09:00
'href="' . theme_path ( 'ie' . $ver . '.css' ) . '" /><![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-06-25 02:46:13 +09:00
common_element ( 'script' , array ( 'type' => 'text/javascript' ,
'src' => common_path ( 'js/util.js' )),
' ' );
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' );
common_element_start ( 'body' );
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-06-19 00:30:36 +09:00
if (( is_string ( $config [ 'site' ][ 'logo' ]) && ( strlen ( $config [ 'site' ][ 'logo' ]) > 0 ))
|| file_exists ( theme_file ( 'logo.png' )))
{
2008-06-14 00:46:32 +09:00
common_element_start ( 'a' , array ( 'href' => common_local_url ( 'public' )));
common_element ( 'img' , array ( 'src' => ( $config [ 'site' ][ 'logo' ]) ?
( $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
}
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' ,
href => $config [ 'license' ][ 'url' ]),
$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 ( 'public' ), _ ( 'Public' ));
common_menu_item ( common_local_url ( 'peoplesearch' ), _ ( 'Search' ));
2008-06-11 04:45:53 +09:00
common_menu_item ( common_local_url ( 'doc' , array ( 'title' => 'help' )),
2008-07-08 18:45:31 +09:00
_ ( 'Help' ));
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-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' ));
common_menu_item ( common_local_url ( 'register' ), _ ( 'Register' ));
common_menu_item ( common_local_url ( 'openidlogin' ), _ ( 'OpenID' ));
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-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-06-27 03:27:05 +09:00
function common_checkbox ( $id , $label , $checked = false , $instructions = NULL , $value = 'true' )
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-06-27 03:22:31 +09:00
common_element ( 'input' , $attrs );
# XXX: use a <label>
common_text ( ' ' );
common_element ( 'span' , 'checkbox_label' , $label );
common_text ( ' ' );
2008-06-24 09:15:23 +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
}
function common_submit ( $id , $label ) {
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-06-19 01:35:16 +09:00
'class' => 'submit' ,
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-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 ) {
$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
function common_set_user ( $user ) {
2008-07-09 15:25:02 +09:00
if ( is_null ( $user ) && common_have_session ()) {
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 ;
return $user ;
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-06-24 12:24:08 +09:00
define ( 'REMEMBERME_EXPIRY' , 30 * 24 * 60 * 60 );
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
}
$rm = new Remember_me ();
$rm -> code = common_good_rand ( 16 );
2008-06-24 12:17:46 +09:00
$rm -> user_id = $user -> id ;
2008-06-24 12:24:08 +09:00
$result = $rm -> insert ();
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-07-08 15:42:41 +09:00
common_log ( LOG_INFO , 'adding rememberme cookie for ' . $user -> nickname );
2008-06-24 11:52:34 +09:00
common_set_cookie ( REMEMBERME ,
2008-06-24 12:32:23 +09:00
implode ( ':' , array ( $rm -> user_id , $rm -> code )),
2008-06-24 11:52:34 +09:00
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 () {
$user = NULL ;
# Try to remember
$packed = $_COOKIE [ REMEMBERME ];
if ( $packed ) {
list ( $id , $code ) = explode ( ':' , $packed );
if ( $id && $code ) {
$rm = Remember_me :: staticGet ( $code );
2008-06-24 13:00:58 +09:00
if ( $rm && ( $rm -> user_id == $id )) {
2008-06-24 13:02:34 +09:00
$user = User :: staticGet ( $rm -> user_id );
2008-06-24 11:52:34 +09:00
if ( $user ) {
# successful!
$result = $rm -> delete ();
if ( ! $result ) {
common_log_db_error ( $rm , 'DELETE' , __FILE__ );
$user = NULL ;
} else {
2008-07-08 15:42:41 +09:00
common_log ( LOG_INFO , 'logging in ' . $user -> nickname . ' using rememberme code ' . $rm -> code );
2008-06-24 12:28:18 +09:00
common_set_user ( $user -> nickname );
2008-06-24 11:52:34 +09:00
common_real_login ( false );
2008-06-24 12:10:57 +09:00
# We issue a new cookie, so they can log in
# automatically again after this session
2008-07-09 14:53:43 +09:00
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-07-14 14:00:37 +09:00
if ( $_REQUEST [ session_name ()] || $_SESSION && $_SESSION [ 'userid' ]) {
2008-06-24 12:49:06 +09:00
common_ensure_session ();
$id = $_SESSION [ 'userid' ];
if ( $id ) {
# note: this should cache
$user = User :: staticGet ( $id );
return $user ;
}
2008-05-20 22:05:35 +09:00
}
2008-06-24 11:52:34 +09:00
# that didn't work; try to remember
$user = common_remembered_user ();
2008-07-14 14:00:37 +09:00
common_debug ( " Got User " . $user -> nickname );
if ( $user ) {
common_debug ( " Faking session on remembered user " );
$_SESSION [ 'userid' ] = $user -> id ;
}
2008-05-20 22:05:35 +09:00
return $user ;
}
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-05-30 02:08:01 +09:00
$r = htmlspecialchars ( $text );
2008-05-30 02:25:49 +09:00
$id = $notice -> profile_id ;
2008-07-15 11:20:45 +09:00
$r = preg_replace ( '@https?://[^)\]>\s]+@' , '<a href="\0" class="extlink">\0</a>' , $r );
2008-06-21 05:34:49 +09:00
$r = preg_replace ( '/(^|\s+)@([a-z0-9]{1,64})/e' , " ' \\ 1@'.common_at_link( $id , ' \\ 2') " , $r );
2008-07-16 12:02:00 +09:00
$r = preg_replace ( '/^T ([A-Z0-9]{1,64}) /e' , " 'T '.common_at_link( $id , ' \\ 1').' ' " , $r );
2008-05-20 22:05:35 +09:00
# XXX: # tags
# XXX: machine tags
2008-05-30 02:08:01 +09:00
return $r ;
}
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 );
$recipient = common_relative_profile ( $sender , $nickname );
if ( $recipient ) {
return '<a href="' . htmlspecialchars ( $recipient -> profileurl ) . '" class="atlink">' . $nickname . '</a>' ;
} else {
return $nickname ;
}
}
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-05-30 02:18:53 +09:00
$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 )) {
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-05-30 02:18:53 +09:00
$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 )) {
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-05-20 22:05:35 +09:00
function common_local_url ( $action , $args = NULL ) {
2008-05-31 06:25:55 +09:00
global $config ;
if ( $config [ 'site' ][ 'fancy' ]) {
return common_fancy_url ( $action , $args );
} else {
return common_simple_url ( $action , $args );
}
}
function common_fancy_url ( $action , $args = NULL ) {
switch ( strtolower ( $action )) {
2008-06-07 05:01:51 +09:00
case 'public' :
2008-06-15 12:50:12 +09:00
if ( $args && $args [ 'page' ]) {
return common_path ( '?page=' . $args [ 'page' ]);
} else {
return common_path ( '' );
}
2008-06-07 05:01:51 +09:00
case 'publicrss' :
return common_path ( 'rss' );
2008-06-19 03:26:47 +09:00
case 'publicxrds' :
return common_path ( 'xrds' );
2008-06-07 05:01:51 +09:00
case 'doc' :
return common_path ( 'doc/' . $args [ 'title' ]);
case 'login' :
case 'logout' :
case 'register' :
case 'subscribe' :
case 'unsubscribe' :
return common_path ( 'main/' . $action );
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-06-19 01:07:33 +09:00
case 'openidlogin' :
return common_path ( 'main/openid' );
2008-06-07 05:01:51 +09:00
case 'avatar' :
case 'password' :
return common_path ( 'settings/' . $action );
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-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-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 'subscriptions' :
2008-06-19 02:16:22 +09:00
case 'subscribers' :
2008-06-15 12:50:12 +09:00
case 'all' :
2008-07-07 12:23:48 +09:00
case 'replies' :
2008-06-15 12:50:12 +09:00
if ( $args && $args [ 'page' ]) {
return common_path ( $args [ 'nickname' ] . '/' . $action . '?page=' . $args [ 'page' ]);
} else {
return common_path ( $args [ 'nickname' ] . '/' . $action );
}
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' :
return common_path ( $args [ 'nickname' ] . '/rss' );
case 'showstream' :
2008-06-15 12:50:12 +09:00
if ( $args && $args [ 'page' ]) {
return common_path ( $args [ 'nickname' ] . '?page=' . $args [ 'page' ]);
} else {
return common_path ( $args [ 'nickname' ]);
}
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-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-06-28 07:25:22 +09:00
$t = strtotime ( $dt );
2008-06-28 07:34:39 +09:00
return date ( DATE_RFC850 , $t );
2008-05-20 22:05:35 +09:00
}
2008-05-21 23:59:16 +09:00
function common_date_w3dtf ( $dt ) {
$t = strtotime ( $dt );
return date ( DATE_W3C , $t );
}
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
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-07-16 11:58:42 +09:00
if ( ! $cnt && ! $tname ) {
2008-07-07 14:43:58 +09:00
return true ;
}
2008-07-16 11:58:42 +09:00
# XXX: is there another way to make an array copy?
2008-07-16 12:17:18 +09:00
$names = ( $tname ) ? array_unique ( array_merge ( array ( strtolower ( $tname )), $match [ 1 ])) : $match [ 1 ];
2008-07-07 14:43:58 +09:00
$sender = Profile :: staticGet ( $notice -> profile_id );
# store replied only for first @ (what user/notice what the reply directed,
# we assume first @ is it)
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-07-10 05:40:50 +09:00
if ( $i == 0 && ( $recipient -> id != $sender -> id )) { # 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 ();
$orig = clone ( $notice );
$notice -> reply_to = $recipient_notice -> id ;
$notice -> update ( $orig );
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' );
common_log ( LOG_ERROR , '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-06-23 12:08:37 +09:00
}
2008-06-07 01:04:37 +09:00
function common_broadcast_notice ( $notice , $remote = false ) {
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
}
}
# Stick the notice on the queue
function common_enqueue_notice ( $notice ) {
$qi = new Queue_item ();
$qi -> notice_id = $notice -> id ;
2008-07-08 16:04:57 +09:00
$qi -> created = $notice -> created ;
$result = $qi -> insert ();
if ( ! $result ) {
2008-07-04 16:17:26 +09:00
$last_error = & PEAR :: getStaticProperty ( 'DB_DataObject' , 'lastError' );
common_log ( LOG_ERROR , 'DB error inserting queue item: ' . $last_error -> message );
2008-07-05 09:22:07 +09:00
return false ;
2008-07-04 15:20:56 +09:00
}
2008-07-08 16:04:57 +09:00
common_log ( LOG_DEBUG , 'complete queueing notice ID = ' . $notice -> id );
2008-07-04 14:04:25 +09:00
return $result ;
}
2008-07-08 18:45:31 +09:00
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 ) {
common_log ( LOG_ERROR , 'Error in OMB broadcast for notice ' . $notice -> id );
}
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 ) {
common_log ( LOG_ERROR , 'Error in jabber broadcast for notice ' . $notice -> id );
}
2008-06-07 01:04:37 +09:00
}
// XXX: broadcast notices to SMS
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-06-25 02:46:13 +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-06-20 01:18:14 +09:00
if ( $action ) {
common_hidden ( 'returnto' , $action );
}
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-05-31 03:22:30 +09:00
define_syslog_variables ();
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' );
common_element ( 'a' , array ( 'href' => common_local_url ( $action , $newargs )),
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' );
common_element ( 'a' , array ( 'href' => common_local_url ( $action , $newargs )),
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 ;
return $config [ $main ][ $sub ];
}
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
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 ;
}
$remote = Remote_profile :: staticGet ( $profile -> id );
if ( $remote ) {
return $remote -> uri ;
}
# XXX: this is a very bad profile!
return NULL ;
}