X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Futil.php;h=def3a57506f9037c4d85fea46bd23ae15cb6f2ab;hb=9f39fd31afe198fc78c669088710af64a9976c3d;hp=052f35fdd950b6b1439cd91ed723b7b72dda6c5b;hpb=7352cab8ee8dd37c76ac2492695cc4c347d9564c;p=quix0rs-gnu-social.git diff --git a/lib/util.php b/lib/util.php index 052f35fdd9..def3a57506 100644 --- a/lib/util.php +++ b/lib/util.php @@ -21,16 +21,57 @@ # Show a server error -function common_server_error($msg) { - header('Status: 500 Server Error'); +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); header('Content-type: text/plain'); print $msg; + print "\n"; exit(); } # Show a user error -function common_user_error($msg, $code=200) { +function common_user_error($msg, $code=400) { + 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); + common_show_header('Error'); common_element('div', array('class' => 'error'), $msg); common_show_footer(); @@ -82,7 +123,7 @@ function common_end_xml() { $xw->flush(); } -function common_show_header($pagetitle) { +function common_show_header($pagetitle, $callable=NULL, $data=NULL, $notice=NULL) { global $config, $xw; header('Content-Type: application/xhtml+xml'); @@ -102,35 +143,56 @@ function common_show_header($pagetitle) { $pagetitle . " - " . $config['site']['name']); common_element('link', array('rel' => 'stylesheet', 'type' => 'text/css', - 'href' => $config['site']['path'] . 'theme/default/style/html.css', + 'href' => theme_path('display.css'), 'media' => 'screen, projection, tv')); - common_element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => $config['site']['path'] . 'theme/default/style/layout.css', - 'media' => 'screen, projection, tv')); - common_element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => $config['site']['path'] . 'theme/default/style/print.css', - 'media' => 'print')); + 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.']>\0', $r); + $r = preg_replace('/(^|\b)@([\w-]+)($|\b)/e', "'\\1@'.common_at_link($id, '\\2').'\\3'", $r); # XXX: # tags # XXX: machine tags - return htmlspecialchars($text); + return $r; +} + +function common_at_link($sender_id, $nickname) { + # Try to find profiles this profile is subscribed to that have this nickname + $recipient = new Profile(); + # XXX: chokety and bad + $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)) { + return ''.$nickname.''; + } + # Try to find profiles that listen to this profile and that have this nickname + $recipient = new Profile(); + # XXX: chokety and bad + $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)) { + return ''.$nickname.''; + } + # If this is a local user, try to find a local user with that nickname. + $sender = User::staticGet($sender_id); + if ($sender) { + $recipient_user = User::staticGet('nickname', $nickname); + if ($recipient_user) { + $recipient = $recipient->getProfile(); + return ''.$nickname.''; + } + } + # Otherwise, no links. @messages from local users to remote users, + # or from remote users to other remote users, are just + # outside our ability to make intelligent guesses about + return $nickname; } // where should the avatar go for this user? -function common_avatar_filename($user, $extension, $size=NULL) { +function common_avatar_filename($id, $extension, $size=NULL, $extra=NULL) { global $config; if ($size) { - return $user->id . '-' . $size . $extension; + return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension; } else { - return $user->id . '-original' . $extension; + return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension; } } function common_avatar_path($filename) { global $config; - return $config['avatar']['directory'] . '/' . $filename; + return INSTALLDIR . '/avatar/' . $filename; } function common_avatar_url($filename) { + return common_path('avatar/'.$filename); +} + +function common_default_avatar($size) { + static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', + AVATAR_STREAM_SIZE => 'stream', + AVATAR_MINI_SIZE => 'mini'); global $config; - return $config['avatar']['path'] . '/' . $filename; + + return common_path($config['avatar']['default'][$sizenames[$size]]); } function common_local_url($action, $args=NULL) { + 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)) { + case 'public': + return common_path(''); + case 'publicrss': + return common_path('rss'); + case 'doc': + return common_path('doc/'.$args['title']); + case 'login': + case 'logout': + case 'register': + case 'subscribe': + case 'unsubscribe': + return common_path('main/'.$action); + case 'avatar': + case 'password': + return common_path('settings/'.$action); + case 'profilesettings': + return common_path('settings/profile'); + case 'newnotice': + return common_path('notice/new'); + case 'shownotice': + return common_path('notice/'.$args['notice']); + case 'subscriptions': + case 'subscribed': + case 'xrds': + case 'all': + case 'foaf': + return common_path($args['nickname'].'/'.$action); + case 'allrss': + return common_path($args['nickname'].'/all/rss'); + case 'userrss': + return common_path($args['nickname'].'/rss'); + case 'showstream': + return common_path($args['nickname']); + default: + return common_simple_url($action, $args); + } +} + +function common_simple_url($action, $args=NULL) { global $config; /* XXX: pretty URLs */ $extra = ''; @@ -370,8 +515,13 @@ function common_local_url($action, $args=NULL) { $extra .= "&${key}=${value}"; } } + return common_path("index.php?action=${action}${extra}"); +} + +function common_path($relative) { + global $config; $pathpart = ($config['site']['path']) ? $config['site']['path']."/" : ''; - return "http://".$config['site']['server'].'/'.$pathpart."index.php?action=${action}${extra}"; + return "http://".$config['site']['server'].'/'.$pathpart.$relative; } function common_date_string($dt) { @@ -395,29 +545,176 @@ function common_redirect($url, $code=307) { common_element('a', array('href' => $url), $url); } -function common_broadcast_notices($id) { - // XXX: broadcast notices to remote subscribers - // XXX: broadcast notices to SMS +function common_broadcast_notice($notice, $remote=false) { + // XXX: optionally use a queue system like http://code.google.com/p/microapps/wiki/NQDQ + if (!$remote) { + # Make sure we have the OMB stuff + require_once(INSTALLDIR.'/lib/omb.php'); + omb_broadcast_remote_subscribers($notice); + } // XXX: broadcast notices to Jabber + // XXX: broadcast notices to SMS // XXX: broadcast notices to other IM - // XXX: use a queue system like http://code.google.com/p/microapps/wiki/NQDQ return true; } + function common_profile_url($nickname) { return common_local_url('showstream', array('nickname' => $nickname)); } +# Don't call if nobody's logged in + function common_notice_form() { - common_element_start('form', array('id' => 'newnotice', 'method' => 'POST', + $user = common_current_user(); + assert(!is_null($user)); + common_element_start('form', array('id' => 'status_form', + 'method' => 'POST', 'action' => common_local_url('newnotice'))); - common_textarea('noticecontent', _t('What\'s up?')); - common_submit('submit', _t('Send')); + common_element_start('p'); + common_element('label', array('for' => 'status_update', + 'id' => 'status_label'), + _t('What\'s up, ').$user->nickname.'?'); + common_element('textarea', array('id' => 'status_textarea', + 'name' => 'status_textarea')); + common_element('input', array('id' => 'status_submit', + 'name' => 'status_submit', + 'type' => 'submit', + 'value' => _t('Send'))); + common_element_end('p'); common_element_end('form'); } +function common_mint_tag($extra) { + global $config; + return + 'tag:'.$config['tag']['authority'].','. + $config['tag']['date'].':'.$config['tag']['prefix'].$extra; +} + +# Should make up a reasonable root URL + +function common_root_url() { + return common_path(''); +} + +# 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; +} + +function common_set_returnto($url) { + common_ensure_session(); + $_SESSION['returnto'] = $url; +} + +function common_get_returnto() { + common_ensure_session(); + return $_SESSION['returnto']; +} + +function common_timestamp() { + return date('YmdHis'); +} + // XXX: set up gettext function _t($str) { return $str; } + +function common_ensure_syslog() { + static $initialized = false; + if (!$initialized) { + global $config; + define_syslog_variables(); + openlog($config['syslog']['appname'], 0, LOG_USER); + $initialized = true; + } +} + +function common_log($priority, $msg, $filename=NULL) { + common_ensure_syslog(); + syslog($priority, $msg); +} + +function common_debug($msg, $filename=NULL) { + if ($filename) { + common_log(LOG_DEBUG, basename($filename).' - '.$msg); + } else { + common_log(LOG_DEBUG, $msg); + } +} + +function common_valid_http_url($url) { + return Validate::uri($url, array('allowed_schemes' => array('http', 'https'))); +} + +function common_valid_tag($tag) { + if (preg_match('/^tag:(.*?),(\d{4}(-\d{2}(-\d{2})?)?):(.*)$/', $tag, $matches)) { + return (Validate::email($matches[1]) || + preg_match('/^([\w-\.]+)$/', $matches[1])); + } + return false; +} + +# Does a little before-after block for next/prev page + +function common_pagination($have_before, $have_after, $page, $action, $args=NULL) { + + if ($have_before || $have_after) { + common_element_start('div', array('id' => 'pagination')); + common_element_start('ul', array('id' => 'nav_pagination')); + } + + if ($have_before) { + $pargs = array('page' => $page-1); + $newargs = ($args) ? array_merge($args,$pargs) : $pargs; + + common_element_start('li', 'before'); + common_element('a', array('href' => common_local_url($action, $newargs)), + _t('« Before')); + common_element_end('li'); + } + + if ($have_after) { + $pargs = array('page' => $page+1); + $newargs = ($args) ? array_merge($args,$pargs) : $pargs; + common_element_start('li', 'after'); + common_element('a', array('href' => common_local_url($action, $newargs)), + _t('After »')); + common_element_end('li'); + } + + if ($have_before || $have_after) { + common_element_end('ul'); + common_element_end('div'); + } +}