X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=boot.php;h=7dfaa021ee7743cb35df845166e938fa741b5c2e;hb=ff15ea099310bab5cdcaa724274f3ef22301fcb4;hp=08caa72ab9ddb703da83d4d8d08eab5ac26d082e;hpb=3f432a7b82480dd985dbc2a67ae23cfc1ed258c6;p=friendica.git diff --git a/boot.php b/boot.php index 08caa72ab9..7dfaa021ee 100644 --- a/boot.php +++ b/boot.php @@ -2,9 +2,9 @@ set_time_limit(0); -define ( 'FRIENDIKA_VERSION', '2.1.920' ); -define ( 'DFRN_PROTOCOL_VERSION', '2.1' ); -define ( 'DB_UPDATE_VERSION', 1043 ); +define ( 'FRIENDIKA_VERSION', '2.1.946' ); +define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); +define ( 'DB_UPDATE_VERSION', 1048 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); @@ -73,6 +73,18 @@ define ( 'PAGE_SOAPBOX', 1 ); define ( 'PAGE_COMMUNITY', 2 ); define ( 'PAGE_FREELOVE', 3 ); +/** + * Network and protocol family types + */ + +define ( 'NETWORK_DFRN', 'dfrn'); // Friendika, Mistpark, other DFRN implementations +define ( 'NETWORK_OSTATUS', 'stat'); // status.net, identi.ca, GNU-social, other OStatus implementations +define ( 'NETWORK_FEED', 'feed'); // RSS/Atom feeds with no known "post/notify" protocol +define ( 'NETWORK_DIASPORA', 'dspr'); // Diaspora +define ( 'NETWORK_MAIL', 'mail'); // IMAP/POP +define ( 'NETWORK_FACEBOOK', 'face'); // Facebook API + + /** * Maximum number of "people who like (or don't like) this" that we will list by name */ @@ -159,6 +171,11 @@ if (get_magic_quotes_gpc()) { unset($process); } +/* + * translation system + */ +require_once("include/pgettext.php"); + /** * @@ -347,10 +364,12 @@ class App { function init_pagehead() { $this->page['title'] = $this->config['sitename']; - $tpl = load_view_file("view/head.tpl"); + $tpl = load_view_file('view/head.tpl'); $this->page['htmlhead'] = replace_macros($tpl,array( '$baseurl' => $this->get_baseurl() . '/', - '$generator' => 'Friendika' . ' ' . FRIENDIKA_VERSION + '$generator' => 'Friendika' . ' ' . FRIENDIKA_VERSION, + '$delitem' => t('Delete this item?'), + '$comment' => t('Comment') )); } @@ -430,15 +449,18 @@ function check_config(&$a) { load_config('system'); - if(! x($_SERVER,'SERVER_NAME')) - return; - $build = get_config('system','build'); if(! x($build)) $build = set_config('system','build',DB_UPDATE_VERSION); $url = get_config('system','url'); - if(! x($url)) + + // if the url isn't set or the stored url is radically different + // than the currently visited url, store the current value accordingly. + // "Radically different" ignores common variations such as http vs https + // and www.example.com vs example.com. + + if((! x($url)) || (! link_compare($url,$a->get_baseurl()))) $url = set_config('system','url',$a->get_baseurl()); if($build != DB_UPDATE_VERSION) { @@ -601,28 +623,6 @@ function replace_macros($s,$r) { }} -// load string translation table for alternate language - -if(! function_exists('load_translation_table')) { -function load_translation_table($lang) { - global $a; - - if(file_exists("view/$lang/strings.php")) - include("view/$lang/strings.php"); -}} - -// translate string if translation exists - -if(! function_exists('t')) { -function t($s) { - - $a = get_app(); - - if(x($a->strings,$s)) - return $a->strings[$s]; - return $s; -}} - // curl wrapper. If binary flag is true, return binary // results. @@ -1085,6 +1085,7 @@ function paginate(&$a) { $stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string); $stripped = str_replace('q=','',$stripped); $stripped = trim($stripped,'/'); + $pagenum = $a->pager['page']; $url = $a->get_baseurl() . '/' . $stripped; @@ -1097,7 +1098,7 @@ function paginate(&$a) { $numpages = $a->pager['total'] / $a->pager['itemspage']; - $numstart = 1; + $numstart = 1; $numstop = $numpages; if($numpages > 14) { @@ -1492,7 +1493,9 @@ function lrdd($uri) { return array(); logger('lrdd: host_meta: ' . $xml, LOGGER_DATA); - $h = simplexml_load_string($xml); + + $h = parse_xml_string($xml); + $arr = convert_xml_element_to_array($h); if(isset($arr['xrd']['property'])) { @@ -1564,16 +1567,19 @@ function lrdd($uri) { $headers = $a->get_curl_headers(); logger('lrdd: headers=' . $headers, LOGGER_DEBUG); - require_once('library/HTML5/Parser.php'); - $dom = @HTML5_Parser::parse($html); - - if($dom) { - $items = $dom->getElementsByTagName('link'); - foreach($items as $item) { - $x = $item->getAttribute('rel'); - if($x == "lrdd") { - $pagelink = $item->getAttribute('href'); - break; + // don't try and parse raw xml as html + if(! strstr($html,'getElementsByTagName('link'); + foreach($items as $item) { + $x = $item->getAttribute('rel'); + if($x == "lrdd") { + $pagelink = $item->getAttribute('href'); + break; + } } } } @@ -1620,9 +1626,15 @@ function lrdd($uri) { if(! function_exists('fetch_lrdd_template')) { function fetch_lrdd_template($host) { $tpl = ''; - $url = 'http://' . $host . '/.well-known/host-meta' ; - $links = fetch_xrd_links($url); -logger('template: ' . print_r($links,true)); + + $url1 = 'https://' . $host . '/.well-known/host-meta' ; + $url2 = 'http://' . $host . '/.well-known/host-meta' ; + $links = fetch_xrd_links($url1); + logger('template (https): ' . print_r($links,true)); + if(! count($links)) { + $links = fetch_xrd_links($url2); + logger('template (http): ' . print_r($links,true)); + } if(count($links)) { foreach($links as $link) if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd') @@ -1646,7 +1658,7 @@ function fetch_xrd_links($url) { return array(); logger('fetch_xrd_links: ' . $xml, LOGGER_DATA); - $h = simplexml_load_string($xml); + $h = parse_xml_string($xml); $arr = convert_xml_element_to_array($h); $links = array(); @@ -1845,10 +1857,14 @@ if(! function_exists('format_like')) { function format_like($cnt,$arr,$type,$id) { $o = ''; if($cnt == 1) - $o .= $arr[0] . (($type === 'like') ? t(' likes this.') : t(' doesn\'t like this.')) . EOL ; + $o .= (($type === 'like') ? sprintf( t('%s likes this.'), $arr[0]) : sprintf( t('%s doesn\'t like this.'), $arr[0])) . EOL ; else { - $o .= '' - . $cnt . ' ' . t('people') . ' ' . (($type === 'like') ? t('like this.') : t('don\'t like this.')) . EOL ; + $spanatts = 'class="fakelink" onclick="openClose(\'' . $type . 'list-' . $id . '\');"'; + $o .= (($type === 'like') ? + sprintf( t('%2$d people like this.'), $spanatts, $cnt) + : + sprintf( t('%2$d people don\'t like this.'), $spanatts, $cnt) ); + $o .= EOL ; $total = count($arr); if($total >= MAX_LIKERS) $arr = array_slice($arr, 0, MAX_LIKERS - 1); @@ -1856,8 +1872,8 @@ function format_like($cnt,$arr,$type,$id) { $arr[count($arr)-1] = t('and') . ' ' . $arr[count($arr)-1]; $str = implode(', ', $arr); if($total >= MAX_LIKERS) - $str .= t(', and ') . $total - MAX_LIKERS . t(' other people'); - $str .= (($type === 'like') ? t(' like this.') : t(' don\'t like this.')); + $str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS ); + $str = (($type === 'like') ? sprintf( t('%s like this.'), $str) : sprintf( t('%s don\'t like this.'), $str)); $o .= "\t" . ''; } return $o; @@ -1869,11 +1885,11 @@ function format_like($cnt,$arr,$type,$id) { if(! function_exists('load_view_file')) { function load_view_file($s) { + global $lang; + if(! isset($lang)) + $lang = 'en'; $b = basename($s); $d = dirname($s); - $lang = get_config('system','language'); - if($lang === false) - $lang = 'en'; if(file_exists("$d/$lang/$b")) return file_get_contents("$d/$lang/$b"); return file_get_contents($s); @@ -2026,7 +2042,7 @@ function contact_block() { intval($shown) ); if(count($r)) { - $o .= '

