| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  |  * Laconica - a distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2008, Controlez-Vous, Inc. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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-06 12:04:37 -04: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 09:05:35 -04:00
										 |  |  | 	header('Content-type: text/plain'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	print $msg; | 
					
						
							| 
									
										
										
										
											2008-06-02 15:38:51 -04:00
										 |  |  | 	print "\n"; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	exit(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Show a user error
 | 
					
						
							| 
									
										
										
										
											2008-06-26 18:50:02 -04:00
										 |  |  | function common_user_error($msg, $code=400) { | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04: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 09:05:35 -04:00
										 |  |  | 	common_show_header('Error'); | 
					
						
							|  |  |  | 	common_element('div', array('class' => 'error'), $msg); | 
					
						
							|  |  |  | 	common_show_footer(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | $xw = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | # Start an HTML element
 | 
					
						
							|  |  |  | function common_element_start($tag, $attrs=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | 	global $xw; | 
					
						
							|  |  |  | 	$xw->startElement($tag); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	if (is_array($attrs)) { | 
					
						
							|  |  |  | 		foreach ($attrs as $name => $value) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | 			$xw->writeAttribute($name, $value); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} else if (is_string($attrs)) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | 		$xw->writeAttribute('class', $attrs); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_element_end($tag) { | 
					
						
							| 
									
										
										
										
											2008-07-08 19:32:18 -04:00
										 |  |  | 	static $empty_tag = array('base', 'meta', 'link', 'hr', | 
					
						
							|  |  |  | 							  'br', 'param', 'img', 'area', | 
					
						
							|  |  |  | 							  'input', 'col');  | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | 	global $xw; | 
					
						
							| 
									
										
										
										
											2008-07-08 19:50:04 -04:00
										 |  |  | 	# XXX: check namespace
 | 
					
						
							| 
									
										
										
										
											2008-07-08 19:32:18 -04:00
										 |  |  | 	if (in_array($tag, $empty_tag)) { | 
					
						
							|  |  |  | 		$xw->endElement(); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$xw->fullEndElement(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_element($tag, $attrs=NULL, $content=NULL) { | 
					
						
							| 
									
										
										
										
											2008-07-08 19:50:04 -04:00
										 |  |  | 	common_element_start($tag, $attrs); | 
					
						
							|  |  |  | 	global $xw; | 
					
						
							|  |  |  | 	if ($content) { | 
					
						
							|  |  |  | 		$xw->text($content); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	common_element_end($tag); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-21 10:33:51 -04: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-06 18:00:20 -04:00
										 |  |  | define('PAGE_TYPE_PREFS', 'text/html,application/xhtml+xml,application/xml;q=0.3,text/xml;q=0.2'); | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 14:36:34 -04:00
										 |  |  | function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | 	global $config, $xw; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:36:40 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 10:49:13 -04:00
										 |  |  | 	$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# XXX: allow content negotiation for RDF, RSS, or XRDS
 | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 10:49:13 -04:00
										 |  |  | 	$type = common_negotiate_type(common_accept_to_prefs($httpaccept), | 
					
						
							|  |  |  | 								  common_accept_to_prefs(PAGE_TYPE_PREFS)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!$type) { | 
					
						
							| 
									
										
										
										
											2008-06-26 18:50:02 -04:00
										 |  |  | 		common_user_error(_t('This page is not available in a media type you accept'), 406); | 
					
						
							| 
									
										
										
										
											2008-06-13 10:49:13 -04:00
										 |  |  | 		exit(0); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 10:49:13 -04:00
										 |  |  | 	header('Content-Type: '.$type); | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-21 10:33:51 -04: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 09:27:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# FIXME: correct language for interface
 | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:27:22 -04:00
										 |  |  | 	common_element_start('html', array('xmlns' => 'http://www.w3.org/1999/xhtml', | 
					
						
							|  |  |  | 									   'xml:lang' => 'en', | 
					
						
							|  |  |  | 									   'lang' => 'en')); | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_element_start('head'); | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | 	common_element('title', NULL, | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 				   $pagetitle . " - " . $config['site']['name']); | 
					
						
							| 
									
										
										
										
											2008-05-20 13:34:27 -04:00
										 |  |  | 	common_element('link', array('rel' => 'stylesheet', | 
					
						
							|  |  |  | 								 'type' => 'text/css', | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 								 'href' => theme_path('display.css'), | 
					
						
							| 
									
										
										
										
											2008-05-20 13:34:27 -04:00
										 |  |  | 								 'media' => 'screen, projection, tv')); | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04: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-24 13:13:05 -04:00
										 |  |  | 							  'href="'.theme_path('ie'.$ver.'.css').'" /><![endif]'); | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-17 00:36:50 -04:00
										 |  |  | 	common_element('script', array('type' => 'text/javascript', | 
					
						
							| 
									
										
										
										
											2008-06-17 00:40:54 -04:00
										 |  |  | 								   'src' => common_path('js/jquery.min.js')), | 
					
						
							| 
									
										
										
										
											2008-06-17 00:36:50 -04:00
										 |  |  | 				   ' '); | 
					
						
							| 
									
										
										
										
											2008-06-24 13:46:13 -04:00
										 |  |  | 	common_element('script', array('type' => 'text/javascript', | 
					
						
							|  |  |  | 								   'src' => common_path('js/util.js')), | 
					
						
							|  |  |  | 				   ' '); | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-21 11:24:04 -04:00
										 |  |  | 	if ($callable) { | 
					
						
							|  |  |  | 		if ($data) { | 
					
						
							|  |  |  | 			call_user_func($callable, $data); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			call_user_func($callable); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_element_end('head'); | 
					
						
							|  |  |  | 	common_element_start('body'); | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	common_element_start('div', array('id' => 'wrap')); | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | 	common_element_start('div', array('id' => 'header')); | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	common_nav_menu(); | 
					
						
							| 
									
										
										
										
											2008-06-18 11:30:36 -04:00
										 |  |  | 	if ((is_string($config['site']['logo']) && (strlen($config['site']['logo']) > 0)) | 
					
						
							|  |  |  | 		|| file_exists(theme_file('logo.png'))) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2008-06-13 11:46:32 -04: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-18 11:20:04 -04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2008-06-18 11:46:43 -04: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-13 11:46:32 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 11:46:32 -04:00
										 |  |  | 	common_element('h1', 'pagetitle', $pagetitle); | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 14:36:34 -04:00
										 |  |  | 	if ($headercall) { | 
					
						
							|  |  |  | 		if ($data) { | 
					
						
							|  |  |  | 			call_user_func($headercall, $data); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			call_user_func($headercall); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-20 13:34:27 -04:00
										 |  |  | 	common_element_end('div'); | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	common_element_start('div', array('id' => 'content')); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_show_footer() { | 
					
						
							| 
									
										
										
										
											2008-05-20 13:13:53 -04:00
										 |  |  | 	global $xw, $config; | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	common_element_end('div'); # content div
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_foot_menu(); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:55:02 -04:00
										 |  |  | 	common_element_start('div', array('id' => 'footer')); | 
					
						
							| 
									
										
										
										
											2008-07-02 09:15:07 -04:00
										 |  |  | 	common_element_start('div', 'laconica'); | 
					
						
							| 
									
										
										
										
											2008-07-01 13:56:11 -04:00
										 |  |  | 	if (common_config('site', 'broughtby')) { | 
					
						
							|  |  |  | 		$instr = _t('**%%site.name%%** is a microblogging service brought to you by [%%site.broughtby%%](%%site.broughtbyurl%%). '); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		$instr = _t('**%%site.name%%** is a microblogging service. '); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$instr .= _t('It runs the [Laconica](http://laconi.ca/) ' . | 
					
						
							|  |  |  | 		         'microblogging software, version ' . LACONICA_VERSION . ', ' . | 
					
						
							|  |  |  | 		         'available under the ' . | 
					
						
							|  |  |  | 		         '[GNU Affero General Public License]' . | 
					
						
							|  |  |  | 		         '(http://www.fsf.org/licensing/licenses/agpl-3.0.html).'); | 
					
						
							|  |  |  |     $output = common_markup_to_html($instr); | 
					
						
							|  |  |  |     common_raw($output); | 
					
						
							| 
									
										
										
										
											2008-07-02 09:15:07 -04:00
										 |  |  | 	common_element_end('div'); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:55:02 -04:00
										 |  |  | 	common_element('img', array('id' => 'cc', | 
					
						
							| 
									
										
										
										
											2008-06-10 15:51:34 -04:00
										 |  |  | 								'src' => $config['license']['image'], | 
					
						
							|  |  |  | 								'alt' => $config['license']['title'])); | 
					
						
							|  |  |  | 	common_element_start('p'); | 
					
						
							|  |  |  | 	common_text(_t('Unless otherwise specified, contents of this site are copyright by the contributors and available under the ')); | 
					
						
							|  |  |  | 	common_element('a', array('class' => 'license', | 
					
						
							|  |  |  | 							  'rel' => 'license', | 
					
						
							|  |  |  | 							  href => $config['license']['url']), | 
					
						
							|  |  |  | 				   $config['license']['title']); | 
					
						
							|  |  |  | 	common_text(_t('. Contributors should be attributed by full name or nickname.')); | 
					
						
							|  |  |  | 	common_element_end('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 17:04:37 -04:00
										 |  |  | 	common_element_end('div'); | 
					
						
							| 
									
										
										
										
											2008-05-20 13:34:27 -04:00
										 |  |  | 	common_element_end('div'); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_element_end('body'); | 
					
						
							|  |  |  | 	common_element_end('html'); | 
					
						
							| 
									
										
										
										
											2008-05-21 10:33:51 -04:00
										 |  |  | 	common_end_xml(); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 13:13:53 -04:00
										 |  |  | function common_text($txt) { | 
					
						
							|  |  |  | 	global $xw; | 
					
						
							|  |  |  | 	$xw->text($txt); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-28 14:27:07 -04:00
										 |  |  | function common_raw($xml) { | 
					
						
							|  |  |  | 	global $xw; | 
					
						
							|  |  |  | 	$xw->writeRaw($xml); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | function common_nav_menu() { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	$user = common_current_user(); | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	common_element_start('ul', array('id' => 'nav')); | 
					
						
							| 
									
										
										
										
											2008-06-10 21:56:09 -04:00
										 |  |  | 	if ($user) { | 
					
						
							|  |  |  | 		common_menu_item(common_local_url('all', array('nickname' => $user->nickname)), | 
					
						
							|  |  |  | 						 _t('Home')); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-22 13:20:06 -04:00
										 |  |  | 	common_menu_item(common_local_url('public'), _t('Public')); | 
					
						
							| 
									
										
										
										
											2008-07-09 18:31:44 -04:00
										 |  |  | 	common_menu_item(common_local_url('peoplesearch'), _t('Search')); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:45:53 -04:00
										 |  |  | 	common_menu_item(common_local_url('doc', array('title' => 'help')), | 
					
						
							|  |  |  | 					 _t('Help')); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	if ($user) { | 
					
						
							|  |  |  | 		common_menu_item(common_local_url('profilesettings'), | 
					
						
							|  |  |  | 						 _t('Settings')); | 
					
						
							|  |  |  | 		common_menu_item(common_local_url('logout'), | 
					
						
							|  |  |  | 						 _t('Logout')); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 		common_menu_item(common_local_url('login'), _t('Login')); | 
					
						
							|  |  |  | 		common_menu_item(common_local_url('register'), _t('Register')); | 
					
						
							| 
									
										
										
										
											2008-06-18 12:07:33 -04:00
										 |  |  | 		common_menu_item(common_local_url('openidlogin'), _t('OpenID')); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	common_element_end('ul'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_foot_menu() { | 
					
						
							| 
									
										
										
										
											2008-06-10 14:57:59 -04:00
										 |  |  | 	common_element_start('ul', array('id' => 'nav_sub')); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_menu_item(common_local_url('doc', array('title' => 'about')), | 
					
						
							|  |  |  | 					 _t('About')); | 
					
						
							| 
									
										
										
										
											2008-06-30 12:12:01 -04:00
										 |  |  | 	common_menu_item(common_local_url('doc', array('title' => 'faq')), | 
					
						
							|  |  |  | 					 _t('FAQ')); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_menu_item(common_local_url('doc', array('title' => 'privacy')), | 
					
						
							|  |  |  | 					 _t('Privacy')); | 
					
						
							| 
									
										
										
										
											2008-05-22 13:20:06 -04:00
										 |  |  | 	common_menu_item(common_local_url('doc', array('title' => 'source')), | 
					
						
							| 
									
										
										
										
											2008-05-28 10:15:55 -04:00
										 |  |  | 					 _t('Source')); | 
					
						
							| 
									
										
										
										
											2008-07-01 13:56:11 -04:00
										 |  |  | 	common_menu_item(common_local_url('doc', array('title' => 'contact')), | 
					
						
							|  |  |  | 					 _t('Contact')); | 
					
						
							| 
									
										
										
										
											2008-05-20 16:30:02 -04:00
										 |  |  | 	common_element_end('ul'); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 11:56:49 -04:00
										 |  |  | function common_menu_item($url, $text, $title=NULL, $is_selected=false) { | 
					
						
							| 
									
										
										
										
											2008-06-11 11:52:58 -04:00
										 |  |  | 	$lattrs = array(); | 
					
						
							|  |  |  | 	if ($is_selected) { | 
					
						
							|  |  |  | 		$lattrs['class'] = 'current'; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	common_element_start('li', $lattrs); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	$attrs['href'] = $url; | 
					
						
							|  |  |  | 	if ($title) { | 
					
						
							|  |  |  | 		$attrs['title'] = $title; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	common_element('a', $attrs, $text); | 
					
						
							|  |  |  | 	common_element_end('li'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 12:52:01 -04:00
										 |  |  | function common_input($id, $label, $value=NULL,$instructions=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-20 13:47:59 -04:00
										 |  |  | 	common_element_start('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_element('label', array('for' => $id), $label); | 
					
						
							|  |  |  | 	$attrs = array('name' => $id, | 
					
						
							|  |  |  | 				   'type' => 'text', | 
					
						
							| 
									
										
										
										
											2008-06-27 10:55:53 -04:00
										 |  |  | 				   'class' => 'input_text', | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 				   'id' => $id); | 
					
						
							|  |  |  | 	if ($value) { | 
					
						
							|  |  |  | 		$attrs['value'] = htmlspecialchars($value); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	common_element('input', $attrs); | 
					
						
							| 
									
										
										
										
											2008-06-12 12:52:01 -04:00
										 |  |  | 	if ($instructions) { | 
					
						
							|  |  |  | 		common_element('span', 'input_instructions', $instructions); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-20 13:51:05 -04:00
										 |  |  | 	common_element_end('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:27:05 -04:00
										 |  |  | function common_checkbox($id, $label, $checked=false, $instructions=NULL, $value='true') | 
					
						
							| 
									
										
										
										
											2008-06-23 20:15:23 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 	common_element_start('p'); | 
					
						
							|  |  |  | 	$attrs = array('name' => $id, | 
					
						
							|  |  |  | 				   'type' => 'checkbox', | 
					
						
							| 
									
										
										
										
											2008-06-27 10:55:53 -04:00
										 |  |  | 				   'class' => 'checkbox', | 
					
						
							| 
									
										
										
										
											2008-06-26 14:27:05 -04:00
										 |  |  | 				   'id' => $id); | 
					
						
							| 
									
										
										
										
											2008-06-23 20:15:23 -04:00
										 |  |  | 	if ($value) { | 
					
						
							|  |  |  | 		$attrs['value'] = htmlspecialchars($value); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-26 14:27:05 -04:00
										 |  |  | 	if ($checked) { | 
					
						
							|  |  |  | 		$attrs['checked'] = 'checked'; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-26 14:22:31 -04:00
										 |  |  | 	common_element('input', $attrs); | 
					
						
							|  |  |  | 	# XXX: use a <label>
 | 
					
						
							|  |  |  | 	common_text(' '); | 
					
						
							|  |  |  | 	common_element('span', 'checkbox_label', $label); | 
					
						
							|  |  |  | 	common_text(' '); | 
					
						
							| 
									
										
										
										
											2008-06-23 20:15:23 -04:00
										 |  |  | 	if ($instructions) { | 
					
						
							|  |  |  | 		common_element('span', 'input_instructions', $instructions); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	common_element_end('p'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-30 13:43:10 -04:00
										 |  |  | function common_hidden($id, $value) { | 
					
						
							|  |  |  | 	common_element('input', array('name' => $id, | 
					
						
							|  |  |  | 								  'type' => 'hidden', | 
					
						
							|  |  |  | 								  'id' => $id, | 
					
						
							|  |  |  | 								  'value' => $value)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 12:52:01 -04:00
										 |  |  | function common_password($id, $label, $instructions=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-20 13:47:59 -04:00
										 |  |  | 	common_element_start('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	common_element('label', array('for' => $id), $label); | 
					
						
							|  |  |  | 	$attrs = array('name' => $id, | 
					
						
							|  |  |  | 				   'type' => 'password', | 
					
						
							| 
									
										
										
										
											2008-06-27 10:55:53 -04:00
										 |  |  | 				   'class' => 'password', | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 				   'id' => $id); | 
					
						
							|  |  |  | 	common_element('input', $attrs); | 
					
						
							| 
									
										
										
										
											2008-06-12 12:52:01 -04:00
										 |  |  | 	if ($instructions) { | 
					
						
							|  |  |  | 		common_element('span', 'input_instructions', $instructions); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-20 13:51:05 -04:00
										 |  |  | 	common_element_end('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 13:47:59 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_submit($id, $label) { | 
					
						
							| 
									
										
										
										
											2008-05-20 14:06:40 -04:00
										 |  |  | 	global $xw; | 
					
						
							| 
									
										
										
										
											2008-05-20 13:47:59 -04:00
										 |  |  | 	common_element_start('p'); | 
					
						
							|  |  |  | 	common_element('input', array('type' => 'submit', | 
					
						
							|  |  |  | 								  'id' => $id, | 
					
						
							|  |  |  | 								  'name' => $id, | 
					
						
							| 
									
										
										
										
											2008-06-18 12:35:16 -04:00
										 |  |  | 								  'class' => 'submit', | 
					
						
							| 
									
										
										
										
											2008-06-10 21:56:09 -04:00
										 |  |  | 								  'value' => $label)); | 
					
						
							| 
									
										
										
										
											2008-05-20 13:51:05 -04:00
										 |  |  | 	common_element_end('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 12:52:01 -04:00
										 |  |  | function common_textarea($id, $label, $content=NULL, $instructions=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-20 17:19:45 -04:00
										 |  |  | 	common_element_start('p'); | 
					
						
							|  |  |  | 	common_element('label', array('for' => $id), $label); | 
					
						
							| 
									
										
										
										
											2008-06-17 23:00:19 -04:00
										 |  |  | 	common_element('textarea', array('rows' => 3, | 
					
						
							|  |  |  | 									 'cols' => 40, | 
					
						
							|  |  |  | 									 'name' => $id, | 
					
						
							|  |  |  | 									 'id' => $id), | 
					
						
							| 
									
										
										
										
											2008-07-02 09:15:07 -04:00
										 |  |  | 				   ($content) ? $content : ''); | 
					
						
							| 
									
										
										
										
											2008-06-12 12:52:01 -04:00
										 |  |  | 	if ($instructions) { | 
					
						
							|  |  |  | 		common_element('span', 'input_instructions', $instructions); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-20 17:19:45 -04:00
										 |  |  | 	common_element_end('p'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | # salted, hashed passwords are stored in the DB
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-18 17:14:54 -04:00
										 |  |  | function common_munge_password($password, $id) { | 
					
						
							|  |  |  | 	return md5($password . $id); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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 01:53:43 -04:00
										 |  |  | 		if (0 == strcmp(common_munge_password($password, $user->id), | 
					
						
							|  |  |  | 						$user->password)) { | 
					
						
							|  |  |  | 			return $user; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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 01:53:43 -04:00
										 |  |  | # Three kinds of arguments:
 | 
					
						
							|  |  |  | # 1) a user object
 | 
					
						
							|  |  |  | # 2) a nickname
 | 
					
						
							|  |  |  | # 3) NULL to clear
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_set_user($user) { | 
					
						
							| 
									
										
										
										
											2008-07-09 02:25:02 -04:00
										 |  |  | 	if (is_null($user) && common_have_session()) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 		unset($_SESSION['userid']); | 
					
						
							|  |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2008-07-09 01:53:43 -04:00
										 |  |  | 	} else if (is_string($user)) { | 
					
						
							|  |  |  | 		$nickname = $user; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 		$user = User::staticGet('nickname', $nickname); | 
					
						
							| 
									
										
										
										
											2008-07-09 01:53:43 -04:00
										 |  |  | 	} else if (!($user instanceof User)) { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ($user) { | 
					
						
							|  |  |  | 		common_ensure_session(); | 
					
						
							|  |  |  | 		$_SESSION['userid'] = $user->id; | 
					
						
							|  |  |  | 		return $user; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 23:08:34 -04:00
										 |  |  | function common_set_cookie($key, $value, $expiration=0) { | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04: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-23 23:24:08 -04:00
										 |  |  | define('REMEMBERME_EXPIRY', 30 * 24 * 60 * 60); | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-09 01:53:43 -04:00
										 |  |  | function common_rememberme($user=NULL) { | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 	if (!$user) { | 
					
						
							| 
									
										
										
										
											2008-07-09 01:53:43 -04:00
										 |  |  | 		$user = common_current_user(); | 
					
						
							|  |  |  | 		if (!$user) { | 
					
						
							|  |  |  | 			common_debug('No current user to remember', __FILE__); | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	$rm = new Remember_me(); | 
					
						
							|  |  |  | 	$rm->code = common_good_rand(16); | 
					
						
							| 
									
										
										
										
											2008-06-23 23:17:46 -04:00
										 |  |  | 	$rm->user_id = $user->id; | 
					
						
							| 
									
										
										
										
											2008-06-23 23:24:08 -04:00
										 |  |  | 	$result = $rm->insert(); | 
					
						
							|  |  |  | 	if (!$result) { | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 		common_log_db_error($rm, 'INSERT', __FILE__); | 
					
						
							| 
									
										
										
										
											2008-07-09 01:19:43 -04:00
										 |  |  | 		common_debug('Error adding rememberme record for ' . $user->nickname, __FILE__); | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-07-08 02:42:41 -04:00
										 |  |  | 	common_log(LOG_INFO, 'adding rememberme cookie for ' . $user->nickname); | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 	common_set_cookie(REMEMBERME, | 
					
						
							| 
									
										
										
										
											2008-06-23 23:32:23 -04:00
										 |  |  | 					  implode(':', array($rm->user_id, $rm->code)), | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 					  time() + REMEMBERME_EXPIRY); | 
					
						
							| 
									
										
										
										
											2008-07-05 12:21:42 -04:00
										 |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04: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 00:00:58 -04:00
										 |  |  | 			if ($rm && ($rm->user_id == $id)) { | 
					
						
							| 
									
										
										
										
											2008-06-24 00:02:34 -04:00
										 |  |  | 				$user = User::staticGet($rm->user_id); | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 				if ($user) { | 
					
						
							|  |  |  | 					# successful!
 | 
					
						
							|  |  |  | 					$result = $rm->delete(); | 
					
						
							|  |  |  | 					if (!$result) { | 
					
						
							|  |  |  | 						common_log_db_error($rm, 'DELETE', __FILE__); | 
					
						
							|  |  |  | 						$user = NULL; | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2008-07-08 02:42:41 -04:00
										 |  |  | 						common_log(LOG_INFO, 'logging in ' . $user->nickname . ' using rememberme code ' . $rm->code); | 
					
						
							| 
									
										
										
										
											2008-06-23 23:28:18 -04:00
										 |  |  | 						common_set_user($user->nickname); | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 						common_real_login(false); | 
					
						
							| 
									
										
										
										
											2008-06-23 23:10:57 -04:00
										 |  |  | 						# We issue a new cookie, so they can log in
 | 
					
						
							|  |  |  | 						# automatically again after this session
 | 
					
						
							| 
									
										
										
										
											2008-07-09 01:53:43 -04:00
										 |  |  | 						common_rememberme($user); | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return $user; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # must be called with a valid user!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_forgetme() { | 
					
						
							|  |  |  | 	common_set_cookie(REMEMBERME, '', 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | # who is the current user?
 | 
					
						
							|  |  |  | function common_current_user() { | 
					
						
							| 
									
										
										
										
											2008-06-23 23:49:06 -04:00
										 |  |  | 	if ($_REQUEST[session_name()]) { | 
					
						
							|  |  |  | 		common_ensure_session(); | 
					
						
							|  |  |  | 		$id = $_SESSION['userid']; | 
					
						
							|  |  |  | 		if ($id) { | 
					
						
							|  |  |  | 			# note: this should cache
 | 
					
						
							|  |  |  | 			$user = User::staticGet($id); | 
					
						
							|  |  |  | 			return $user; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 	# that didn't work; try to remember
 | 
					
						
							|  |  |  | 	$user = common_remembered_user(); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	return $user; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04: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 09:05:35 -04:00
										 |  |  | # get canonical version of nickname for comparison
 | 
					
						
							|  |  |  | function common_canonical_nickname($nickname) { | 
					
						
							|  |  |  | 	# XXX: UTF-8 canonicalization (like combining chars)
 | 
					
						
							| 
									
										
										
										
											2008-06-11 10:18:24 -04:00
										 |  |  | 	return strtolower($nickname); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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-29 14:12:44 -04: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-29 13:25:49 -04:00
										 |  |  | function common_render_content($text, $notice) { | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04:00
										 |  |  | 	$r = htmlspecialchars($text); | 
					
						
							| 
									
										
										
										
											2008-05-29 13:25:49 -04:00
										 |  |  | 	$id = $notice->profile_id; | 
					
						
							| 
									
										
										
										
											2008-05-29 15:07:02 -04:00
										 |  |  | 	$r = preg_replace('@https?://\S+@', '<a href="\0" class="extlink">\0</a>', $r); | 
					
						
							| 
									
										
										
										
											2008-06-20 16:34:49 -04:00
										 |  |  | 	$r = preg_replace('/(^|\s+)@([a-z0-9]{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	# XXX: # tags
 | 
					
						
							|  |  |  | 	# XXX: machine tags
 | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04:00
										 |  |  | 	return $r; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-29 13:18:53 -04:00
										 |  |  | function common_at_link($sender_id, $nickname) { | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04: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 02:07:33 -04:00
										 |  |  | function common_relative_profile($sender, $nickname, $dt=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04:00
										 |  |  | 	# Try to find profiles this profile is subscribed to that have this nickname
 | 
					
						
							| 
									
										
										
										
											2008-05-29 13:18:53 -04:00
										 |  |  | 	$recipient = new Profile(); | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 	# XXX: use a join instead of a subquery
 | 
					
						
							| 
									
										
										
										
											2008-05-29 13:18:53 -04: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 01:43:58 -04:00
										 |  |  | 		# XXX: should probably differentiate between profiles with
 | 
					
						
							|  |  |  | 		# the same name by date of most recent update
 | 
					
						
							|  |  |  | 		return $recipient; | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	# Try to find profiles that listen to this profile and that have this nickname
 | 
					
						
							| 
									
										
										
										
											2008-05-29 13:18:53 -04:00
										 |  |  | 	$recipient = new Profile(); | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 	# XXX: use a join instead of a subquery
 | 
					
						
							| 
									
										
										
										
											2008-05-29 13:18:53 -04: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 01:43:58 -04:00
										 |  |  | 		# XXX: should probably differentiate between profiles with
 | 
					
						
							|  |  |  | 		# the same name by date of most recent update
 | 
					
						
							|  |  |  | 		return $recipient; | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	# If this is a local user, try to find a local user with that nickname.
 | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 	$sender = User::staticGet($sender->id); | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04:00
										 |  |  | 	if ($sender) { | 
					
						
							| 
									
										
										
										
											2008-05-29 13:18:53 -04:00
										 |  |  | 		$recipient_user = User::staticGet('nickname', $nickname); | 
					
						
							|  |  |  | 		if ($recipient_user) { | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 			return $recipient_user->getProfile(); | 
					
						
							| 
									
										
										
										
											2008-05-29 13:08:01 -04: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 01:43:58 -04:00
										 |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // where should the avatar go for this user?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-05 15:37:08 -04:00
										 |  |  | function common_avatar_filename($id, $extension, $size=NULL, $extra=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	global $config; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if ($size) { | 
					
						
							| 
									
										
										
										
											2008-06-05 15:37:08 -04:00
										 |  |  | 		return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2008-06-05 15:37:08 -04:00
										 |  |  | 		return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_avatar_path($filename) { | 
					
						
							|  |  |  | 	global $config; | 
					
						
							| 
									
										
										
										
											2008-05-30 12:24:29 -04:00
										 |  |  | 	return INSTALLDIR . '/avatar/' . $filename; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_avatar_url($filename) { | 
					
						
							| 
									
										
										
										
											2008-05-30 12:24:29 -04:00
										 |  |  | 	return common_path('avatar/'.$filename); | 
					
						
							| 
									
										
										
										
											2008-07-03 13:03:47 -04: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 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-21 11:54:48 -04:00
										 |  |  | function common_default_avatar($size) { | 
					
						
							|  |  |  | 	static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', | 
					
						
							|  |  |  | 							  AVATAR_STREAM_SIZE => 'stream', | 
					
						
							|  |  |  | 							  AVATAR_MINI_SIZE => 'mini'); | 
					
						
							| 
									
										
										
										
											2008-06-11 15:02:30 -04:00
										 |  |  | 	return theme_path('default-avatar-'.$sizenames[$size].'.png'); | 
					
						
							| 
									
										
										
										
											2008-05-21 11:54:48 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | function common_local_url($action, $args=NULL) { | 
					
						
							| 
									
										
										
										
											2008-05-30 17:25:55 -04: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-06 16:01:51 -04:00
										 |  |  | 	 case 'public': | 
					
						
							| 
									
										
										
										
											2008-06-14 23:50:12 -04:00
										 |  |  | 		if ($args && $args['page']) { | 
					
						
							|  |  |  | 			return common_path('?page=' . $args['page']); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return common_path(''); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 	 case 'publicrss': | 
					
						
							|  |  |  | 		return common_path('rss'); | 
					
						
							| 
									
										
										
										
											2008-06-18 14:26:47 -04:00
										 |  |  | 	 case 'publicxrds': | 
					
						
							|  |  |  | 		return common_path('xrds'); | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04: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-01 12:40:58 -04:00
										 |  |  | 	 case 'remotesubscribe': | 
					
						
							|  |  |  | 		if ($args && $args['nickname']) { | 
					
						
							|  |  |  | 			return common_path('main/remote?nickname=' . $args['nickname']); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return common_path('main/remote'); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-18 12:07:33 -04:00
										 |  |  | 	 case 'openidlogin': | 
					
						
							|  |  |  | 		return common_path('main/openid'); | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 	 case 'avatar': | 
					
						
							|  |  |  | 	 case 'password': | 
					
						
							|  |  |  | 		return common_path('settings/'.$action); | 
					
						
							|  |  |  | 	 case 'profilesettings': | 
					
						
							|  |  |  | 		return common_path('settings/profile'); | 
					
						
							| 
									
										
										
										
											2008-06-18 12:13:21 -04:00
										 |  |  | 	 case 'openidsettings': | 
					
						
							|  |  |  | 		return common_path('settings/openid'); | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 	 case 'newnotice': | 
					
						
							| 
									
										
										
										
											2008-07-09 03:28:33 -04:00
										 |  |  | 		if ($args && $args['replyto']) { | 
					
						
							|  |  |  | 			return common_path('notice/new?replyto='.$args['replyto']); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return common_path('notice/new'); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 	 case 'shownotice': | 
					
						
							|  |  |  | 		return common_path('notice/'.$args['notice']); | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 	 case 'xrds': | 
					
						
							| 
									
										
										
										
											2008-06-10 08:11:32 -04:00
										 |  |  | 	 case 'foaf': | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 		return common_path($args['nickname'].'/'.$action); | 
					
						
							| 
									
										
										
										
											2008-06-14 23:50:12 -04:00
										 |  |  | 	 case 'subscriptions': | 
					
						
							| 
									
										
										
										
											2008-06-18 13:16:22 -04:00
										 |  |  | 	 case 'subscribers': | 
					
						
							| 
									
										
										
										
											2008-06-14 23:50:12 -04:00
										 |  |  | 	 case 'all': | 
					
						
							| 
									
										
										
										
											2008-07-06 23:23:48 -04:00
										 |  |  | 	 case 'replies': | 
					
						
							| 
									
										
										
										
											2008-06-14 23:50:12 -04:00
										 |  |  | 		if ($args && $args['page']) { | 
					
						
							|  |  |  | 			return common_path($args['nickname'].'/'.$action.'?page=' . $args['page']); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return common_path($args['nickname'].'/'.$action); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 	 case 'allrss': | 
					
						
							|  |  |  | 		return common_path($args['nickname'].'/all/rss'); | 
					
						
							| 
									
										
										
										
											2008-07-07 03:30:25 -04:00
										 |  |  | 	 case 'repliesrss': | 
					
						
							|  |  |  | 		return common_path($args['nickname'].'/replies/rss'); | 
					
						
							| 
									
										
										
										
											2008-06-06 16:01:51 -04:00
										 |  |  | 	 case 'userrss': | 
					
						
							|  |  |  | 		return common_path($args['nickname'].'/rss'); | 
					
						
							|  |  |  | 	 case 'showstream': | 
					
						
							| 
									
										
										
										
											2008-06-14 23:50:12 -04:00
										 |  |  | 		if ($args && $args['page']) { | 
					
						
							|  |  |  | 			return common_path($args['nickname'].'?page=' . $args['page']); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return common_path($args['nickname']); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-22 11:52:50 -04:00
										 |  |  | 	 case 'confirmaddress': | 
					
						
							|  |  |  | 		return common_path('main/confirmaddress/'.$args['code']); | 
					
						
							| 
									
										
										
										
											2008-06-20 03:17:00 -04:00
										 |  |  | 	 case 'userbyid': | 
					
						
							|  |  |  | 	 	return common_path('user/'.$args['id']); | 
					
						
							| 
									
										
										
										
											2008-06-24 18:03:35 -04:00
										 |  |  | 	 case 'recoverpassword': | 
					
						
							| 
									
										
										
										
											2008-06-24 18:06:26 -04:00
										 |  |  | 	    $path = 'main/recoverpassword'; | 
					
						
							|  |  |  | 	    if ($args['code']) { | 
					
						
							|  |  |  | 	    	$path .= '/' . $args['code']; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	    return common_path($path); | 
					
						
							| 
									
										
										
										
											2008-06-26 14:49:31 -04:00
										 |  |  | 	 case 'imsettings': | 
					
						
							|  |  |  | 	 	return common_path('settings/im'); | 
					
						
							| 
									
										
										
										
											2008-07-09 18:31:44 -04:00
										 |  |  | 	 case 'peoplesearch': | 
					
						
							| 
									
										
										
										
											2008-07-09 18:38:03 -04:00
										 |  |  | 		return common_path('search/people' . (($args) ? ('?' . http_build_query($args)) : '')); | 
					
						
							| 
									
										
										
										
											2008-07-09 18:31:44 -04:00
										 |  |  | 	 case 'noticesearch': | 
					
						
							| 
									
										
										
										
											2008-07-09 18:38:03 -04:00
										 |  |  | 		return common_path('search/notice' . (($args) ? ('?' . http_build_query($args)) : '')); | 
					
						
							| 
									
										
										
										
											2008-07-09 19:42:28 -04:00
										 |  |  | 	 case 'noticesearchrss': | 
					
						
							|  |  |  | 		return common_path('search/notice/rss' . (($args) ? ('?' . http_build_query($args)) : '')); | 
					
						
							| 
									
										
										
										
											2008-07-11 02:00:45 -04:00
										 |  |  | 	 case 'avatarbynickname': | 
					
						
							|  |  |  | 		return common_path($args['nickname'].'/avatar/'.$args['size']); | 
					
						
							| 
									
										
										
										
											2008-05-30 17:25:55 -04:00
										 |  |  | 	 default: | 
					
						
							|  |  |  | 		return common_simple_url($action, $args); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_simple_url($action, $args=NULL) { | 
					
						
							|  |  |  | 	global $config; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	/* XXX: pretty URLs */ | 
					
						
							|  |  |  | 	$extra = ''; | 
					
						
							|  |  |  | 	if ($args) { | 
					
						
							|  |  |  | 		foreach ($args as $key => $value) { | 
					
						
							|  |  |  | 			$extra .= "&${key}=${value}"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-30 12:24:29 -04:00
										 |  |  | 	return common_path("index.php?action=${action}${extra}"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_path($relative) { | 
					
						
							|  |  |  | 	global $config; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	$pathpart = ($config['site']['path']) ? $config['site']['path']."/" : ''; | 
					
						
							| 
									
										
										
										
											2008-05-30 12:24:29 -04:00
										 |  |  | 	return "http://".$config['site']['server'].'/'.$pathpart.$relative; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_date_string($dt) { | 
					
						
							|  |  |  | 	// XXX: do some sexy date formatting
 | 
					
						
							|  |  |  | 	// return date(DATE_RFC822, $dt);
 | 
					
						
							| 
									
										
										
										
											2008-06-27 18:25:22 -04:00
										 |  |  | 	$t = strtotime($dt); | 
					
						
							|  |  |  | 	$now = time(); | 
					
						
							|  |  |  | 	$diff = $now - $t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if ($now < $t) { # that shouldn't happen!
 | 
					
						
							| 
									
										
										
										
											2008-06-27 18:29:30 -04:00
										 |  |  | 		return common_exact_date($dt); | 
					
						
							| 
									
										
										
										
											2008-06-27 18:25:22 -04:00
										 |  |  | 	} else if ($diff < 60) { | 
					
						
							|  |  |  | 		return _t('a few seconds ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 92) { | 
					
						
							|  |  |  | 		return _t('about a minute ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 3300) { | 
					
						
							|  |  |  | 		return _t('about ') . round($diff/60) . _t(' minutes ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 5400) { | 
					
						
							|  |  |  | 		return _t('about an hour ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 22 * 3600) { | 
					
						
							|  |  |  | 		return _t('about ') . round($diff/3600) . _t(' hours ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 37 * 3600) { | 
					
						
							|  |  |  | 		return _t('about a day ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 24 * 24 * 3600) { | 
					
						
							|  |  |  | 		return _t('about ') . round($diff/(24*3600)) . _t(' days ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 46 * 24 * 3600) { | 
					
						
							|  |  |  | 		return _t('about a month ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 330 * 24 * 3600) { | 
					
						
							|  |  |  | 		return _t('about ') . round($diff/(30*24*3600)) . _t(' months ago'); | 
					
						
							|  |  |  | 	} else if ($diff < 480 * 24 * 3600) { | 
					
						
							|  |  |  | 		return _t('about a year ago'); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2008-06-27 18:29:30 -04:00
										 |  |  | 		return common_exact_date($dt); | 
					
						
							| 
									
										
										
										
											2008-06-27 18:25:22 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-27 18:29:30 -04:00
										 |  |  | function common_exact_date($dt) { | 
					
						
							| 
									
										
										
										
											2008-06-27 18:25:22 -04:00
										 |  |  | 	$t = strtotime($dt); | 
					
						
							| 
									
										
										
										
											2008-06-27 18:34:39 -04:00
										 |  |  | 	return date(DATE_RFC850, $t); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-21 10:59:16 -04:00
										 |  |  | function common_date_w3dtf($dt) { | 
					
						
							|  |  |  | 	$t = strtotime($dt); | 
					
						
							|  |  |  | 	return date(DATE_W3C, $t); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04: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 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-18 16:25:00 -04: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 09:05:35 -04:00
										 |  |  | 	common_element('a', array('href' => $url), $url); | 
					
						
							| 
									
										
										
										
											2008-06-18 16:25:00 -04:00
										 |  |  | 	common_end_xml(); | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 23:08:37 -04:00
										 |  |  | function common_save_replies($notice) { | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 	# extract all @messages
 | 
					
						
							|  |  |  | 	$cnt = preg_match_all('/(?:^|\s)@([a-z0-9]{1,64})/', $notice->content, $match); | 
					
						
							|  |  |  | 	if (!$cnt) { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$sender = Profile::staticGet($notice->profile_id); | 
					
						
							|  |  |  | 	# store replied only for first @ (what user/notice what the reply directed,
 | 
					
						
							|  |  |  | 	# we assume first @ is it)
 | 
					
						
							|  |  |  | 	for ($i=0; $i<count($match[1]); $i++) { | 
					
						
							|  |  |  | 		$nickname = $match[1][$i]; | 
					
						
							|  |  |  | 		$recipient = common_relative_profile($sender, $nickname, $notice->created); | 
					
						
							|  |  |  | 		if (!$recipient) { | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-07-09 16:40:50 -04:00
										 |  |  | 		if ($i == 0 && ($recipient->id != $sender->id)) { # Don't save reply to self
 | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 			$reply_for = $recipient; | 
					
						
							| 
									
										
										
										
											2008-07-09 16:27:16 -04:00
										 |  |  | 			$recipient_notice = $reply_for->getCurrentNotice(); | 
					
						
							|  |  |  | 			$orig = clone($notice); | 
					
						
							|  |  |  | 			$notice->reply_to = $recipient_notice->id; | 
					
						
							|  |  |  | 			$notice->update($orig); | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		$reply = new Reply(); | 
					
						
							|  |  |  | 		$reply->notice_id = $notice->id; | 
					
						
							|  |  |  | 		$reply->profile_id = $recipient->id; | 
					
						
							|  |  |  | 		$id = $reply->insert(); | 
					
						
							|  |  |  | 		if (!$id) { | 
					
						
							| 
									
										
										
										
											2008-07-07 03:44:34 -04:00
										 |  |  | 			$last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); | 
					
						
							|  |  |  | 			common_log(LOG_ERROR, 'DB error inserting reply: ' . $last_error->message); | 
					
						
							|  |  |  | 			common_server_error('DB error inserting reply: ' . $last_error->message); | 
					
						
							| 
									
										
										
										
											2008-07-07 01:43:58 -04:00
										 |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 23:08:37 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04:00
										 |  |  | function common_broadcast_notice($notice, $remote=false) { | 
					
						
							| 
									
										
										
										
											2008-07-04 01:04:25 -04:00
										 |  |  | 	if (common_config('queue', 'enabled')) { | 
					
						
							|  |  |  | 		# Do it later!
 | 
					
						
							| 
									
										
										
										
											2008-07-04 04:32:16 -04:00
										 |  |  | 		return common_enqueue_notice($notice); | 
					
						
							| 
									
										
										
										
											2008-07-04 01:04:25 -04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2008-07-04 20:22:07 -04:00
										 |  |  | 		return common_real_broadcast($notice, $remote); | 
					
						
							| 
									
										
										
										
											2008-07-04 01:04:25 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Stick the notice on the queue
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_enqueue_notice($notice) { | 
					
						
							|  |  |  | 	$qi = new Queue_item(); | 
					
						
							|  |  |  | 	$qi->notice_id = $notice->id; | 
					
						
							| 
									
										
										
										
											2008-07-08 03:04:57 -04:00
										 |  |  | 	$qi->created = $notice->created; | 
					
						
							|  |  |  |         $result = $qi->insert(); | 
					
						
							|  |  |  | 	if (!$result) { | 
					
						
							| 
									
										
										
										
											2008-07-04 03:17:26 -04:00
										 |  |  | 	    $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); | 
					
						
							|  |  |  | 	    common_log(LOG_ERROR, 'DB error inserting queue item: ' . $last_error->message); | 
					
						
							| 
									
										
										
										
											2008-07-04 20:22:07 -04:00
										 |  |  | 	    return false; | 
					
						
							| 
									
										
										
										
											2008-07-04 02:20:56 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-07-08 03:04:57 -04:00
										 |  |  | 	common_log(LOG_DEBUG, 'complete queueing notice ID = ' . $notice->id); | 
					
						
							| 
									
										
										
										
											2008-07-04 01:04:25 -04:00
										 |  |  | 	return $result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 	   | 
					
						
							|  |  |  | function common_real_broadcast($notice, $remote=false) { | 
					
						
							| 
									
										
										
										
											2008-07-04 20:22:07 -04:00
										 |  |  | 	$success = true; | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04:00
										 |  |  | 	if (!$remote) { | 
					
						
							| 
									
										
										
										
											2008-06-06 12:22:26 -04:00
										 |  |  | 		# Make sure we have the OMB stuff
 | 
					
						
							|  |  |  | 		require_once(INSTALLDIR.'/lib/omb.php'); | 
					
						
							| 
									
										
										
										
											2008-07-04 20:22:07 -04:00
										 |  |  | 		$success = omb_broadcast_remote_subscribers($notice); | 
					
						
							| 
									
										
										
										
											2008-07-04 20:56:02 -04:00
										 |  |  | 		if (!$success) { | 
					
						
							|  |  |  | 			common_log(LOG_ERROR, 'Error in OMB broadcast for notice ' . $notice->id); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-07-04 20:22:07 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if ($success) { | 
					
						
							|  |  |  | 		require_once(INSTALLDIR.'/lib/jabber.php'); | 
					
						
							|  |  |  | 		$success = jabber_broadcast_notice($notice); | 
					
						
							| 
									
										
										
										
											2008-07-04 20:56:02 -04:00
										 |  |  | 		if (!$success) { | 
					
						
							|  |  |  | 			common_log(LOG_ERROR, 'Error in jabber broadcast for notice ' . $notice->id); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// XXX: broadcast notices to SMS
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	// XXX: broadcast notices to other IM
 | 
					
						
							| 
									
										
										
										
											2008-07-04 20:22:07 -04:00
										 |  |  | 	return $success; | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 14:40:28 -04: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-06 12:04:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | function common_profile_url($nickname) { | 
					
						
							|  |  |  | 	return common_local_url('showstream', array('nickname' => $nickname)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | # Don't call if nobody's logged in
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 17:46:54 -04:00
										 |  |  | function common_notice_form($action=NULL, $content=NULL) { | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	$user = common_current_user(); | 
					
						
							|  |  |  | 	assert(!is_null($user)); | 
					
						
							|  |  |  | 	common_element_start('form', array('id' => 'status_form', | 
					
						
							| 
									
										
										
										
											2008-07-02 09:15:07 -04:00
										 |  |  | 									   'method' => 'post', | 
					
						
							| 
									
										
										
										
											2008-05-20 16:11:20 -04:00
										 |  |  | 									   'action' => common_local_url('newnotice'))); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:36:49 -04:00
										 |  |  | 	common_element_start('p'); | 
					
						
							| 
									
										
										
										
											2008-07-02 09:15:07 -04:00
										 |  |  | 	common_element('label', array('for' => 'status_textarea', | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 								  'id' => 'status_label'), | 
					
						
							|  |  |  | 				   _t('What\'s up, ').$user->nickname.'?'); | 
					
						
							| 
									
										
										
										
											2008-06-24 13:46:13 -04:00
										 |  |  |         common_element('span', array('id' => 'counter', 'class' => 'counter'), '140'); | 
					
						
							| 
									
										
										
										
											2008-06-17 23:00:19 -04:00
										 |  |  | 	common_element('textarea', array('id' => 'status_textarea', | 
					
						
							| 
									
										
										
										
											2008-07-02 09:15:07 -04:00
										 |  |  | 									 'cols' => 60, | 
					
						
							|  |  |  | 									 'rows' => 3, | 
					
						
							| 
									
										
										
										
											2008-06-17 23:00:19 -04:00
										 |  |  | 									 'name' => 'status_textarea'), | 
					
						
							| 
									
										
										
										
											2008-07-02 09:00:29 -04:00
										 |  |  | 				   ($content) ? $content : ''); | 
					
						
							| 
									
										
										
										
											2008-06-19 12:18:14 -04:00
										 |  |  | 	if ($action) { | 
					
						
							|  |  |  | 		common_hidden('returnto', $action); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 	common_element('input', array('id' => 'status_submit', | 
					
						
							| 
									
										
										
										
											2008-06-10 17:16:14 -04:00
										 |  |  | 								  'name' => 'status_submit', | 
					
						
							| 
									
										
										
										
											2008-06-10 14:52:38 -04:00
										 |  |  | 								  'type' => 'submit', | 
					
						
							|  |  |  | 								  'value' => _t('Send'))); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:36:49 -04:00
										 |  |  | 	common_element_end('p'); | 
					
						
							| 
									
										
										
										
											2008-05-20 16:11:20 -04:00
										 |  |  | 	common_element_end('form'); | 
					
						
							| 
									
										
										
										
											2008-05-20 16:25:00 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-05-20 16:11:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-22 14:34:21 -04:00
										 |  |  | function common_mint_tag($extra) { | 
					
						
							|  |  |  | 	global $config; | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04:00
										 |  |  | 	return | 
					
						
							| 
									
										
										
										
											2008-05-22 14:34:21 -04:00
										 |  |  | 	  'tag:'.$config['tag']['authority'].','. | 
					
						
							| 
									
										
										
										
											2008-05-22 14:40:27 -04:00
										 |  |  | 	  $config['tag']['date'].':'.$config['tag']['prefix'].$extra; | 
					
						
							| 
									
										
										
										
											2008-05-22 14:34:21 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-27 07:42:19 -04:00
										 |  |  | # Should make up a reasonable root URL
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_root_url() { | 
					
						
							| 
									
										
										
										
											2008-05-30 12:24:29 -04:00
										 |  |  | 	return common_path(''); | 
					
						
							| 
									
										
										
										
											2008-05-27 07:42:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-27 16:07:21 -04: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 10:23:24 -04: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 10:03:21 -04:00
										 |  |  | function common_timestamp() { | 
					
						
							| 
									
										
										
										
											2008-05-28 10:30:30 -04:00
										 |  |  | 	return date('YmdHis'); | 
					
						
							| 
									
										
										
										
											2008-05-28 10:03:21 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | // XXX: set up gettext
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | function _t($str) { | 
					
						
							| 
									
										
										
										
											2008-05-20 09:05:35 -04:00
										 |  |  | 	return $str; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-05-30 14:22:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function common_ensure_syslog() { | 
					
						
							|  |  |  | 	static $initialized = false; | 
					
						
							|  |  |  | 	if (!$initialized) { | 
					
						
							| 
									
										
										
										
											2008-06-04 22:40:35 -04:00
										 |  |  | 		global $config; | 
					
						
							| 
									
										
										
										
											2008-05-30 14:22:30 -04:00
										 |  |  | 		define_syslog_variables(); | 
					
						
							| 
									
										
										
										
											2008-06-04 22:47:17 -04:00
										 |  |  | 		openlog($config['syslog']['appname'], 0, LOG_USER); | 
					
						
							| 
									
										
										
										
											2008-05-30 14:22:30 -04:00
										 |  |  | 		$initialized = true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-04 22:40:35 -04:00
										 |  |  | function common_log($priority, $msg, $filename=NULL) { | 
					
						
							| 
									
										
										
										
											2008-07-12 11:15:21 -04:00
										 |  |  | 	$logfile = common_config('site', 'logfile'); | 
					
						
							|  |  |  | 	if ($logfile) { | 
					
						
							|  |  |  | 		$log = fopen($logfile, "a"); | 
					
						
							|  |  |  | 		if ($log) { | 
					
						
							|  |  |  | 			static $syslog_priorities = array('LOG_EMERG', 'LOG_ALERT', 'LOG_CRIT', 'LOG_ERR',  | 
					
						
							|  |  |  | 											  'LOG_WARNING', 'LOG_NOTICE', 'LOG_INFO', 'LOG_DEBUG'); | 
					
						
							|  |  |  | 			$output = date('Y-m-d H:i:s') . ' ' . $syslog_priorities[$priority] . ': ' . $msg . "\n"; | 
					
						
							|  |  |  | 			fwrite($log, $output); | 
					
						
							|  |  |  | 			fclose($log); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		common_ensure_syslog(); | 
					
						
							|  |  |  | 		syslog($priority, $msg); | 
					
						
							| 
									
										
										
										
											2008-07-11 03:00:21 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-30 14:22:30 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-04 22:40:35 -04:00
										 |  |  | function common_debug($msg, $filename=NULL) { | 
					
						
							| 
									
										
										
										
											2008-06-04 22:47:17 -04:00
										 |  |  | 	if ($filename) { | 
					
						
							|  |  |  | 		common_log(LOG_DEBUG, basename($filename).' - '.$msg); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		common_log(LOG_DEBUG, $msg); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-04 14:51:31 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 10:27:13 -04:00
										 |  |  | function common_log_db_error(&$object, $verb, $filename=NULL) { | 
					
						
							|  |  |  | 	$objstr = common_log_objstring($object); | 
					
						
							| 
									
										
										
										
											2008-06-22 10:09:41 -04:00
										 |  |  | 	$last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); | 
					
						
							| 
									
										
										
										
											2008-07-07 02:19:12 -04:00
										 |  |  | 	common_log(LOG_ERR, $last_error->message . '(' . $verb . ' on ' . $objstr . ')', $filename); | 
					
						
							| 
									
										
										
										
											2008-06-22 10:09:41 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 10:27:13 -04:00
										 |  |  | function common_log_objstring(&$object) { | 
					
						
							| 
									
										
										
										
											2008-06-22 10:09:41 -04:00
										 |  |  | 	if (is_null($object)) { | 
					
						
							|  |  |  | 		return "NULL"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	$arr = $object->toArray(); | 
					
						
							|  |  |  | 	$fields = array(); | 
					
						
							|  |  |  | 	foreach ($arr as $k => $v) { | 
					
						
							|  |  |  | 		$fields[] = "$k='$v'"; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 10:29:06 -04:00
										 |  |  | 	$objstring = $object->tableName() . '[' . implode(',', $fields) . ']'; | 
					
						
							| 
									
										
										
										
											2008-06-22 10:09:41 -04:00
										 |  |  | 	return $objstring; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-04 14:51:31 -04:00
										 |  |  | function common_valid_http_url($url) { | 
					
						
							|  |  |  | 	return Validate::uri($url, array('allowed_schemes' => array('http', 'https'))); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-05 00:01:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function common_valid_tag($tag) { | 
					
						
							|  |  |  | 	if (preg_match('/^tag:(.*?),(\d{4}(-\d{2}(-\d{2})?)?):(.*)$/', $tag, $matches)) { | 
					
						
							| 
									
										
										
										
											2008-06-06 12:04:37 -04:00
										 |  |  | 		return (Validate::email($matches[1]) || | 
					
						
							| 
									
										
										
										
											2008-06-05 00:01:53 -04:00
										 |  |  | 				preg_match('/^([\w-\.]+)$/', $matches[1])); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Does a little before-after block for next/prev page
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | function common_pagination($have_before, $have_after, $page, $action, $args=NULL) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04:00
										 |  |  | 	if ($have_before || $have_after) { | 
					
						
							|  |  |  | 		common_element_start('div', array('id' => 'pagination')); | 
					
						
							|  |  |  | 		common_element_start('ul', array('id' => 'nav_pagination')); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04:00
										 |  |  | 	if ($have_before) { | 
					
						
							|  |  |  | 		$pargs = array('page' => $page-1); | 
					
						
							|  |  |  | 		$newargs = ($args) ? array_merge($args,$pargs) : $pargs; | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04:00
										 |  |  | 		common_element_start('li', 'before'); | 
					
						
							|  |  |  | 		common_element('a', array('href' => common_local_url($action, $newargs)), | 
					
						
							| 
									
										
										
										
											2008-06-14 23:55:10 -04:00
										 |  |  | 					   _t('« After')); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04: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-06-14 23:55:10 -04:00
										 |  |  | 						   _t('Before »')); | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04:00
										 |  |  | 		common_element_end('li'); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-20 02:56:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-10 15:21:01 -04:00
										 |  |  | 	if ($have_before || $have_after) { | 
					
						
							|  |  |  | 		common_element_end('ul'); | 
					
						
							|  |  |  | 		common_element_end('div'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-13 10:49:13 -04: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-23 13:30:43 -04:00
										 |  |  | 	$besttype = "text/html"; | 
					
						
							| 
									
										
										
										
											2008-06-13 10:49:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	foreach(array_keys($combine) as $type) { | 
					
						
							|  |  |  | 		if($combine[$type] > $bestq) { | 
					
						
							|  |  |  | 			$besttype = $type; | 
					
						
							|  |  |  | 			$bestq = $combine[$type]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return $besttype; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-13 13:53:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function common_config($main, $sub) { | 
					
						
							|  |  |  | 	global $config; | 
					
						
							|  |  |  | 	return $config[$main][$sub]; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-19 10:11:07 -04: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 02:54:55 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-20 03:17:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function common_user_uri(&$user) { | 
					
						
							|  |  |  | 	return common_local_url('userbyid', array('id' => $user->id)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_notice_uri(&$notice) { | 
					
						
							| 
									
										
										
										
											2008-06-23 22:52:34 -04:00
										 |  |  | 	return common_local_url('shownotice', | 
					
						
							| 
									
										
										
										
											2008-06-20 03:17:00 -04:00
										 |  |  | 		array('notice' => $notice->id)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-22 12:32:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function common_confirmation_code($bits) { | 
					
						
							| 
									
										
										
										
											2008-06-22 12:34:58 -04:00
										 |  |  | 	# 36 alphanums - lookalikes (0, O, 1, I) = 32 chars = 5 bits
 | 
					
						
							|  |  |  | 	static $codechars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; | 
					
						
							| 
									
										
										
										
											2008-06-22 12:32:41 -04: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-27 18:25:22 -04:00
										 |  |  | 		# XXX: randomness is too precious to throw away almost
 | 
					
						
							|  |  |  | 		# 40% of the bits we get!
 | 
					
						
							| 
									
										
										
										
											2008-06-22 12:34:58 -04:00
										 |  |  | 		$code .= $codechars[$num%32]; | 
					
						
							| 
									
										
										
										
											2008-06-22 12:32:41 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return $code; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-30 13:03:42 -04: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); | 
					
						
							|  |  |  | } |