' . $total . ' ' . t('Contacts') . '

'; + $o .= '

' . sprintf( tt('%d Contact','%d Contacts', $total),$total) . '

'; foreach($r as $rr) { $redirect_url = $a->get_baseurl() . '/redir/' . $rr['id']; if(local_user() && ($rr['uid'] == local_user()) @@ -2297,9 +2313,9 @@ function profile_sidebar($profile) { $pubkey = ((x($profile,'pubkey') == 1) ? '' : ''); - $marital = ((x($profile,'marital') == 1) ? '
' . t('Status:') . ' ' . $profile['marital'] . '
' : ''); + $marital = ((x($profile,'marital') == 1) ? '
' . t('Status:') . ' ' . $profile['marital'] . '
' : ''); - $homepage = ((x($profile,'homepage') == 1) ? '
' . t('Homepage:') . ' ' . linkify($profile['homepage']) . '
' : ''); + $homepage = ((x($profile,'homepage') == 1) ? '
' . t('Homepage:') . ' ' . linkify($profile['homepage']) . '
' : ''); $tpl = load_view_file('view/profile_vcard.tpl'); @@ -2409,9 +2425,7 @@ function get_birthdays() { if(! local_user()) return $o; - $bd_format = get_config('system','birthday_format'); - if(! $bd_format) - $bd_format = 'g A l F d' ; // 8 AM Friday January 18 + $bd_format = t('g A l F d') ; // 8 AM Friday January 18 $r = q("SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event` LEFT JOIN `contact` ON `contact`.`id` = `event`.`cid` @@ -2423,11 +2437,19 @@ function get_birthdays() { ); if($r && count($r)) { - $o .= '
' . t('Birthdays this week:') . '
'; + $total = 0; + foreach($r as $rr) + if(strlen($rr['name'])) + $total ++; + + $o .= ''; + $o .= '' ; } - $o .= '
'; + $o .= ''; } return $o; @@ -2652,16 +2674,125 @@ function extract_item_authors($arr,$uid) { // pre-quoted, don't put quotes on %s if(count($urls)) { - $r = q("SELECT `id`,`url` FROM `contact` WHERE `uid` = %d AND `url` IN ( %s ) AND `network` = 'dfrn' AND `self` = 0 AND `blocked` = 0 ", + $r = q("SELECT `id`,`network`,`url` FROM `contact` WHERE `uid` = %d AND `url` IN ( %s ) AND `self` = 0 AND `blocked` = 0 ", intval($uid), implode(',',$urls) ); if(count($r)) { $ret = array(); - foreach($r as $rr) - $ret[$rr['url']] = $rr['id']; + $authors = array(); + foreach($r as $rr){ + if ($rr['network']=='dfrn') + $ret[$rr['url']] = $rr['id']; + $authors[$r['url']]= $rr; + } + $a->authors = $authors; return $ret; } } return array(); -}} \ No newline at end of file +}} + +if(! function_exists('item_photo_menu')){ +function item_photo_menu($item){ + $a = get_app(); + + if (!isset($a->authors)){ + $rr = q("SELECT `id`, `network`, `url` FROM `contact` WHERE `uid`=%d AND `self`=0 AND `blocked`=0 ", intval(local_user())); + $authors = array(); + foreach($rr as $r) $authors[$r['url']]= $r; + $a->authors = $authors; + } + + $contact_url=""; + $pm_url=""; + + $status_link=""; + $photo_link=""; + $profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); + $redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; + + // $item['contact-uid'] is only set on profile page and indicates the uid of the user who owns the profile. + + $profile_owner = ((x($item,'contact-uid')) && intval($item['contact-uid']) ? intval($item['contact-uid']) : 0); + + // So we are checking that this is a logged in user on some page that *isn't* a profile page + // OR a profile page where the viewer owns the profile. + // Then check if we can use a sparkle (redirect) link to the profile by virtue of it being our contact + // or a friend's contact that we both have a connection to. + + if((local_user() && ($profile_owner == 0)) + || ($profile_owner && $profile_owner == local_user())) { + + if(strlen($item['author-link']) && link_compare($item['author-link'],$item['url'])) + $redir = $redirect_url; + elseif(isset($a->authors[$item['author-link']])) { + $redir = $a->get_baseurl() . '/redir/' . $a->authors[$item['author-link']]['id']; + $cid = $a->authors[$item['author-link']]['id']; + } + + if($item['network'] === 'dfrn' && (! $item['self'])) { + $status_link = $redir . "?url=status"; + $profile_link = $redir . "?url=profile"; + $photos_link = $redir . "?url=photos"; + $pm_url = $a->get_baseurl() . '/message/new/' . $cid; + } + + $contact_url = $item['self']?"":$a->get_baseurl() . '/contacts/' . (($item['cid']) ? $item['cid'] : $cid); + } + + + $menu = Array( + t("View status") => $status_link, + t("View profile") => $profile_link, + t("View photos") => $photos_link, + t("Edit contact") => $contact_url, + t("Send PM") => $pm_url, + ); + + + $args = array($item, &$menu); + + call_hooks('item_photo_menu', $args); + + $o = ""; + foreach($menu as $k=>$v){ + if ($v!="") $o .= "
  • $k
  • \n"; + } + return $o; +}} + +if(! function_exists('lang_selector')) { +function lang_selector() { + global $lang; + $o .= ''; + return $o; +}} + + +if(! function_exists('parse_xml_string')) { +function parse_xml_string($s) { + if(! strstr($s,'