diff --git a/boot.php b/boot.php index be97cab757..379d1bf3da 100644 --- a/boot.php +++ b/boot.php @@ -573,6 +573,51 @@ function x($s, $k = null) } } +/** + * Return the provided variable value if it exists and is truthy or the provided + * default value instead. + * + * Works with initialized variables and potentially uninitialized array keys + * + * Usages: + * - defaults($var, $default) + * - defaults($array, 'key', $default) + * + * @brief Returns a defaut value if the provided variable or array key is falsy + * @see x() + * @return mixed + */ +function defaults() { + $args = func_get_args(); + + if (count($args) < 2) { + throw new BadFunctionCallException('defaults() requires at least 2 parameters'); + } + if (count($args) > 3) { + throw new BadFunctionCallException('defaults() cannot use more than 3 parameters'); + } + if (count($args) === 3 && !is_array($args[0])) { + throw new BadFunctionCallException('defaults($arr, $key, $def) requires an array as first parameter'); + } + if (count($args) === 3 && is_null($args[1])) { + throw new BadFunctionCallException('defaults($arr, $key, $def) $key is null'); + } + + $default = array_pop($args); + + if (call_user_func_array('x', $args)) { + if (count($args) === 1) { + $return = $args[0]; + } else { + $return = $args[0][$args[1]]; + } + } else { + $return = $default; + } + + return $return; +} + /** * @brief Returns the baseurl. * @@ -1516,14 +1561,11 @@ function argv($x) function infinite_scroll_data($module) { if (PConfig::get(local_user(), 'system', 'infinite_scroll') - && ($module == "network") && ($_GET["mode"] != "minimal") + && $module == 'network' + && defaults($_GET, 'mode', '') != 'minimal' ) { // get the page number - if (is_string($_GET["page"])) { - $pageno = $_GET["page"]; - } else { - $pageno = 1; - } + $pageno = defaults($_GET, 'page', 1); $reload_uri = ""; @@ -1534,7 +1576,8 @@ function infinite_scroll_data($module) } } - if (($a->page_offset != "") && ! strstr($reload_uri, "&offset=")) { + $a = get_app(); + if ($a->page_offset != "" && !strstr($reload_uri, "&offset=")) { $reload_uri .= "&offset=" . urlencode($a->page_offset); } diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index e1a67d432d..714d780048 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -7,7 +7,6 @@ use Friendica\Network\Probe; use League\HTMLToMarkdown\HtmlConverter; -require_once 'include/oembed.php'; require_once 'include/event.php'; require_once 'library/markdown.php'; require_once 'include/html2bbcode.php'; diff --git a/include/bbcode.php b/include/bbcode.php index be59c18072..261bdfcf66 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -2,13 +2,13 @@ use Friendica\App; use Friendica\Content\Smilies; +use Friendica\Content\OEmbed; use Friendica\Core\Cache; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Model\Contact; use Friendica\Util\Map; -require_once 'include/oembed.php'; require_once 'include/event.php'; require_once 'mod/proxy.php'; require_once 'include/plaintext.php'; @@ -232,7 +232,7 @@ function tryoembed($match) { $url = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), array("https://www.youtube.com/", "https://player.vimeo.com/"), $url); - $o = oembed_fetch_url($url); + $o = OEmbed::fetchURL($url); if (!is_object($o)) { return $match[0]; @@ -246,7 +246,7 @@ function tryoembed($match) { return $match[0]; } - $html = oembed_format_object($o); + $html = OEmbed::formatObject($o); return $html; } @@ -435,60 +435,65 @@ function bb_replace_images($body, $images) { return $newbody; } -function bb_ShareAttributes($share, $simplehtml) { +function bb_ShareAttributes($share, $simplehtml) +{ $attributes = $share[2]; $author = ""; preg_match("/author='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $author = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8'); + if (x($matches, 1)) { + $author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); + } preg_match('/author="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $author = $matches[1]; + } $profile = ""; preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $profile = $matches[1]; + } preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $profile = $matches[1]; + } $avatar = ""; preg_match("/avatar='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $avatar = $matches[1]; + } preg_match('/avatar="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $avatar = $matches[1]; + } $link = ""; preg_match("/link='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $link = $matches[1]; + } preg_match('/link="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $link = $matches[1]; + } $posted = ""; - $itemcache = get_itemcachepath(); - preg_match("/posted='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $posted = $matches[1]; + } preg_match('/posted="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $posted = $matches[1]; - - // relative dates only make sense when they aren't cached - if ($itemcache == "") - $reldate = (($posted) ? " " . relative_date($posted) : ''); + } // We only call this so that a previously unknown contact can be added. // This is important for the function "get_contact_details_by_url". @@ -497,99 +502,107 @@ function bb_ShareAttributes($share, $simplehtml) { $data = Contact::getDetailsByURL($profile); - if (isset($data["name"]) && ($data["name"] != "") && isset($data["addr"]) && ($data["addr"] != "")) - $userid_compact = $data["name"]." (".$data["addr"].")"; - else - $userid_compact = GetProfileUsername($profile,$author, true); + if (x($data, "name") && x($data, "addr")) { + $userid_compact = $data["name"] . " (" . $data["addr"] . ")"; + } else { + $userid_compact = GetProfileUsername($profile, $author, true); + } - if (isset($data["addr"]) && ($data["addr"] != "")) + if (x($data, "addr")) { $userid = $data["addr"]; - else - $userid = GetProfileUsername($profile,$author, false); + } else { + $userid = GetProfileUsername($profile, $author, false); + } - if (isset($data["name"]) && ($data["name"] != "")) + if (x($data, "name")) { $author = $data["name"]; + } - if (isset($data["micro"]) && ($data["micro"] != "")) + if (x($data, "micro")) { $avatar = $data["micro"]; + } $preshare = trim($share[1]); - if ($preshare != "") + if ($preshare != "") { $preshare .= "

"; + } switch ($simplehtml) { case 1: - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid.":
»".$share[3]."«"; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid . ":
»" . $share[3] . "«"; break; case 2: - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid_compact.":
".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; break; case 3: // Diaspora - $headline .= ''.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').$userid.':
'; + $headline .= '' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . $userid . ':
'; $text = trim($share[1]); - if ($text != "") + if ($text != "") { $text .= "
"; + } if (substr(normalise_link($link), 0, 19) != "http://twitter.com/") { - $text .= $headline.'
'.trim($share[3])."

"; + $text .= $headline . '
' . trim($share[3]) . "

"; - if ($link != "") - $text .= '
[l]'; - } else - $text .= '
'.$link.''; + if ($link != "") { + $text .= '
[l]'; + } + } else { + $text .= '
' . $link . ''; + } break; case 4: - $headline .= '
'.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $headline .= sprintf(t('%2$s %3$s'), $link, $userid, $posted); + $headline .= '
' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); + $headline .= t('%2$s %3$s', $link, $userid, $posted); $headline .= ":
"; $text = trim($share[1]); - if ($text != "") + if ($text != "") { $text .= "
"; + } - $text .= $headline.'
'.trim($share[3])."

"; + $text .= $headline . '
' . trim($share[3]) . "

"; break; case 5: - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid_compact.":
".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; break; case 6: // app.net - $text = $preshare.">> @".$userid_compact.":
".$share[3]; + $text = $preshare . ">> @" . $userid_compact . ":
" . $share[3]; break; case 7: // statusnet/GNU Social - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8')." @".$userid_compact.": ".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . " @" . $userid_compact . ": " . $share[3]; break; case 8: // twitter - $text = $preshare."RT @".$userid_compact.": ".$share[3]; + $text = $preshare . "RT @" . $userid_compact . ": " . $share[3]; break; case 9: // Google+/Facebook - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid_compact.":
".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; - if ($link != "") - $text .= "

".$link; + if ($link != "") { + $text .= "

" . $link; + } break; default: - $text = trim($share[1])."\n"; + $text = trim($share[1]) . "\n"; $avatar = proxy_url($avatar, false, PROXY_SIZE_THUMB); $tpl = get_markup_template('shared_content.tpl'); - $text .= replace_macros($tpl, - array( - '$profile' => $profile, - '$avatar' => $avatar, - '$author' => $author, - '$link' => $link, - '$posted' => $posted, - '$reldate' => $reldate, - '$content' => trim($share[3]) - ) - ); + $text .= replace_macros($tpl, array( + '$profile' => $profile, + '$avatar' => $avatar, + '$author' => $author, + '$link' => $link, + '$posted' => $posted, + '$content' => trim($share[3]) + ) + ); break; } @@ -1263,7 +1276,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); // oembed tag - $Text = oembed_bbcode2html($Text); + $Text = OEmbed::BBCode2HTML($Text); // Avoid triple linefeeds through oembed $Text = str_replace("


", "

", $Text); diff --git a/include/conversation.php b/include/conversation.php index ee68d8f5c9..958d507d78 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -545,8 +545,10 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { $profile_owner = $a->profile['profile_uid']; if (!$update) { - $tab = notags(trim($_GET['tab'])); - $tab = ( $tab ? $tab : 'posts' ); + $tab = 'posts'; + if (x($_GET, 'tab')) { + $tab = notags(trim($_GET['tab'])); + } if ($tab === 'posts') { /* * This is ugly, but we can't pass the profile_uid through the session to the ajax updater, @@ -647,20 +649,10 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { $threadsid++; - $comment = ''; $owner_url = ''; $owner_name = ''; $sparkle = ''; - if ($mode === 'search' || $mode === 'community') { - if (((activity_match($item['verb'], ACTIVITY_LIKE)) || (activity_match($item['verb'], ACTIVITY_DISLIKE))) - && ($item['id'] != $item['parent'])) - continue; - $nickname = $item['nickname']; - } else { - $nickname = $a->user['nickname']; - } - // prevent private email from leaking. if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { continue; @@ -813,7 +805,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { 'like' => '', 'dislike' => '', 'comment' => '', - //'conv' => (($preview) ? '' : array('href'=> 'display/' . $nickname . '/' . $item['id'], 'title'=> t('View in context'))), 'conv' => (($preview) ? '' : array('href'=> 'display/'.$item['guid'], 'title'=> t('View in context'))), 'previewing' => $previewing, 'wait' => t('Please wait'), @@ -1197,39 +1188,40 @@ function format_like($cnt, array $arr, $type, $id) { return $o; } -function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { +function status_editor(App $a, $x, $notes_cid = 0, $popup = false) +{ $o = ''; - $geotag = (x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : ''); + $geotag = x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : ''; $tpl = get_markup_template('jot-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array( - '$newpost' => 'true', - '$baseurl' => System::baseUrl(true), - '$geotag' => $geotag, - '$nickname' => $x['nickname'], - '$ispublic' => t('Visible to everybody'), - '$linkurl' => t('Please enter a link URL:'), - '$vidurl' => t("Please enter a video link/URL:"), - '$audurl' => t("Please enter an audio link/URL:"), - '$term' => t('Tag term:'), - '$fileas' => t('Save to Folder:'), + '$newpost' => 'true', + '$baseurl' => System::baseUrl(true), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => t('Visible to everybody'), + '$linkurl' => t('Please enter a link URL:'), + '$vidurl' => t("Please enter a video link/URL:"), + '$audurl' => t("Please enter an audio link/URL:"), + '$term' => t('Tag term:'), + '$fileas' => t('Save to Folder:'), '$whereareu' => t('Where are you right now?'), - '$delitems' => t('Delete item(s)?') + '$delitems' => t('Delete item(s)?') )); $tpl = get_markup_template('jot-end.tpl'); $a->page['end'] .= replace_macros($tpl, array( - '$newpost' => 'true', - '$baseurl' => System::baseUrl(true), - '$geotag' => $geotag, - '$nickname' => $x['nickname'], - '$ispublic' => t('Visible to everybody'), - '$linkurl' => t('Please enter a link URL:'), - '$vidurl' => t("Please enter a video link/URL:"), - '$audurl' => t("Please enter an audio link/URL:"), - '$term' => t('Tag term:'), - '$fileas' => t('Save to Folder:'), + '$newpost' => 'true', + '$baseurl' => System::baseUrl(true), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => t('Visible to everybody'), + '$linkurl' => t('Please enter a link URL:'), + '$vidurl' => t("Please enter a video link/URL:"), + '$audurl' => t("Please enter an audio link/URL:"), + '$term' => t('Tag term:'), + '$fileas' => t('Save to Folder:'), '$whereareu' => t('Where are you right now?') )); @@ -1262,57 +1254,56 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { $tpl = get_markup_template("jot.tpl"); $o .= replace_macros($tpl,array( - '$return_path' => $query_str, - '$action' => 'item', - '$share' => (x($x,'button') ? $x['button'] : t('Share')), - '$upload' => t('Upload photo'), - '$shortupload' => t('upload photo'), - '$attach' => t('Attach file'), - '$shortattach' => t('attach file'), - '$weblink' => t('Insert web link'), + '$return_path' => $query_str, + '$action' => 'item', + '$share' => defaults($x, 'button', t('Share')), + '$upload' => t('Upload photo'), + '$shortupload' => t('upload photo'), + '$attach' => t('Attach file'), + '$shortattach' => t('attach file'), + '$weblink' => t('Insert web link'), '$shortweblink' => t('web link'), - '$video' => t('Insert video link'), - '$shortvideo' => t('video link'), - '$audio' => t('Insert audio link'), - '$shortaudio' => t('audio link'), - '$setloc' => t('Set your location'), - '$shortsetloc' => t('set location'), - '$noloc' => t('Clear browser location'), - '$shortnoloc' => t('clear location'), - '$title' => $x['title'], + '$video' => t('Insert video link'), + '$shortvideo' => t('video link'), + '$audio' => t('Insert audio link'), + '$shortaudio' => t('audio link'), + '$setloc' => t('Set your location'), + '$shortsetloc' => t('set location'), + '$noloc' => t('Clear browser location'), + '$shortnoloc' => t('clear location'), + '$title' => defaults($x, 'title', ''), '$placeholdertitle' => t('Set title'), - '$category' => $x['category'], - '$placeholdercategory' => (Feature::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''), - '$wait' => t('Please wait'), - '$permset' => t('Permission settings'), + '$category' => defaults($x, 'category', ''), + '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : '', + '$wait' => t('Please wait'), + '$permset' => t('Permission settings'), '$shortpermset' => t('permissions'), - '$ptyp' => (($notes_cid) ? 'note' : 'wall'), - '$content' => $x['content'], - '$post_id' => $x['post_id'], - '$baseurl' => System::baseUrl(true), - '$defloc' => $x['default_location'], - '$visitor' => $x['visitor'], - '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']), - '$public' => t('Public post'), - '$jotnets' => $jotnets, - '$lockstate' => $x['lockstate'], - '$bang' => $x['bang'], - '$profile_uid' => $x['profile_uid'], - '$preview' => ((Feature::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''), - '$jotplugins' => $jotplugins, - '$notes_cid' => $notes_cid, - '$sourceapp' => t($a->sourcename), - '$cancel' => t('Cancel'), - '$rand_num' => random_digits(12), + '$ptyp' => $notes_cid ? 'note' : 'wall', + '$content' => defaults($x, 'content', ''), + '$post_id' => defaults($x, 'post_id', ''), + '$baseurl' => System::baseUrl(true), + '$defloc' => $x['default_location'], + '$visitor' => $x['visitor'], + '$pvisit' => $notes_cid ? 'none' : $x['visitor'], + '$public' => t('Public post'), + '$lockstate' => $x['lockstate'], + '$bang' => $x['bang'], + '$profile_uid' => $x['profile_uid'], + '$preview' => Feature::isEnabled($x['profile_uid'], 'preview') ? t('Preview') : '', + '$jotplugins' => $jotplugins, + '$notes_cid' => $notes_cid, + '$sourceapp' => t($a->sourcename), + '$cancel' => t('Cancel'), + '$rand_num' => random_digits(12), // ACL permissions box - '$acl' => $x['acl'], - '$acl_data' => $x['acl_data'], - '$group_perms' => t('Post to Groups'), + '$acl' => $x['acl'], + '$acl_data' => $x['acl_data'], + '$group_perms' => t('Post to Groups'), '$contact_perms' => t('Post to Contacts'), - '$private' => t('Private post'), - '$is_private' => $private_post, - '$public_link' => $public_post_link, + '$private' => t('Private post'), + '$is_private' => $private_post, + '$public_link' => $public_post_link, //jot nav tab (used in some themes) '$message' => t('Message'), @@ -1321,7 +1312,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { if ($popup == true) { - $o = ''; + $o = ''; } return $o; @@ -1577,9 +1568,9 @@ function get_responses($conv_responses, $response_verbs, $ob, $item) { $ret = array(); foreach ($response_verbs as $v) { $ret[$v] = array(); - $ret[$v]['count'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri']] : ''); - $ret[$v]['list'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri'] . '-l'] : ''); - $ret[$v]['self'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri'] . '-self'] : '0'); + $ret[$v]['count'] = defaults($conv_responses[$v], $item['uri'], ''); + $ret[$v]['list'] = defaults($conv_responses[$v], $item['uri'] . '-l', ''); + $ret[$v]['self'] = defaults($conv_responses[$v], $item['uri'] . '-self', '0'); if (count($ret[$v]['list']) > MAX_LIKERS) { $ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS); array_push($ret[$v]['list_part'], 'SetIntBuffer($Modulus); - $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); - $publicExponent->SetIntBuffer($PublicExponent); - $keySequenceItems = array($modulus, $publicExponent); - $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); - $keySequence->SetSequence($keySequenceItems); - //Encode bit string - $bitStringValue = $keySequence->Encode(); - $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte - $bitString = new ASNValue(ASNValue::TAG_BITSTRING); - $bitString->Value = $bitStringValue; - //Encode body - $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode(); - $body = new ASNValue(ASNValue::TAG_SEQUENCE); - $body->Value = $bodyValue; - //Get DER encoded public key: - $PublicDER = $body->Encode(); - return $PublicDER; -} - -function pkcs1_encode($Modulus, $PublicExponent) { - //Encode key sequence - $modulus = new ASNValue(ASNValue::TAG_INTEGER); - $modulus->SetIntBuffer($Modulus); - $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); - $publicExponent->SetIntBuffer($PublicExponent); - $keySequenceItems = array($modulus, $publicExponent); - $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); - $keySequence->SetSequence($keySequenceItems); - //Encode bit string - $bitStringValue = $keySequence->Encode(); - return $bitStringValue; -} - -function metopem($m, $e) { - $der = pkcs8_encode($m, $e); - $key = DerToPem($der, false); - return $key; -} - -function pubrsatome($key, &$m, &$e) -{ - require_once 'library/asn1.php'; - - $lines = explode("\n", $key); - unset($lines[0]); - unset($lines[count($lines)]); - $x = base64_decode(implode('', $lines)); - - $r = ASN_BASE::parseASNString($x); - - $m = base64url_decode($r[0]->asnData[0]->asnData); - $e = base64url_decode($r[0]->asnData[1]->asnData); -} - - -function rsatopem($key) { - pubrsatome($key, $m, $e); - return metopem($m, $e); -} - -function pemtorsa($key) { - pemtome($key, $m, $e); - return metorsa($m, $e); -} - -function pemtome($key, &$m, &$e) -{ - $lines = explode("\n", $key); - unset($lines[0]); - unset($lines[count($lines)]); - $x = base64_decode(implode('', $lines)); - - $r = ASN_BASE::parseASNString($x); - - $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData); - $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData); -} - -function metorsa($m, $e) { - $der = pkcs1_encode($m, $e); - $key = DerToRsa($der); - return $key; -} - -function salmon_key($pubkey) { - pemtome($pubkey, $m, $e); - return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true) ; -} - -function new_keypair($bits) { - $openssl_options = array( - 'digest_alg' => 'sha1', - 'private_key_bits' => $bits, - 'encrypt_key' => false - ); - - $conf = Config::get('system', 'openssl_conf_file'); - if ($conf) { - $openssl_options['config'] = $conf; - } - $result = openssl_pkey_new($openssl_options); - - if (empty($result)) { - logger('new_keypair: failed'); - return false; - } - - // Get private key - $response = array('prvkey' => '', 'pubkey' => ''); - - openssl_pkey_export($result, $response['prvkey']); - - // Get public key - $pkey = openssl_pkey_get_details($result); - $response['pubkey'] = $pkey["key"]; - - return $response; -} diff --git a/include/event.php b/include/event.php index bc9467dc80..584a707676 100644 --- a/include/event.php +++ b/include/event.php @@ -13,7 +13,7 @@ use Friendica\Util\Map; require_once 'include/bbcode.php'; require_once 'include/datetime.php'; -require_once "include/conversation.php"; +require_once 'include/conversation.php'; function format_event_html($ev, $simple = false) { if (! ((is_array($ev)) && count($ev))) { @@ -88,7 +88,7 @@ function format_event_html($ev, $simple = false) { /** * @brief Convert an array with event data to bbcode. - * + * * @param array $ev Array which conains the event data. * @return string The event as a bbcode formatted string. */ @@ -126,7 +126,7 @@ function format_event_bbcode($ev) { /** * @brief Extract bbcode formatted event data from a string * and convert it to html. - * + * * @params: string $s The string which should be parsed for event data. * @return string The html output. */ @@ -143,7 +143,7 @@ function bbtovcal($s) { /** * @brief Extract bbcode formatted event data from a string. - * + * * @params: string $s The string which should be parsed for event data. * @return array The array with the event information. */ @@ -206,10 +206,10 @@ function ev_compare($a,$b) { /** * @brief Delete an event from the event table. - * + * * Note: This function does only delete the event from the event table not its * related entry in the item table. - * + * * @param int $event_id Event ID. * @return void */ @@ -224,9 +224,9 @@ function event_delete($event_id) { /** * @brief Store the event. - * + * * Store the event in the event table and create an event item in the item table. - * + * * @param array $arr Array with event data. * @return int The event id. */ @@ -433,7 +433,7 @@ function event_store($arr) { /** * @brief Create an array with translation strings used for events. - * + * * @return array Array with translations strings. */ function get_event_strings() { @@ -564,7 +564,7 @@ function event_by_id($owner_uid = 0, $event_params, $sql_extra = '') { * string 'adjust_start' => * * @param string $sql_extra Additional sql conditions (e.g. permission request). - * + * * @return array Query results. */ function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') { @@ -626,6 +626,9 @@ function process_events($arr) { // Show edit and drop actions only if the user is the owner of the event and the event // is a real event (no bithdays). + $edit = null; + $copy = null; + $drop = null; if (local_user() && local_user() == $rr['uid'] && $rr['type'] == 'event') { $edit = ((! $rr['cid']) ? array(System::baseUrl() . '/events/event/' . $rr['id'], t('Edit event'), '', '') : null); $copy = ((! $rr['cid']) ? array(System::baseUrl() . '/events/copy/' . $rr['id'], t('Duplicate event'), '', '') : null); @@ -768,7 +771,7 @@ function event_format_export ($events, $format = 'ical', $timezone) { /** * @brief Get all events for a user ID. - * + * * The query for events is done permission sensitive. * If the user is the owner of the calendar he/she * will get all of his/her available events. @@ -922,7 +925,7 @@ function widget_events() { /** * @brief Format an item array with event data to HTML. - * + * * @param arr $item Array with item and event data. * @return string HTML output. */ @@ -1013,12 +1016,12 @@ function format_event_item($item) { /** * @brief Format a string with map bbcode to an array with location data. - * + * * Note: The string must only contain location data. A string with no bbcode will be * handled as location name. - * + * * @param string $s The string with the bbcode formatted location data. - * + * * @return array The array with the location data. * 'name' => The name of the location,
* 'address' => The address of the location,
diff --git a/include/identity.php b/include/identity.php index 9c315efbde..d78935778a 100644 --- a/include/identity.php +++ b/include/identity.php @@ -1,8 +1,8 @@ query_string, LOGGER_DEBUG); notice(t('Requested account is not available.') . EOL); $a->error = 404; return; } + if (!x($a->page, 'aside')) { + $a->page['aside'] = ''; + } + + if ($profiledata) { + $a->page['aside'] .= profile_sidebar($profiledata, true, $show_connect); + + if (!DBM::is_result($user)) { + return; + } + } + $pdata = get_profiledata_by_nick($nickname, $user[0]['uid'], $profile); if (empty($pdata) && empty($profiledata)) { @@ -73,8 +85,9 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ "SELECT `pub_keywords` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1", intval($pdata['profile_uid']) ); - if ($x && count($x)) + if ($x && count($x)) { $pdata['pub_keywords'] = $x[0]['pub_keywords']; + } } $a->profile = $pdata; @@ -83,9 +96,9 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ $a->profile['mobile-theme'] = PConfig::get($a->profile['profile_uid'], 'system', 'mobile_theme'); $a->profile['network'] = NETWORK_DFRN; - $a->page['title'] = $a->profile['name'] . " @ " . $a->config['sitename']; + $a->page['title'] = $a->profile['name'] . ' @ ' . $a->config['sitename']; - if (!$profiledata && !PConfig::get(local_user(), 'system', 'always_my_theme')) { + if (!$profiledata && !PConfig::get(local_user(), 'system', 'always_my_theme')) { $_SESSION['theme'] = $a->profile['theme']; } @@ -97,19 +110,18 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one - $theme_info_file = "view/theme/" . current_theme() . "/theme.php"; + $theme_info_file = 'view/theme/' . current_theme() . '/theme.php'; if (file_exists($theme_info_file)) { require_once $theme_info_file; } - if (! (x($a->page, 'aside'))) { + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; } if (local_user() && local_user() == $a->profile['uid'] && $profiledata) { $a->page['aside'] .= replace_macros( - get_markup_template('profile_edlink.tpl'), - array( + get_markup_template('profile_edlink.tpl'), array( '$editprofile' => t('Edit profile'), '$profid' => $a->profile['id'] ) @@ -123,19 +135,13 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ * By now, the contact block isn't shown, when a different profile is given * But: When this profile was on the same server, then we could display the contacts */ - if ($profiledata) { - $a->page['aside'] .= profile_sidebar($profiledata, true, $show_connect); - } else { + if (!$profiledata) { $a->page['aside'] .= profile_sidebar($a->profile, $block, $show_connect); } - /*if (! $block) - $a->page['aside'] .= contact_block();*/ - return; } - /** * @brief Get all profil data of a local user * @@ -144,11 +150,12 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ * Passing a non-zero profile ID can also allow a preview of a selected profile * by the owner * + * Includes all available profile data + * * @param string $nickname nick * @param int $uid uid * @param int $profile ID of the profile * @returns array - * Includes all available profile data */ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) { @@ -198,7 +205,6 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) return $r; } - /** * @brief Formats a profile for display in the sidebar. * @@ -225,28 +231,27 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $o = ''; $location = false; $address = false; - // $pdesc = true; // This function can also use contact information in $profile $is_contact = x($profile, 'cid'); - if ((! is_array($profile)) && (! count($profile))) { + if (!is_array($profile) && !count($profile)) { return $o; } - $profile['picdate'] = urlencode($profile['picdate']); + $profile['picdate'] = urlencode(defaults($profile, 'picdate', '')); - if (($profile['network'] != "") && ($profile['network'] != NETWORK_DFRN)) { + if (($profile['network'] != '') && ($profile['network'] != NETWORK_DFRN)) { $profile['network_name'] = format_network_name($profile['network'], $profile['url']); } else { - $profile['network_name'] = ""; + $profile['network_name'] = ''; } call_hooks('profile_sidebar_enter', $profile); // don't show connect link to yourself - $connect = (($profile['uid'] != local_user()) ? t('Connect') : false); + $connect = $profile['uid'] != local_user() ? t('Connect') : false; // don't show connect link to authenticated visitors either if (remote_user() && count($_SESSION['remote'])) { @@ -264,10 +269,10 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) // Is the local user already connected to that user? if ($connect && local_user()) { - if (isset($profile["url"])) { - $profile_url = normalise_link($profile["url"]); + if (isset($profile['url'])) { + $profile_url = normalise_link($profile['url']); } else { - $profile_url = normalise_link(System::baseUrl()."/profile/".$profile["nickname"]); + $profile_url = normalise_link(System::baseUrl() . '/profile/' . $profile['nickname']); } if (dba::exists('contact', array('pending' => false, 'uid' => local_user(), 'nurl' => $profile_url))) { @@ -275,21 +280,24 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) } } - if ($connect && ($profile['network'] != NETWORK_DFRN) && !isset($profile['remoteconnect'])) + if ($connect && ($profile['network'] != NETWORK_DFRN) && !isset($profile['remoteconnect'])) { $connect = false; + } $remoteconnect = null; - if (isset($profile['remoteconnect'])) + if (isset($profile['remoteconnect'])) { $remoteconnect = $profile['remoteconnect']; + } - if ($connect && ($profile['network'] == NETWORK_DFRN) && !isset($remoteconnect)) - $subscribe_feed = t("Atom feed"); - else + if ($connect && ($profile['network'] == NETWORK_DFRN) && !isset($remoteconnect)) { + $subscribe_feed = t('Atom feed'); + } else { $subscribe_feed = false; + } - if (remote_user() || (get_my_url() && $profile['unkmail'] && ($profile['uid'] != local_user()))) { + if (remote_user() || (get_my_url() && x($profile, 'unkmail') && ($profile['uid'] != local_user()))) { $wallmessage = t('Message'); - $wallmessage_link = "wallmessage/".$profile["nickname"]; + $wallmessage_link = 'wallmessage/' . $profile['nickname']; if (remote_user()) { $r = q( @@ -307,9 +315,9 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) ); } if ($r) { - $remote_url = $r[0]["url"]; - $message_path = preg_replace("=(.*)/profile/(.*)=ism", "$1/message/new/", $remote_url); - $wallmessage_link = $message_path.base64_encode($profile["addr"]); + $remote_url = $r[0]['url']; + $message_path = preg_replace('=(.*)/profile/(.*)=ism', '$1/message/new/', $remote_url); + $wallmessage_link = $message_path . base64_encode($profile['addr']); } } else { $wallmessage = false; @@ -318,7 +326,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) // show edit profile to yourself if (!$is_contact && $profile['uid'] == local_user() && Feature::isEnabled(local_user(), 'multi_profiles')) { - $profile['edit'] = array(System::baseUrl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles')); + $profile['edit'] = array(System::baseUrl() . '/profiles', t('Profiles'), '', t('Manage/edit profiles')); $r = q( "SELECT * FROM `profile` WHERE `uid` = %d", local_user() @@ -338,14 +346,14 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) 'alt' => t('Profile Image'), 'profile_name' => $rr['profile-name'], 'isdefault' => $rr['is-default'], - 'visibile_to_everybody' => t('visible to everybody'), + 'visibile_to_everybody' => t('visible to everybody'), 'edit_visibility' => t('Edit visibility'), ); } } } if (!$is_contact && $profile['uid'] == local_user() && !Feature::isEnabled(local_user(), 'multi_profiles')) { - $profile['edit'] = array(System::baseUrl(). '/profiles/'.$profile['id'], t('Edit profile'),"", t('Edit profile')); + $profile['edit'] = array(System::baseUrl() . '/profiles/' . $profile['id'], t('Edit profile'), '', t('Edit profile')); $profile['menu'] = array( 'chg_photo' => t('Change profile photo'), 'cr_new' => null, @@ -356,28 +364,23 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) // Fetch the account type $account_type = Contact::getAccountType($profile); - if ((x($profile, 'address') == 1) - || (x($profile, 'location') == 1) - || (x($profile, 'locality') == 1) - || (x($profile, 'region') == 1) - || (x($profile, 'postal-code') == 1) - || (x($profile, 'country-name') == 1) + if (x($profile, 'address') + || x($profile, 'location') + || x($profile, 'locality') + || x($profile, 'region') + || x($profile, 'postal-code') + || x($profile, 'country-name') ) { $location = t('Location:'); } - $gender = ((x($profile, 'gender') == 1) ? t('Gender:') : false); + $gender = x($profile, 'gender') ? t('Gender:') : false; + $marital = x($profile, 'marital') ? t('Status:') : false; + $homepage = x($profile, 'homepage') ? t('Homepage:') : false; + $about = x($profile, 'about') ? t('About:') : false; + $xmpp = x($profile, 'xmpp') ? t('XMPP:') : false; - - $marital = ((x($profile, 'marital') == 1) ? t('Status:') : false); - - $homepage = ((x($profile, 'homepage') == 1) ? t('Homepage:') : false); - - $about = ((x($profile, 'about') == 1) ? t('About:') : false); - - $xmpp = ((x($profile, 'xmpp') == 1) ? t('XMPP:') : false); - - if (($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) { + if ((x($profile, 'hidewall') || $block) && !local_user() && !remote_user()) { $location = $pdesc = $gender = $marital = $homepage = $about = false; } @@ -385,7 +388,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $firstname = $split_name['first']; $lastname = $split_name['last']; - if ($profile['guid'] != "") { + if (x($profile, 'guid')) { $diaspora = array( 'guid' => $profile['guid'], 'podloc' => System::baseUrl(), @@ -402,6 +405,9 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $diaspora = false; } + $contact_block = ''; + $updated = ''; + $contacts = 0; if (!$block) { $contact_block = contact_block(); @@ -411,7 +417,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) intval($a->profile['uid']) ); if (DBM::is_result($r)) { - $updated = date("c", strtotime($r[0]['updated'])); + $updated = date('c', strtotime($r[0]['updated'])); } $r = q( @@ -437,45 +443,41 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $p[$k] = $v; } - if (isset($p["about"])) { - $p["about"] = bbcode($p["about"]); + if (isset($p['about'])) { + $p['about'] = bbcode($p['about']); } - if (isset($p["address"])) { - $p["address"] = bbcode($p["address"]); + if (isset($p['address'])) { + $p['address'] = bbcode($p['address']); } else { - $p["address"] = bbcode($p["location"]); + $p['address'] = bbcode($p['location']); } - if (isset($p["photo"])) { - $p["photo"] = proxy_url($p["photo"], false, PROXY_SIZE_SMALL); + if (isset($p['photo'])) { + $p['photo'] = proxy_url($p['photo'], false, PROXY_SIZE_SMALL); } $tpl = get_markup_template('profile_vcard.tpl'); - $o .= replace_macros( - $tpl, - array( + $o .= replace_macros($tpl, array( '$profile' => $p, '$xmpp' => $xmpp, - '$connect' => $connect, - '$remoteconnect' => $remoteconnect, + '$connect' => $connect, + '$remoteconnect' => $remoteconnect, '$subscribe_feed' => $subscribe_feed, '$wallmessage' => $wallmessage, '$wallmessage_link' => $wallmessage_link, '$account_type' => $account_type, '$location' => $location, - '$gender' => $gender, - // '$pdesc' => $pdesc, - '$marital' => $marital, + '$gender' => $gender, + '$marital' => $marital, '$homepage' => $homepage, '$about' => $about, - '$network' => t('Network:'), + '$network' => t('Network:'), '$contacts' => $contacts, '$updated' => $updated, '$diaspora' => $diaspora, '$contact_block' => $contact_block, - ) - ); + )); $arr = array('profile' => &$profile, 'entry' => &$o); @@ -484,27 +486,26 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) return $o; } - function get_birthdays() { $a = get_app(); $o = ''; - if (! local_user() || $a->is_mobile || $a->is_tablet) { + if (!local_user() || $a->is_mobile || $a->is_tablet) { return $o; } /* * $mobile_detect = new Mobile_Detect(); * $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); - * if ($is_mobile) - * return $o; + * if ($is_mobile) + * return $o; */ $bd_format = t('g A l F d'); // 8 AM Friday January 18 $bd_short = t('F d'); - $cachekey = "get_birthdays:".local_user(); + $cachekey = 'get_birthdays:' . local_user(); $r = Cache::get($cachekey); if (is_null($r)) { $s = dba::p( @@ -538,7 +539,7 @@ function get_birthdays() $classtoday = $istoday ? ' birthday-today ' : ''; if ($total) { foreach ($r as &$rr) { - if (! strlen($rr['name'])) { + if (!strlen($rr['name'])) { continue; } @@ -553,54 +554,50 @@ function get_birthdays() $sparkle = ''; $url = $rr['url']; if ($rr['network'] === NETWORK_DFRN) { - $sparkle = " sparkle"; - $url = System::baseUrl() . '/redir/' . $rr['cid']; + $sparkle = ' sparkle'; + $url = System::baseUrl() . '/redir/' . $rr['cid']; } $rr['link'] = $url; $rr['title'] = $rr['name']; - $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : ''); + $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : ''); $rr['startime'] = null; $rr['today'] = $today; } } } - $tpl = get_markup_template("birthdays_reminder.tpl"); - return replace_macros( - $tpl, - array( + $tpl = get_markup_template('birthdays_reminder.tpl'); + return replace_macros($tpl, array( '$baseurl' => System::baseUrl(), '$classtoday' => $classtoday, '$count' => $total, '$event_reminders' => t('Birthday Reminders'), '$event_title' => t('Birthdays this week:'), '$events' => $r, - '$lbr' => '{', // raw brackets mess up if/endif macro processing + '$lbr' => '{', // raw brackets mess up if/endif macro processing '$rbr' => '}' - ) - ); + )); } - function get_events() { require_once 'include/bbcode.php'; $a = get_app(); - if (! local_user() || $a->is_mobile || $a->is_tablet) { + if (!local_user() || $a->is_mobile || $a->is_tablet) { return $o; } /* - * $mobile_detect = new Mobile_Detect(); - * $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); - * if ($is_mobile) - * return $o; + * $mobile_detect = new Mobile_Detect(); + * $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); + * if ($is_mobile) + * return $o; */ $bd_format = t('g A l F d'); // 8 AM Friday January 18 - $bd_short = t('F d'); + $classtoday = ''; $s = dba::p( "SELECT `event`.* FROM `event` @@ -614,7 +611,6 @@ function get_events() $r = array(); if (DBM::is_result($s)) { - $now = strtotime('now'); $istoday = false; while ($rr = dba::fetch($s)) { @@ -634,7 +630,7 @@ function get_events() } $description = substr(strip_tags(bbcode($rr['desc'])), 0, 32) . '... '; - if (! $description) { + if (!$description) { $description = t('[No description]'); } @@ -647,8 +643,8 @@ function get_events() $today = ((substr($strt, 0, 10) === datetime_convert('UTC', $a->timezone, 'now', 'Y-m-d')) ? true : false); $rr['title'] = $title; - $rr['description'] = $desciption; - $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : ''); + $rr['description'] = $description; + $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : ''); $rr['startime'] = $strt; $rr['today'] = $today; @@ -657,18 +653,15 @@ function get_events() dba::close($s); $classtoday = (($istoday) ? 'event-today' : ''); } - $tpl = get_markup_template("events_reminder.tpl"); - return replace_macros( - $tpl, - array( + $tpl = get_markup_template('events_reminder.tpl'); + return replace_macros($tpl, array( '$baseurl' => System::baseUrl(), '$classtoday' => $classtoday, '$count' => count($r), '$event_reminders' => t('Event Reminders'), '$event_title' => t('Events this week:'), '$events' => $r, - ) - ); + )); } function advanced_profile(App $a) @@ -677,9 +670,8 @@ function advanced_profile(App $a) $uid = $a->profile['uid']; $o .= replace_macros( - get_markup_template('section_title.tpl'), - array( - '$title' => t('Profile') + get_markup_template('section_title.tpl'), array( + '$title' => t('Profile') ) ); @@ -688,32 +680,32 @@ function advanced_profile(App $a) $profile = array(); - $profile['fullname'] = array( t('Full Name:'), $a->profile['name'] ) ; + $profile['fullname'] = array(t('Full Name:'), $a->profile['name']); if ($a->profile['gender']) { - $profile['gender'] = array( t('Gender:'), $a->profile['gender'] ); + $profile['gender'] = array(t('Gender:'), $a->profile['gender']); } if (($a->profile['dob']) && ($a->profile['dob'] > '0001-01-01')) { $year_bd_format = t('j F, Y'); $short_bd_format = t('j F'); + $val = intval($a->profile['dob']) ? + day_translate(datetime_convert('UTC', 'UTC', $a->profile['dob'] . ' 00:00 +00:00', $year_bd_format)) + : day_translate(datetime_convert('UTC', 'UTC', '2001-' . substr($a->profile['dob'], 5) . ' 00:00 +00:00', $short_bd_format)); - $val = ((intval($a->profile['dob'])) - ? day_translate(datetime_convert('UTC', 'UTC', $a->profile['dob'] . ' 00:00 +00:00', $year_bd_format)) - : day_translate(datetime_convert('UTC', 'UTC', '2001-' . substr($a->profile['dob'], 5) . ' 00:00 +00:00', $short_bd_format))); - - $profile['birthday'] = array( t('Birthday:'), $val); + $profile['birthday'] = array(t('Birthday:'), $val); } + if (!empty($a->profile['dob']) && $a->profile['dob'] > '0001-01-01' && $age = age($a->profile['dob'], $a->profile['timezone'], '') ) { - $profile['age'] = array( t('Age:'), $age ); + $profile['age'] = array(t('Age:'), $age); } if ($a->profile['marital']) { - $profile['marital'] = array( t('Status:'), $a->profile['marital']); + $profile['marital'] = array(t('Status:'), $a->profile['marital']); } /// @TODO Maybe use x() here, plus below? @@ -726,95 +718,92 @@ function advanced_profile(App $a) } if ($a->profile['sexual']) { - $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] ); + $profile['sexual'] = array(t('Sexual Preference:'), $a->profile['sexual']); } if ($a->profile['homepage']) { - $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) ); + $profile['homepage'] = array(t('Homepage:'), linkify($a->profile['homepage'])); } if ($a->profile['hometown']) { - $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) ); + $profile['hometown'] = array(t('Hometown:'), linkify($a->profile['hometown'])); } if ($a->profile['pub_keywords']) { - $profile['pub_keywords'] = array( t('Tags:'), $a->profile['pub_keywords']); + $profile['pub_keywords'] = array(t('Tags:'), $a->profile['pub_keywords']); } if ($a->profile['politic']) { - $profile['politic'] = array( t('Political Views:'), $a->profile['politic']); + $profile['politic'] = array(t('Political Views:'), $a->profile['politic']); } if ($a->profile['religion']) { - $profile['religion'] = array( t('Religion:'), $a->profile['religion']); + $profile['religion'] = array(t('Religion:'), $a->profile['religion']); } if ($txt = prepare_text($a->profile['about'])) { - $profile['about'] = array( t('About:'), $txt ); + $profile['about'] = array(t('About:'), $txt); } if ($txt = prepare_text($a->profile['interest'])) { - $profile['interest'] = array( t('Hobbies/Interests:'), $txt); + $profile['interest'] = array(t('Hobbies/Interests:'), $txt); } if ($txt = prepare_text($a->profile['likes'])) { - $profile['likes'] = array( t('Likes:'), $txt); + $profile['likes'] = array(t('Likes:'), $txt); } if ($txt = prepare_text($a->profile['dislikes'])) { - $profile['dislikes'] = array( t('Dislikes:'), $txt); + $profile['dislikes'] = array(t('Dislikes:'), $txt); } if ($txt = prepare_text($a->profile['contact'])) { - $profile['contact'] = array( t('Contact information and Social Networks:'), $txt); + $profile['contact'] = array(t('Contact information and Social Networks:'), $txt); } if ($txt = prepare_text($a->profile['music'])) { - $profile['music'] = array( t('Musical interests:'), $txt); + $profile['music'] = array(t('Musical interests:'), $txt); } if ($txt = prepare_text($a->profile['book'])) { - $profile['book'] = array( t('Books, literature:'), $txt); + $profile['book'] = array(t('Books, literature:'), $txt); } if ($txt = prepare_text($a->profile['tv'])) { - $profile['tv'] = array( t('Television:'), $txt); + $profile['tv'] = array(t('Television:'), $txt); } if ($txt = prepare_text($a->profile['film'])) { - $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt); + $profile['film'] = array(t('Film/dance/culture/entertainment:'), $txt); } if ($txt = prepare_text($a->profile['romance'])) { - $profile['romance'] = array( t('Love/Romance:'), $txt); + $profile['romance'] = array(t('Love/Romance:'), $txt); } if ($txt = prepare_text($a->profile['work'])) { - $profile['work'] = array( t('Work/employment:'), $txt); + $profile['work'] = array(t('Work/employment:'), $txt); } if ($txt = prepare_text($a->profile['education'])) { - $profile['education'] = array( t('School/education:'), $txt ); + $profile['education'] = array(t('School/education:'), $txt); } //show subcribed forum if it is enabled in the usersettings if (Feature::isEnabled($uid, 'forumlist_profile')) { - $profile['forumlist'] = array( t('Forums:'), ForumManager::profileAdvanced($uid)); + $profile['forumlist'] = array(t('Forums:'), ForumManager::profileAdvanced($uid)); } if ($a->profile['uid'] == local_user()) { - $profile['edit'] = array(System::baseUrl(). '/profiles/'.$a->profile['id'], t('Edit profile'),"", t('Edit profile')); + $profile['edit'] = array(System::baseUrl() . '/profiles/' . $a->profile['id'], t('Edit profile'), '', t('Edit profile')); } - return replace_macros( - $tpl, - array( + return replace_macros($tpl, array( '$title' => t('Profile'), '$basic' => t('Basic'), '$advanced' => t('Advanced'), '$profile' => $profile - ) - ); + )); } return ''; @@ -822,12 +811,11 @@ function advanced_profile(App $a) function profile_tabs($a, $is_owner = false, $nickname = null) { - //echo "
"; var_dump($a->user); killme();
-
 	if (is_null($nickname)) {
-		$nickname  = $a->user['nickname'];
+		$nickname = $a->user['nickname'];
 	}
 
+	$tab = false;
 	if (x($_GET, 'tab')) {
 		$tab = notags(trim($_GET['tab']));
 	}
@@ -836,85 +824,85 @@ function profile_tabs($a, $is_owner = false, $nickname = null)
 
 	$tabs = array(
 		array(
-			'label'=>t('Status'),
-			'url' => $url,
-			'sel' => ((!isset($tab) && $a->argv[0]=='profile') ? 'active' : ''),
+			'label' => t('Status'),
+			'url'   => $url,
+			'sel'   => !$tab && $a->argv[0] == 'profile' ? 'active' : '',
 			'title' => t('Status Messages and Posts'),
-			'id' => 'status-tab',
+			'id'    => 'status-tab',
 			'accesskey' => 'm',
 		),
 		array(
 			'label' => t('Profile'),
-			'url' 	=> $url.'/?tab=profile',
-			'sel'	=> ((isset($tab) && $tab=='profile') ? 'active' : ''),
+			'url'   => $url . '/?tab=profile',
+			'sel'   => $tab == 'profile' ? 'active' : '',
 			'title' => t('Profile Details'),
-			'id' => 'profile-tab',
+			'id'    => 'profile-tab',
 			'accesskey' => 'r',
 		),
 		array(
 			'label' => t('Photos'),
-			'url'	=> System::baseUrl() . '/photos/' . $nickname,
-			'sel'	=> ((!isset($tab) && $a->argv[0]=='photos') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/photos/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'photos' ? 'active' : '',
 			'title' => t('Photo Albums'),
-			'id' => 'photo-tab',
+			'id'    => 'photo-tab',
 			'accesskey' => 'h',
 		),
 		array(
 			'label' => t('Videos'),
-			'url'	=> System::baseUrl() . '/videos/' . $nickname,
-			'sel'	=> ((!isset($tab) && $a->argv[0]=='videos') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/videos/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'videos' ? 'active' : '',
 			'title' => t('Videos'),
-			'id' => 'video-tab',
+			'id'    => 'video-tab',
 			'accesskey' => 'v',
 		),
 	);
 
 	// the calendar link for the full featured events calendar
 	if ($is_owner && $a->theme_events_in_profile) {
-			$tabs[] = array(
-				'label' => t('Events'),
-				'url'	=> System::baseUrl() . '/events',
-				'sel' 	=>((!isset($tab) && $a->argv[0]=='events') ? 'active' : ''),
-				'title' => t('Events and Calendar'),
-				'id' => 'events-tab',
-				'accesskey' => 'e',
-			);
+		$tabs[] = array(
+			'label' => t('Events'),
+			'url'   => System::baseUrl() . '/events',
+			'sel'   => !$tab && $a->argv[0] == 'events' ? 'active' : '',
+			'title' => t('Events and Calendar'),
+			'id'    => 'events-tab',
+			'accesskey' => 'e',
+		);
 		// if the user is not the owner of the calendar we only show a calendar
 		// with the public events of the calendar owner
-	} elseif (! $is_owner) {
+	} elseif (!$is_owner) {
 		$tabs[] = array(
-				'label' => t('Events'),
-				'url'	=> System::baseUrl() . '/cal/' . $nickname,
-				'sel' 	=>((!isset($tab) && $a->argv[0]=='cal') ? 'active' : ''),
-				'title' => t('Events and Calendar'),
-				'id' => 'events-tab',
-				'accesskey' => 'e',
-			);
+			'label' => t('Events'),
+			'url'   => System::baseUrl() . '/cal/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'cal' ? 'active' : '',
+			'title' => t('Events and Calendar'),
+			'id'    => 'events-tab',
+			'accesskey' => 'e',
+		);
 	}
 
 	if ($is_owner) {
 		$tabs[] = array(
 			'label' => t('Personal Notes'),
-			'url'	=> System::baseUrl() . '/notes',
-			'sel' 	=>((!isset($tab) && $a->argv[0]=='notes') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/notes',
+			'sel'   => !$tab && $a->argv[0] == 'notes' ? 'active' : '',
 			'title' => t('Only You Can See This'),
-			'id' => 'notes-tab',
+			'id'    => 'notes-tab',
 			'accesskey' => 't',
 		);
 	}
 
-	if ((! $is_owner) && ((count($a->profile)) || (! $a->profile['hide-friends']))) {
+	if ((!$is_owner) && ((count($a->profile)) || (!$a->profile['hide-friends']))) {
 		$tabs[] = array(
 			'label' => t('Contacts'),
-			'url'	=> System::baseUrl() . '/viewcontacts/' . $nickname,
-			'sel'	=> ((!isset($tab) && $a->argv[0]=='viewcontacts') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/viewcontacts/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'viewcontacts' ? 'active' : '',
 			'title' => t('Contacts'),
-			'id' => 'viewcontacts-tab',
+			'id'    => 'viewcontacts-tab',
 			'accesskey' => 'k',
 		);
 	}
 
-	$arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
+	$arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $tab, 'tabs' => $tabs);
 	call_hooks('profile_tabs', $arr);
 
 	$tpl = get_markup_template('common_tabs.tpl');
@@ -939,9 +927,9 @@ function zrl_init(App $a)
 		// The check fetches the cached value from gprobe to reduce the load for this system
 		$urlparts = parse_url($my_url);
 
-		$result = Cache::get("gprobe:" . $urlparts["host"]);
-		if ((!is_null($result)) && (in_array($result["network"], array(NETWORK_FEED, NETWORK_PHANTOM)))) {
-			logger("DDoS attempt detected for " . $urlparts["host"] . " by " . $_SERVER["REMOTE_ADDR"] . ". server data: " . print_r($_SERVER, true), LOGGER_DEBUG);
+		$result = Cache::get('gprobe:' . $urlparts['host']);
+		if ((!is_null($result)) && (in_array($result['network'], array(NETWORK_FEED, NETWORK_PHANTOM)))) {
+			logger('DDoS attempt detected for ' . $urlparts['host'] . ' by ' . $_SERVER['REMOTE_ADDR'] . '. server data: ' . print_r($_SERVER, true), LOGGER_DEBUG);
 			return;
 		}
 
@@ -953,10 +941,10 @@ function zrl_init(App $a)
 
 function zrl($s, $force = false)
 {
-	if (! strlen($s)) {
+	if (!strlen($s)) {
 		return $s;
 	}
-	if ((! strpos($s, '/profile/')) && (! $force)) {
+	if ((!strpos($s, '/profile/')) && (!$force)) {
 		return $s;
 	}
 	if ($force && substr($s, -1, 1) !== '/') {
@@ -964,7 +952,7 @@ function zrl($s, $force = false)
 	}
 	$achar = strpos($s, '?') ? '&' : '?';
 	$mine = get_my_url();
-	if ($mine && ! link_compare($mine, $s)) {
+	if ($mine && !link_compare($mine, $s)) {
 		return $s . $achar . 'zrl=' . urlencode($mine);
 	}
 	return $s;
@@ -987,7 +975,7 @@ function zrl($s, $force = false)
 function get_theme_uid()
 {
 	$uid = ((!empty($_REQUEST['puid'])) ? intval($_REQUEST['puid']) : 0);
-	if ((local_user()) && ((PConfig::get(local_user(), 'system', 'always_my_theme')) || (! $uid))) {
+	if ((local_user()) && ((PConfig::get(local_user(), 'system', 'always_my_theme')) || (!$uid))) {
 		return local_user();
 	}
 
diff --git a/include/items.php b/include/items.php
index 275052c1fd..8f15f94799 100644
--- a/include/items.php
+++ b/include/items.php
@@ -20,8 +20,6 @@ use Friendica\Protocol\OStatus;
 use Friendica\Protocol\Feed;
 
 require_once 'include/bbcode.php';
-require_once 'include/oembed.php';
-require_once 'include/crypto.php';
 require_once 'include/tags.php';
 require_once 'include/files.php';
 require_once 'include/text.php';
@@ -423,7 +421,7 @@ function uri_to_guid($uri, $host = "") {
  * @return array Item array with removed conversation data
  */
 function store_conversation($arr) {
-	if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)) && !empty($arr['uri'])) {
+	if (in_array(defaults($arr, 'network', NETWORK_PHANTOM), array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)) && !empty($arr['uri'])) {
 		$conversation = array('item-uri' => $arr['uri'], 'received' => DBM::date());
 
 		if (isset($arr['parent-uri']) && ($arr['parent-uri'] != $arr['uri'])) {
@@ -481,8 +479,8 @@ function store_conversation($arr) {
 }
 
 /// @TODO add type-hint array
-function item_store($arr, $force_parent = false, $notify = false, $dontcache = false) {
-
+function item_store($arr, $force_parent = false, $notify = false, $dontcache = false)
+{
 	$a = get_app();
 
 	// If it is a posting where users should get notifications, then define it as wall posting
@@ -504,6 +502,8 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 				$arr['guid'] = uri_to_guid($arr['uri'], $a->get_hostname());
 			}
 		}
+	} else {
+		$arr['network'] = trim(defaults($arr, 'network', NETWORK_PHANTOM));
 	}
 
 	if ($notify) {
@@ -583,7 +583,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 	 * We have to check several networks since Friendica posts could be repeated
 	 * via OStatus (maybe Diasporsa as well)
 	 */
-	if (in_array(trim($arr['network']), array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
+	if (in_array($arr['network'], array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
 		$r = q("SELECT `id`, `network` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` IN ('%s', '%s', '%s')  LIMIT 1",
 				dbesc(trim($arr['uri'])),
 				intval($uid),
@@ -646,7 +646,6 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 	$arr['attach']        = ((x($arr, 'attach'))        ? notags(trim($arr['attach']))        : '');
 	$arr['app']           = ((x($arr, 'app'))           ? notags(trim($arr['app']))           : '');
 	$arr['origin']        = ((x($arr, 'origin'))        ? intval($arr['origin'])              : 0 );
-	$arr['network']       = ((x($arr, 'network'))       ? trim($arr['network'])               : '');
 	$arr['postopts']      = ((x($arr, 'postopts'))      ? trim($arr['postopts'])              : '');
 	$arr['resource-id']   = ((x($arr, 'resource-id'))   ? trim($arr['resource-id'])           : '');
 	$arr['event-id']      = ((x($arr, 'event-id'))      ? intval($arr['event-id'])            : 0 );
@@ -676,18 +675,19 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 		$arr['plink'] = System::baseUrl() . '/display/' . urlencode($arr['guid']);
 	}
 
-	if ($arr['network'] == "") {
+	if ($arr['network'] == NETWORK_PHANTOM) {
 		$r = q("SELECT `network` FROM `contact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
 			dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
 			dbesc(normalise_link($arr['author-link'])),
 			intval($arr['uid'])
 		);
 
-		if (!DBM::is_result($r))
+		if (!DBM::is_result($r)) {
 			$r = q("SELECT `network` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' LIMIT 1",
 				dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
 				dbesc(normalise_link($arr['author-link']))
 			);
+		}
 
 		if (!DBM::is_result($r)) {
 			$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
@@ -735,7 +735,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 		logger("Contact-id was missing for post ".$arr["guid"]." from user id ".$uid." - now set to ".$arr["contact-id"], LOGGER_DEBUG);
 	}
 
-	if ($arr["gcontact-id"] == 0) {
+	if (!x($arr, "gcontact-id")) {
 		/*
 		 * The gcontact should mostly behave like the contact. But is is supposed to be global for the system.
 		 * This means that wall posts, repeated posts, etc. should have the gcontact id of the owner.
diff --git a/include/oembed.php b/include/oembed.php
deleted file mode 100644
index b7c1616fee..0000000000
--- a/include/oembed.php
+++ /dev/null
@@ -1,317 +0,0 @@
- normalise_link($embedurl));
-	$r = dba::select('oembed', array('content'), $condition, array('limit' => 1));
-
-	if (DBM::is_result($r)) {
-		$txt = $r["content"];
-	} else {
-		$txt = Cache::get($a->videowidth . $embedurl);
-	}
-	// These media files should now be caught in bbcode.php
-	// left here as a fallback in case this is called from another source
-
-	$noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm");
-	$ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION);
-
-
-	if (is_null($txt)) {
-		$txt = "";
-
-		if (!in_array($ext, $noexts)){
-			// try oembed autodiscovery
-			$redirects = 0;
-			$html_text = fetch_url($embedurl, false, $redirects, 15, "text/*");
-			if ($html_text) {
-				$dom = @DOMDocument::loadHTML($html_text);
-				if ($dom) {
-					$xpath = new DOMXPath($dom);
-					$attr = "oembed";
-					$xattr = oe_build_xpath("class","oembed");
-					$entries = $xpath->query("//link[@type='application/json+oembed']");
-					foreach ($entries as $e) {
-						$href = $e->getAttributeNode("href")->nodeValue;
-						$txt = fetch_url($href . '&maxwidth=' . $a->videowidth);
-						break;
-					}
-					$entries = $xpath->query("//link[@type='text/json+oembed']");
-					foreach ($entries as $e) {
-						$href = $e->getAttributeNode("href")->nodeValue;
-						$txt = fetch_url($href . '&maxwidth=' . $a->videowidth);
-						break;
-					}
-				}
-			}
-		}
-
-		$txt = trim($txt);
-
-		if ($txt[0] != "{") {
-			$txt = '{"type":"error"}';
-		} else {	//save in cache
-			$j = json_decode($txt);
-			if ($j->type != "error") {
-				dba::insert('oembed', array('url' => normalise_link($embedurl),
-							'content' => $txt, 'created' => datetime_convert()), true);
-			}
-
-			Cache::set($a->videowidth.$embedurl, $txt, CACHE_DAY);
-		}
-	}
-
-	$j = json_decode($txt);
-
-	if (!is_object($j)) {
-		return false;
-	}
-
-	// Always embed the SSL version
-	if (isset($j->html)) {
-		$j->html = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"),
-			array("https://www.youtube.com/", "https://player.vimeo.com/"), $j->html);
-	}
-
-	$j->embedurl = $embedurl;
-
-	// If fetching information doesn't work, then improve via internal functions
-	if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) {
-		$data = ParseUrl::getSiteinfoCached($embedurl, true, false);
-		$j->type = $data["type"];
-
-		if ($j->type == "photo") {
-			$j->url = $data["url"];
-			//$j->width = $data["images"][0]["width"];
-			//$j->height = $data["images"][0]["height"];
-		}
-
-		if (isset($data["title"])) {
-			$j->title = $data["title"];
-		}
-
-		if (isset($data["text"])) {
-			$j->description = $data["text"];
-		}
-
-		if (is_array($data["images"])) {
-			$j->thumbnail_url = $data["images"][0]["src"];
-			$j->thumbnail_width = $data["images"][0]["width"];
-			$j->thumbnail_height = $data["images"][0]["height"];
-		}
-	}
-
-	call_hooks('oembed_fetch_url', $embedurl, $j);
-
-	return $j;
-}
-
-function oembed_format_object($j){
-	require_once("mod/proxy.php");
-
-	$embedurl = $j->embedurl;
-	$jhtml = oembed_iframe($j->embedurl,(isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null) );
-	$ret="";
-	switch ($j->type) {
-		case "video":
-			if (isset($j->thumbnail_url)) {
-				$tw = (isset($j->thumbnail_width) && intval($j->thumbnail_width)) ? $j->thumbnail_width:200;
-				$th = (isset($j->thumbnail_height) && intval($j->thumbnail_height)) ? $j->thumbnail_height:180;
-				// make sure we don't attempt divide by zero, fallback is a 1:1 ratio
-				$tr = (($th) ? $tw/$th : 1);
-
-				$th=120; $tw = $th*$tr;
-				$tpl=get_markup_template('oembed_video.tpl');
-				$ret.=replace_macros($tpl, array(
-					'$baseurl'     => System::baseUrl(),
-					'$embedurl'    => $embedurl,
-					'$escapedhtml' => base64_encode($jhtml),
-					'$tw'          => $tw,
-					'$th'          => $th,
-					'$turl'        => $j->thumbnail_url,
-				));
-
-			} else {
-				$ret=$jhtml;
-			}
-			//$ret.="
"; - break; - case "photo": - $ret.= ""; - break; - case "link": - break; - case "rich": - // not so safe.. - if (!Config::get("system","no_oembed_rich_content")) { - $ret.= proxy_parse_html($jhtml); - } - break; - } - - // add link to source if not present in "rich" type - if ($j->type!='rich' || !strpos($j->html,$embedurl) ){ - $ret .= "

"; - if (isset($j->title)) { - if (isset($j->provider_name)) { - $ret .= $j->provider_name.": "; - } - - $embedlink = (isset($j->title))?$j->title:$embedurl; - $ret .= "$embedlink"; - if (isset($j->author_name)) { - $ret.=" (".$j->author_name.")"; - } - } elseif (isset($j->provider_name) || isset($j->author_name)) { - $embedlink = ""; - if (isset($j->provider_name)) { - $embedlink .= $j->provider_name; - } - - if (isset($j->author_name)) { - if ($embedlink != "") { - $embedlink .= ": "; - } - - $embedlink .= $j->author_name; - } - if (trim($embedlink) == "") { - $embedlink = $embedurl; - } - - $ret .= "$embedlink"; - } - //if (isset($j->author_name)) $ret.=" by ".$j->author_name; - //if (isset($j->provider_name)) $ret.=" on ".$j->provider_name; - $ret .= "

"; - } else { - // add for html2bbcode conversion - $ret .= "$embedurl"; - } - $ret.=""; - $ret = str_replace("\n","",$ret); - return mb_convert_encoding($ret, 'HTML-ENTITIES', mb_detect_encoding($ret)); -} - -/** - * @brief Generates the iframe HTML for an oembed attachment. - * - * Width and height are given by the remote, and are regularly too small for - * the generated iframe. - * - * The width is entirely discarded for the actual width of the post, while fixed - * height is used as a starting point before the inevitable resizing. - * - * Since the iframe is automatically resized on load, there are no need for ugly - * and impractical scrollbars. - * - * @param string $src Original remote URL to embed - * @param string $width - * @param string $height - * @return string formatted HTML - * - * @see oembed_format_object() - */ -function oembed_iframe($src, $width, $height) { - $a = get_app(); - - if (!$height || strstr($height,'%')) { - $height = '200'; - } - $width = '100%'; - - $s = System::baseUrl() . '/oembed/' . base64url_encode($src); - return ''; -} - - - -function oembed_bbcode2html($text){ - $stopoembed = Config::get("system","no_oembed"); - if ($stopoembed == true){ - return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "". t('Embedding disabled') ." : $1" ,$text); - } - return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", 'oembed_replacecb' ,$text); -} - - -function oe_build_xpath($attr, $value){ - // http://westhoffswelt.de/blog/0036_xpath_to_select_html_by_class.html - return "contains( normalize-space( @$attr ), ' $value ' ) or substring( normalize-space( @$attr ), 1, string-length( '$value' ) + 1 ) = '$value ' or substring( normalize-space( @$attr ), string-length( @$attr ) - string-length( '$value' ) ) = ' $value' or @$attr = '$value'"; -} - -function oe_get_inner_html($node) { - $innerHTML= ''; - $children = $node->childNodes; - foreach ($children as $child) { - $innerHTML .= $child->ownerDocument->saveXML($child); - } - return $innerHTML; -} - -/** - * Find .... - * and replace it with [embed]url[/embed] - */ -function oembed_html2bbcode($text) { - // start parser only if 'oembed' is in text - if (strpos($text, "oembed")) { - - // convert non ascii chars to html entities - $html_text = mb_convert_encoding($text, 'HTML-ENTITIES', mb_detect_encoding($text)); - - // If it doesn't parse at all, just return the text. - $dom = @DOMDocument::loadHTML($html_text); - if (! $dom) { - return $text; - } - $xpath = new DOMXPath($dom); - $attr = "oembed"; - - $xattr = oe_build_xpath("class","oembed"); - $entries = $xpath->query("//span[$xattr]"); - - $xattr = "@rel='oembed'";//oe_build_xpath("rel","oembed"); - foreach ($entries as $e) { - $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue; - if (!is_null($href)) { - $e->parentNode->replaceChild(new DOMText("[embed]".$href."[/embed]"), $e); - } - } - return oe_get_inner_html( $dom->getElementsByTagName("body")->item(0) ); - } else { - return $text; - } -} diff --git a/include/tags.php b/include/tags.php index 8d8fb76559..584ed30e5b 100644 --- a/include/tags.php +++ b/include/tags.php @@ -1,4 +1,5 @@ $link) { + $pattern = '/\W([\#@])\[url\=(.*?)\](.*?)\[\/url\]/ism'; + if (preg_match_all($pattern, $data, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $tags[$match[1] . strtolower(trim($match[3], ',.:;[]/\"?!'))] = $match[2]; + } + } - if (substr(trim($tag), 0, 1) == "#") { + foreach ($tags as $tag => $link) { + if (substr(trim($tag), 0, 1) == '#') { // try to ignore #039 or #1 or anything like that - if (ctype_digit(substr(trim($tag),1))) + if (ctype_digit(substr(trim($tag), 1))) continue; // try to ignore html hex escapes, e.g. #x2317 - if ((substr(trim($tag),1,1) == 'x' || substr(trim($tag),1,1) == 'X') && ctype_digit(substr(trim($tag),2))) + if ((substr(trim($tag), 1, 1) == 'x' || substr(trim($tag), 1, 1) == 'X') && ctype_digit(substr(trim($tag), 2))) continue; $type = TERM_HASHTAG; $term = substr($tag, 1); - } elseif (substr(trim($tag), 0, 1) == "@") { + } elseif (substr(trim($tag), 0, 1) == '@') { $type = TERM_MENTION; $term = substr($tag, 1); } else { // This shouldn't happen @@ -77,78 +85,78 @@ function create_tags_from_item($itemid) { $term = $tag; } - if ($message["uid"] == 0) { + if ($message['uid'] == 0) { $global = true; q("UPDATE `term` SET `global` = 1 WHERE `otype` = %d AND `guid` = '%s'", - intval(TERM_OBJ_POST), dbesc($message["guid"])); + intval(TERM_OBJ_POST), dbesc($message['guid'])); } else { $isglobal = q("SELECT `global` FROM `term` WHERE `uid` = 0 AND `otype` = %d AND `guid` = '%s'", - intval(TERM_OBJ_POST), dbesc($message["guid"])); + intval(TERM_OBJ_POST), dbesc($message['guid'])); $global = (count($isglobal) > 0); } $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `guid`, `created`, `received`, `global`) VALUES (%d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', %d)", - intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval($type), dbesc($term), - dbesc($link), dbesc($message["guid"]), dbesc($message["created"]), dbesc($message["received"]), intval($global)); + intval($message['uid']), intval($itemid), intval(TERM_OBJ_POST), intval($type), dbesc($term), + dbesc($link), dbesc($message['guid']), dbesc($message['created']), dbesc($message['received']), intval($global)); // Search for mentions if ((substr($tag, 0, 1) == '@') && (strpos($link, $profile_base_friendica) || strpos($link, $profile_base_diaspora))) { $users = q("SELECT `uid` FROM `contact` WHERE self AND (`url` = '%s' OR `nurl` = '%s')", $link, $link); foreach ($users AS $user) { - if ($user["uid"] == $message["uid"]) { + if ($user['uid'] == $message['uid']) { q("UPDATE `item` SET `mention` = 1 WHERE `id` = %d", intval($itemid)); - q("UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d", intval($message["parent"])); + q("UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d", intval($message['parent'])); } } } } } -function create_tags_from_itemuri($itemuri, $uid) { +function create_tags_from_itemuri($itemuri, $uid) +{ $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); if (count($messages)) { foreach ($messages as $message) { - create_tags_from_item($message["id"]); + create_tags_from_item($message['id']); } } } -function update_items() { - +function update_items() +{ $messages = dba::p("SELECT `oid`,`item`.`guid`, `item`.`created`, `item`.`received` FROM `term` INNER JOIN `item` ON `item`.`id`=`term`.`oid` WHERE `term`.`otype` = 1 AND `term`.`guid` = ''"); - logger("fetched messages: ".dba::num_rows($messages)); + logger('fetched messages: ' . dba::num_rows($messages)); while ($message = dba::fetch($messages)) { - - if ($message["uid"] == 0) { + if ($message['uid'] == 0) { $global = true; q("UPDATE `term` SET `global` = 1 WHERE `otype` = %d AND `guid` = '%s'", - intval(TERM_OBJ_POST), dbesc($message["guid"])); + intval(TERM_OBJ_POST), dbesc($message['guid'])); } else { $isglobal = q("SELECT `global` FROM `term` WHERE `uid` = 0 AND `otype` = %d AND `guid` = '%s'", - intval(TERM_OBJ_POST), dbesc($message["guid"])); + intval(TERM_OBJ_POST), dbesc($message['guid'])); $global = (count($isglobal) > 0); } q("UPDATE `term` SET `guid` = '%s', `created` = '%s', `received` = '%s', `global` = %d WHERE `otype` = %d AND `oid` = %d", - dbesc($message["guid"]), dbesc($message["created"]), dbesc($message["received"]), - intval($global), intval(TERM_OBJ_POST), intval($message["oid"])); + dbesc($message['guid']), dbesc($message['created']), dbesc($message['received']), + intval($global), intval(TERM_OBJ_POST), intval($message['oid'])); } dba::close($messages); $messages = dba::p("SELECT `guid` FROM `item` WHERE `uid` = 0"); - logger("fetched messages: ".dba::num_rows($messages)); + logger('fetched messages: ' . dba::num_rows($messages)); while ($message = dba::fetch(messages)) { - q("UPDATE `item` SET `global` = 1 WHERE `guid` = '%s'", dbesc($message["guid"])); + q("UPDATE `item` SET `global` = 1 WHERE `guid` = '%s'", dbesc($message['guid'])); } dba::close($messages); @@ -166,21 +174,22 @@ function update_items() { * * @return arr Alphabetical sorted array of used tags of an user. */ -function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG) { - require_once('include/security.php'); +function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG) +{ + require_once 'include/security.php'; $item_condition = item_condition(); $sql_options = item_permissions_sql($uid); - $limit = $count ? sprintf("LIMIT %d", intval($count)) : ""; + $limit = $count ? sprintf('LIMIT %d', intval($count)) : ''; if ($flags) { if ($flags === 'wall') { - $sql_options .= " AND `item`.`wall` "; + $sql_options .= ' AND `item`.`wall` '; } } if ($owner_id) { - $sql_options .= " AND `item`.`owner-id` = ".intval($owner_id)." "; + $sql_options .= ' AND `item`.`owner-id` = ' . intval($owner_id) . ' '; } // Fetch tags @@ -194,7 +203,7 @@ function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HA $type, TERM_OBJ_POST ); - if(!DBM::is_result($r)) { + if (!DBM::is_result($r)) { return array(); } @@ -212,32 +221,32 @@ function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HA * * @return string HTML formatted output. */ -function wtagblock($uid, $count = 0,$owner_id = 0, $flags = '', $type = TERM_HASHTAG) { +function wtagblock($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG) +{ $o = ''; $r = tagadelic($uid, $count, $owner_id, $flags, $type); if (count($r)) { $contact = dba::select( - "contact", - array("url"), - array("id" => $uid), - array("limit" => 1) + 'contact', + array('url'), + array('id' => $uid), + array('limit' => 1) ); $url = System::removedBaseUrl($contact['url']); foreach ($r as $rr) { $tag['level'] = $rr[2]; - $tag['url'] = $url."?tag=".urlencode($rr[0]); + $tag['url'] = $url . '?tag=' . urlencode($rr[0]); $tag['name'] = $rr[0]; $tags[] = $tag; } - $tpl = get_markup_template("tagblock_widget.tpl"); + $tpl = get_markup_template('tagblock_widget.tpl'); $o = replace_macros($tpl, array( '$title' => t('Tags'), - '$tags' => $tags + '$tags' => $tags )); - } return $o; } @@ -248,7 +257,8 @@ function wtagblock($uid, $count = 0,$owner_id = 0, $flags = '', $type = TERM_HAS * @param array $arr Array of tags/terms with tag/term name and total count of use. * @return array Alphabetical sorted array of used tags/terms of an user. */ -function tag_calc($arr) { +function tag_calc($arr) +{ $tags = array(); $min = 1e9; $max = -1e9; @@ -285,7 +295,8 @@ function tag_calc($arr) { * * @return int */ -function tags_sort($a, $b) { +function tags_sort($a, $b) +{ if (strtolower($a[0]) == strtolower($b[0])) { return 0; } @@ -298,21 +309,22 @@ function tags_sort($a, $b) { * @param int $limit Max number of displayed tags. * @return string HTML formattat output. */ -function tagcloud_wall_widget($limit = 50) { +function tagcloud_wall_widget($limit = 50) +{ $a = get_app(); - if(!$a->profile['profile_uid'] || !$a->profile['url']) { - return ""; + if (!$a->profile['profile_uid'] || !$a->profile['url']) { + return ''; } - if(Feature::isEnabled($a->profile['profile_uid'], 'tagadelic')) { + if (Feature::isEnabled($a->profile['profile_uid'], 'tagadelic')) { $owner_id = Contact::getIdForURL($a->profile['url']); - if(!$owner_id) { - return ""; + if (!$owner_id) { + return ''; } return wtagblock($a->profile['profile_uid'], $limit, $owner_id, 'wall'); } - return ""; + return ''; } diff --git a/include/text.php b/include/text.php index cbba8d0c5b..5a24c68ed3 100644 --- a/include/text.php +++ b/include/text.php @@ -994,7 +994,7 @@ function contact_block() { function micropro($contact, $redirect = false, $class = '', $textmode = false) { // Use the contact URL if no address is available - if ($contact["addr"] == "") { + if (!x($contact, "addr")) { $contact["addr"] = $contact["url"]; } @@ -1020,7 +1020,7 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) { } return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array( - '$click' => (($contact['click']) ? $contact['click'] : ''), + '$click' => defaults($contact, 'click', ''), '$class' => $class, '$url' => $url, '$photo' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB), @@ -1202,11 +1202,15 @@ function redir_private_images($a, &$item) } } -function put_item_in_cache(&$item, $update = false) { - - if (($item["rendered-hash"] != hash("md5", $item["body"])) || ($item["rendered-hash"] == "") || - ($item["rendered-html"] == "") || Config::get("system", "ignore_cache")) { +function put_item_in_cache(&$item, $update = false) +{ + $rendered_hash = defaults($item, 'rendered-hash', ''); + if ($rendered_hash == '' + || $item["rendered-html"] == "" + || $rendered_hash != hash("md5", $item["body"]) + || Config::get("system", "ignore_cache") + ) { // The function "redir_private_images" changes the body. // I'm not sure if we should store it permanently, so we save the old value. $body = $item["body"]; @@ -2026,7 +2030,7 @@ function deindent($text, $chr = "[\t ]", $count = NULL) { } function formatBytes($bytes, $precision = 2) { - $units = array('B', 'KB', 'MB', 'GB', 'TB'); + $units = array('B', 'KB', 'MB', 'GB', 'TB'); $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); diff --git a/index.php b/index.php index 2f58321ae8..711478fe1e 100644 --- a/index.php +++ b/index.php @@ -98,6 +98,7 @@ if (!$a->is_backend()) { session_start(); $a->save_timestamp($stamp1, "parser"); } else { + $_SESSION = []; Worker::executeIfIdle(); } diff --git a/mod/contacts.php b/mod/contacts.php index 3421babf61..c58dc0fc4f 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -35,8 +35,9 @@ function contacts_init(App $a) { require_once 'include/contact_widgets.php'; - if ($_GET['nets'] == "all") { - $_GET['nets'] = ""; + $nets = defaults($_GET, 'nets', ''); + if ($nets == "all") { + $nets = ""; } if (! x($a->page,'aside')) { @@ -63,22 +64,22 @@ function contacts_init(App $a) { '$account_type' => Contact::getAccountType($a->data['contact']) )); - $finpeople_widget = ''; + $findpeople_widget = ''; $follow_widget = ''; $networks_widget = ''; } else { $vcard_widget = ''; - $networks_widget .= networks_widget('contacts',$_GET['nets']); + $networks_widget = networks_widget('contacts', $nets); if (isset($_GET['add'])) { $follow_widget = follow_widget($_GET['add']); } else { $follow_widget = follow_widget(); } - $findpeople_widget .= findpeople_widget(); + $findpeople_widget = findpeople_widget(); } - $groups_widget .= Group::sidebarWidget('contacts','group','full',0,$contact_id); + $groups_widget = Group::sidebarWidget('contacts','group','full',0,$contact_id); $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"),array( '$vcard_widget' => $vcard_widget, @@ -515,8 +516,6 @@ function contacts_content(App $a) { require_once 'include/contact_selectors.php'; - $tpl = get_markup_template("contact_edit.tpl"); - switch($contact['rel']) { case CONTACT_IS_FRIEND: $dir_icon = 'images/lrarrow.gif'; @@ -577,6 +576,7 @@ function contacts_content(App $a) { $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < datetime_convert('','','now')) ? t('Communications lost with this contact!') : ''); + $fetch_further_information = null; if ($contact['network'] == NETWORK_FEED) { $fetch_further_information = array('fetch_further_information', t('Fetch further information for feeds'), @@ -587,12 +587,19 @@ function contacts_content(App $a) { '3' => t('Fetch keywords'), '2' => t('Fetch information and keywords'))); } - if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL))) + + $poll_interval = null; + if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL))) { $poll_interval = contact_poll_interval($contact['priority'],(! $poll_enabled)); + } - if ($contact['network'] == NETWORK_DFRN) + $profile_select = null; + if ($contact['network'] == NETWORK_DFRN) { $profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false)); + } + $follow = ''; + $follow_text = ''; if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS))) { if ($contact['rel'] == CONTACT_IS_FOLLOWER) { $follow = System::baseUrl(true)."/follow?url=".urlencode($contact["url"]); @@ -606,7 +613,7 @@ function contacts_content(App $a) { // Load contactact related actions like hide, suggest, delete and others $contact_actions = contact_actions($contact); - + $tpl = get_markup_template("contact_edit.tpl"); $o .= replace_macros($tpl, array( //'$header' => t('Contact Editor'), '$header' => t("Contact"), @@ -618,9 +625,7 @@ function contacts_content(App $a) { '$lbl_info2' => t('Their personal note'), '$reason' => trim(notags($contact['reason'])), '$infedit' => t('Edit contact notes'), - '$common_text' => $common_text, '$common_link' => 'common/loc/' . local_user() . '/' . $contact['id'], - '$all_friends' => $all_friends, '$relation_text' => $relation_text, '$visit' => sprintf( t('Visit %s\'s profile [%s]'),$contact['name'],$contact['url']), '$blockunblock' => t('Block/Unblock contact'), @@ -658,7 +663,6 @@ function contacts_content(App $a) { '$photo' => $contact['photo'], '$name' => htmlentities($contact['name']), '$dir_icon' => $dir_icon, - '$alt_text' => $alt_text, '$sparkle' => $sparkle, '$url' => $url, '$profileurllabel' => t('Profile URL'), @@ -688,36 +692,33 @@ function contacts_content(App $a) { } - $blocked = false; - $hidden = false; - $ignored = false; - $all = false; + $blocked = false; + $hidden = false; + $ignored = false; + $archived = false; + $all = false; if(($a->argc == 2) && ($a->argv[1] === 'all')) { $sql_extra = ''; $all = true; - } - elseif(($a->argc == 2) && ($a->argv[1] === 'blocked')) { + } elseif(($a->argc == 2) && ($a->argv[1] === 'blocked')) { $sql_extra = " AND `blocked` = 1 "; $blocked = true; - } - elseif(($a->argc == 2) && ($a->argv[1] === 'hidden')) { + } elseif(($a->argc == 2) && ($a->argv[1] === 'hidden')) { $sql_extra = " AND `hidden` = 1 "; $hidden = true; - } - elseif(($a->argc == 2) && ($a->argv[1] === 'ignored')) { + } elseif(($a->argc == 2) && ($a->argv[1] === 'ignored')) { $sql_extra = " AND `readonly` = 1 "; $ignored = true; - } - elseif(($a->argc == 2) && ($a->argv[1] === 'archived')) { + } elseif(($a->argc == 2) && ($a->argv[1] === 'archived')) { $sql_extra = " AND `archive` = 1 "; $archived = true; - } - else + } else { $sql_extra = " AND `blocked` = 0 "; + } - $search = ((x($_GET,'search')) ? notags(trim($_GET['search'])) : ''); - $nets = ((x($_GET,'nets')) ? notags(trim($_GET['nets'])) : ''); + $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : ''; + $nets = x($_GET, 'nets') ? notags(trim($_GET['nets'])) : ''; $tabs = array( array( @@ -786,25 +787,25 @@ function contacts_content(App $a) { $tab_tpl = get_markup_template('common_tabs.tpl'); $t = replace_macros($tab_tpl, array('$tabs'=>$tabs)); - - $searching = false; - if($search) { + $search_hdr = null; + if ($search) { $search_hdr = $search; $search_txt = dbesc(protect_sprintf(preg_quote($search))); $searching = true; } $sql_extra .= (($searching) ? " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') " : ""); - if($nets) + if ($nets) { $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets)); + } $sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : ''); - $r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 $sql_extra $sql_extra2 ", - intval($_SESSION['uid'])); + intval($_SESSION['uid']) + ); if (DBM::is_result($r)) { $a->set_pager_total($r[0]['total']); $total = $r[0]['total']; @@ -834,7 +835,7 @@ function contacts_content(App $a) { '$total' => $total, '$search' => $search_hdr, '$desc' => t('Search your contacts'), - '$finding' => (($searching) ? sprintf(t('Results for: %s'),$search) : ""), + '$finding' => $searching ? t('Results for: %s', $search) : "", '$submit' => t('Find'), '$cmd' => $a->cmd, '$contacts' => $contacts, @@ -849,7 +850,6 @@ function contacts_content(App $a) { ), '$h_batch_actions' => t('Batch Actions'), '$paginate' => paginate($a), - )); return $o; @@ -927,12 +927,11 @@ function contact_posts($a, $contact_id) { $contact = $r[0]; $a->page['aside'] = ""; profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"])); - } else - $profile = ""; + } $tab_str = contacts_tab($a, $contact_id, 1); - $o .= $tab_str; + $o = $tab_str; $o .= Contact::getPostsFromUrl($contact["url"]); diff --git a/mod/crepair.php b/mod/crepair.php index 32db9be92c..1a135a602f 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -1,4 +1,5 @@ argc == 2) && intval($a->argv[1])) { + if (($a->argc == 2) && intval($a->argv[1])) { $contact_id = intval($a->argv[1]); $r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1", intval(local_user()), intval($contact_id) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { $contact_id = 0; } } - if(! x($a->page,'aside')) + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; + } - if($contact_id) { + if ($contact_id) { $a->data['contact'] = $r[0]; $contact = $r[0]; profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"])); } } -function crepair_post(App $a) { - if (! local_user()) { +function crepair_post(App $a) +{ + if (!local_user()) { return; } $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0); - if($cid) { + if ($cid) { $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($cid), intval(local_user()) ); } - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { return; } $contact = $r[0]; - $name = ((x($_POST,'name')) ? $_POST['name'] : $contact['name']); - $nick = ((x($_POST,'nick')) ? $_POST['nick'] : ''); - $url = ((x($_POST,'url')) ? $_POST['url'] : ''); - $request = ((x($_POST,'request')) ? $_POST['request'] : ''); - $confirm = ((x($_POST,'confirm')) ? $_POST['confirm'] : ''); - $notify = ((x($_POST,'notify')) ? $_POST['notify'] : ''); - $poll = ((x($_POST,'poll')) ? $_POST['poll'] : ''); - $attag = ((x($_POST,'attag')) ? $_POST['attag'] : ''); - $photo = ((x($_POST,'photo')) ? $_POST['photo'] : ''); - $remote_self = ((x($_POST,'remote_self')) ? $_POST['remote_self'] : false); - $nurl = normalise_link($url); + $name = defaults($_POST, 'name' , $contact['name']); + $nick = defaults($_POST, 'nick' , ''); + $url = defaults($_POST, 'url' , ''); + $request = defaults($_POST, 'request' , ''); + $confirm = defaults($_POST, 'confirm' , ''); + $notify = defaults($_POST, 'notify' , ''); + $poll = defaults($_POST, 'poll' , ''); + $attag = defaults($_POST, 'attag' , ''); + $photo = defaults($_POST, 'photo' , ''); + $remote_self = defaults($_POST, 'remote_self', false); + $nurl = normalise_link($url); $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `nurl` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s', `attag` = '%s' , `remote_self` = %d WHERE `id` = %d AND `uid` = %d", @@ -101,26 +105,24 @@ function crepair_post(App $a) { return; } - - -function crepair_content(App $a) { - - if (! local_user()) { - notice( t('Permission denied.') . EOL); +function crepair_content(App $a) +{ + if (!local_user()) { + notice(t('Permission denied.') . EOL); return; } $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0); - if($cid) { + if ($cid) { $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($cid), intval(local_user()) ); } - if (! DBM::is_result($r)) { - notice( t('Contact not found.') . EOL); + if (!DBM::is_result($r)) { + notice(t('Contact not found.') . EOL); return; } @@ -131,45 +133,44 @@ function crepair_content(App $a) { $returnaddr = "contacts/$cid"; - $allow_remote_self = Config::get('system','allow_users_remote_self'); + $allow_remote_self = Config::get('system', 'allow_users_remote_self'); // Disable remote self for everything except feeds. // There is an issue when you repeat an item from maybe twitter and you got comments from friendica and twitter // Problem is, you couldn't reply to both networks. - if (!in_array($contact['network'], array(NETWORK_FEED, NETWORK_DFRN, NETWORK_DIASPORA))) + if (!in_array($contact['network'], array(NETWORK_FEED, NETWORK_DFRN, NETWORK_DIASPORA))) { $allow_remote_self = false; + } - if ($contact['network'] == NETWORK_FEED) - $remote_self_options = array('0'=>t('No mirroring'), '1'=>t('Mirror as forwarded posting'), '2'=>t('Mirror as my own posting')); - else - $remote_self_options = array('0'=>t('No mirroring'), '2'=>t('Mirror as my own posting')); + if ($contact['network'] == NETWORK_FEED) { + $remote_self_options = array('0' => t('No mirroring'), '1' => t('Mirror as forwarded posting'), '2' => t('Mirror as my own posting')); + } else { + $remote_self_options = array('0' => t('No mirroring'), '2' => t('Mirror as my own posting')); + } - $update_profile = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_DSPR, NETWORK_OSTATUS)); + $update_profile = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)); $tab_str = contacts_tab($a, $contact['id'], 5); - $tpl = get_markup_template('crepair.tpl'); - $o .= replace_macros($tpl, array( - //'$title' => t('Repair Contact Settings'), - '$tab_str' => $tab_str, - '$warning' => $warning, - '$info' => $info, - '$returnaddr' => $returnaddr, - '$return' => t('Return to contact editor'), - '$update_profile' => update_profile, - '$udprofilenow' => t('Refetch contact data'), - '$contact_id' => $contact['id'], - '$lbl_submit' => t('Submit'), - + $o = replace_macros($tpl, array( + '$tab_str' => $tab_str, + '$warning' => $warning, + '$info' => $info, + '$returnaddr' => $returnaddr, + '$return' => t('Return to contact editor'), + '$update_profile' => $update_profile, + '$udprofilenow' => t('Refetch contact data'), + '$contact_id' => $contact['id'], + '$lbl_submit' => t('Submit'), '$label_remote_self' => t('Remote Self'), '$allow_remote_self' => $allow_remote_self, '$remote_self' => array('remote_self', - t('Mirror postings from this contact'), - $contact['remote_self'], - t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'), - $remote_self_options - ), + t('Mirror postings from this contact'), + $contact['remote_self'], + t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'), + $remote_self_options + ), '$name' => array('name', t('Name') , htmlentities($contact['name'])), '$nick' => array('nick', t('Account Nickname'), htmlentities($contact['nick'])), @@ -183,5 +184,4 @@ function crepair_content(App $a) { )); return $o; - } diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 112ee34ab3..a5f5f1bd34 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -29,6 +29,7 @@ use Friendica\Model\Group; use Friendica\Model\User; use Friendica\Network\Probe; use Friendica\Protocol\Diaspora; +use Friendica\Util\Crypto; require_once 'include/enotify.php'; @@ -162,9 +163,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { * worried about key leakage than anybody cracking it. * */ - require_once 'include/crypto.php'; - - $res = new_keypair(4096); + $res = Crypto::newKeypair(4096); $private_key = $res['prvkey']; diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index d27c7d6214..69e86f1bc2 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -1,4 +1,5 @@ argc > 1) && ($dfrn_id == '') && !strstr($_SERVER["HTTP_USER_AGENT"], 'Friendica')) { $nickname = $a->argv[1]; header("Content-type: application/atom+xml"); - echo OStatus::feed($a, $nickname, $last_update, 10); + echo OStatus::feed($nickname, $last_update, 10); killme(); } - $direction = (-1); + $direction = -1; - - if(strpos($dfrn_id,':') == 1) { - $direction = intval(substr($dfrn_id,0,1)); - $dfrn_id = substr($dfrn_id,2); + if (strpos($dfrn_id, ':') == 1) { + $direction = intval(substr($dfrn_id, 0, 1)); + $dfrn_id = substr($dfrn_id, 2); } $hidewall = false; - if(($dfrn_id === '') && (! x($_POST,'dfrn_id'))) { - if((Config::get('system','block_public')) && (! local_user()) && (! remote_user())) { + if (($dfrn_id === '') && (!x($_POST, 'dfrn_id'))) { + if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { http_status_exit(403); } $user = ''; - if($a->argc > 1) { + if ($a->argc > 1) { $r = q("SELECT `hidewall`,`nickname` FROM `user` WHERE `user`.`nickname` = '%s' LIMIT 1", dbesc($a->argv[1]) ); - if (!$r) + if (!$r) { http_status_exit(404); + } $hidewall = ($r[0]['hidewall'] && !local_user()); @@ -63,16 +65,15 @@ function dfrn_poll_init(App $a) { logger('dfrn_poll: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $user); header("Content-type: application/atom+xml"); - echo DFRN::feed('', $user,$last_update, 0, $hidewall); + echo DFRN::feed('', $user, $last_update, 0, $hidewall); killme(); } - if(($type === 'profile') && (! strlen($sec))) { - + if (($type === 'profile') && (!strlen($sec))) { $sql_extra = ''; - switch($direction) { - case (-1): - $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id),dbesc($dfrn_id)); + switch ($direction) { + case -1: + $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id), dbesc($dfrn_id)); $my_id = $dfrn_id; break; case 0: @@ -96,28 +97,29 @@ function dfrn_poll_init(App $a) { ); if (DBM::is_result($r)) { - $s = fetch_url($r[0]['poll'] . '?dfrn_id=' . $my_id . '&type=profile-check'); logger("dfrn_poll: old profile returns " . $s, LOGGER_DATA); - if(strlen($s)) { - + if (strlen($s)) { $xml = parse_xml_string($s); - if((int) $xml->status == 1) { + if ((int) $xml->status === 1) { $_SESSION['authenticated'] = 1; - if(! x($_SESSION,'remote')) + if (!x($_SESSION, 'remote')) { $_SESSION['remote'] = array(); + } - $_SESSION['remote'][] = array('cid' => $r[0]['id'],'uid' => $r[0]['uid'],'url' => $r[0]['url']); + $_SESSION['remote'][] = array('cid' => $r[0]['id'], 'uid' => $r[0]['uid'], 'url' => $r[0]['url']); $_SESSION['visitor_id'] = $r[0]['id']; $_SESSION['visitor_home'] = $r[0]['url']; $_SESSION['visitor_handle'] = $r[0]['addr']; $_SESSION['visitor_visiting'] = $r[0]['uid']; - if(!$quiet) - info( sprintf(t('%1$s welcomes %2$s'), $r[0]['username'] , $r[0]['name']) . EOL); + if (!$quiet) { + info(sprintf(t('%1$s welcomes %2$s'), $r[0]['username'], $r[0]['name']) . EOL); + } + // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; @@ -131,53 +133,53 @@ function dfrn_poll_init(App $a) { goaway((strlen($destination_url)) ? $destination_url : System::baseUrl() . '/profile/' . $profile); } goaway(System::baseUrl()); - } - if($type === 'profile-check' && $dfrn_version < 2.2 ) { - - if((strlen($challenge)) && (strlen($sec))) { - + if ($type === 'profile-check' && $dfrn_version < 2.2) { + if ((strlen($challenge)) && (strlen($sec))) { q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1", dbesc($sec) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { xml_status(3, 'No ticket'); // NOTREACHED } + $orig_id = $r[0]['dfrn_id']; - if(strpos($orig_id, ':')) - $orig_id = substr($orig_id,2); + if (strpos($orig_id, ':')) { + $orig_id = substr($orig_id, 2); + } $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($r[0]['cid']) ); - if (! DBM::is_result($c)) { + if (!DBM::is_result($c)) { xml_status(3, 'No profile'); } + $contact = $c[0]; $sent_dfrn_id = hex2bin($dfrn_id); - $challenge = hex2bin($challenge); + $challenge = hex2bin($challenge); $final_dfrn_id = ''; - if(($contact['duplex']) && strlen($contact['prvkey'])) { - openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']); - openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']); - } - else { - openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']); - openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']); + if (($contact['duplex']) && strlen($contact['prvkey'])) { + openssl_private_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['prvkey']); + openssl_private_decrypt($challenge, $decoded_challenge, $contact['prvkey']); + } else { + openssl_public_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['pubkey']); + openssl_public_decrypt($challenge, $decoded_challenge, $contact['pubkey']); } $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.')); - if(strpos($final_dfrn_id,':') == 1) - $final_dfrn_id = substr($final_dfrn_id,2); + if (strpos($final_dfrn_id, ':') == 1) { + $final_dfrn_id = substr($final_dfrn_id, 2); + } - if($final_dfrn_id != $orig_id) { + if ($final_dfrn_id != $orig_id) { logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG); // did not decode properly - cannot trust this site xml_status(3, 'Bad decryption'); @@ -187,11 +189,9 @@ function dfrn_poll_init(App $a) { echo "0$decoded_challenge$sec"; killme(); // NOTREACHED - } - else { - // old protocol - - switch($direction) { + } else { + // old protocol + switch ($direction) { case 1: $dfrn_id = '0:' . $dfrn_id; break; @@ -202,7 +202,6 @@ function dfrn_poll_init(App $a) { break; } - q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); $r = q("SELECT * FROM `profile_check` WHERE `dfrn_id` = '%s' ORDER BY `expire` DESC", dbesc($dfrn_id)); @@ -214,67 +213,65 @@ function dfrn_poll_init(App $a) { return; // NOTREACHED } } - } +function dfrn_poll_post(App $a) +{ + $dfrn_id = x($_POST,'dfrn_id') ? $_POST['dfrn_id'] : ''; + $challenge = x($_POST,'challenge') ? $_POST['challenge'] : ''; + $url = x($_POST,'url') ? $_POST['url'] : ''; + $sec = x($_POST,'sec') ? $_POST['sec'] : ''; + $ptype = x($_POST,'type') ? $_POST['type'] : ''; + $dfrn_version = x($_POST,'dfrn_version') ? (float) $_POST['dfrn_version'] : 2.0; + $perm = x($_POST,'perm') ? $_POST['perm'] : 'r'; - -function dfrn_poll_post(App $a) { - - $dfrn_id = ((x($_POST,'dfrn_id')) ? $_POST['dfrn_id'] : ''); - $challenge = ((x($_POST,'challenge')) ? $_POST['challenge'] : ''); - $url = ((x($_POST,'url')) ? $_POST['url'] : ''); - $sec = ((x($_POST,'sec')) ? $_POST['sec'] : ''); - $ptype = ((x($_POST,'type')) ? $_POST['type'] : ''); - $dfrn_version = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0); - $perm = ((x($_POST,'perm')) ? $_POST['perm'] : 'r'); - - if($ptype === 'profile-check') { - - if((strlen($challenge)) && (strlen($sec))) { - + if ($ptype === 'profile-check') { + if (strlen($challenge) && strlen($sec)) { logger('dfrn_poll: POST: profile-check'); q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1", dbesc($sec) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { xml_status(3, 'No ticket'); // NOTREACHED } + $orig_id = $r[0]['dfrn_id']; - if(strpos($orig_id, ':')) - $orig_id = substr($orig_id,2); + if (strpos($orig_id, ':')) { + $orig_id = substr($orig_id, 2); + } $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($r[0]['cid']) ); - if (! DBM::is_result($c)) { + if (!DBM::is_result($c)) { xml_status(3, 'No profile'); } + $contact = $c[0]; $sent_dfrn_id = hex2bin($dfrn_id); - $challenge = hex2bin($challenge); + $challenge = hex2bin($challenge); $final_dfrn_id = ''; - if(($contact['duplex']) && strlen($contact['prvkey'])) { - openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']); - openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']); - } - else { - openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']); - openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']); + if ($contact['duplex'] && strlen($contact['prvkey'])) { + openssl_private_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['prvkey']); + openssl_private_decrypt($challenge, $decoded_challenge, $contact['prvkey']); + } else { + openssl_public_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['pubkey']); + openssl_public_decrypt($challenge, $decoded_challenge, $contact['pubkey']); } $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.')); - if(strpos($final_dfrn_id,':') == 1) - $final_dfrn_id = substr($final_dfrn_id,2); + if (strpos($final_dfrn_id, ':') == 1) { + $final_dfrn_id = substr($final_dfrn_id, 2); + } - if($final_dfrn_id != $orig_id) { + if ($final_dfrn_id != $orig_id) { logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG); // did not decode properly - cannot trust this site xml_status(3, 'Bad decryption'); @@ -285,22 +282,20 @@ function dfrn_poll_post(App $a) { killme(); // NOTREACHED } - } - $direction = (-1); - if(strpos($dfrn_id,':') == 1) { - $direction = intval(substr($dfrn_id,0,1)); - $dfrn_id = substr($dfrn_id,2); + $direction = -1; + if (strpos($dfrn_id, ':') == 1) { + $direction = intval(substr($dfrn_id, 0, 1)); + $dfrn_id = substr($dfrn_id, 2); } - $r = q("SELECT * FROM `challenge` WHERE `dfrn-id` = '%s' AND `challenge` = '%s' LIMIT 1", dbesc($dfrn_id), dbesc($challenge) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { killme(); } @@ -314,8 +309,8 @@ function dfrn_poll_post(App $a) { $sql_extra = ''; - switch($direction) { - case (-1): + switch ($direction) { + case -1: $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($dfrn_id)); $my_id = $dfrn_id; break; @@ -332,11 +327,8 @@ function dfrn_poll_post(App $a) { break; // NOTREACHED } - $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 $sql_extra LIMIT 1"); - - - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { killme(); } @@ -344,8 +336,7 @@ function dfrn_poll_post(App $a) { $owner_uid = $r[0]['uid']; $contact_id = $r[0]['id']; - - if($type === 'reputation' && strlen($url)) { + if ($type === 'reputation' && strlen($url)) { $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1", dbesc($url), intval($owner_uid) @@ -357,7 +348,7 @@ function dfrn_poll_post(App $a) { $reputation = $r[0]['rating']; $text = $r[0]['reason']; - if($r[0]['id'] == $contact_id) { // inquiring about own reputation not allowed + if ($r[0]['id'] == $contact_id) { // inquiring about own reputation not allowed $reputation = 0; $text = ''; } @@ -372,18 +363,17 @@ function dfrn_poll_post(App $a) { "; killme(); // NOTREACHED - } - else { - + } else { // Update the writable flag if it changed - logger('dfrn_poll: post request feed: ' . print_r($_POST,true),LOGGER_DATA); - if($dfrn_version >= 2.21) { - if($perm === 'rw') + logger('dfrn_poll: post request feed: ' . print_r($_POST, true), LOGGER_DATA); + if ($dfrn_version >= 2.21) { + if ($perm === 'rw') { $writable = 1; - else + } else { $writable = 0; + } - if($writable != $contact['writable']) { + if ($writable != $contact['writable']) { q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d", intval($writable), intval($contact_id) @@ -395,29 +385,27 @@ function dfrn_poll_post(App $a) { $o = DFRN::feed($dfrn_id, $a->argv[1], $last_update, $direction); echo $o; killme(); - } } -function dfrn_poll_content(App $a) { +function dfrn_poll_content(App $a) +{ + $dfrn_id = x($_GET,'dfrn_id') ? $_GET['dfrn_id'] : ''; + $type = x($_GET,'type') ? $_GET['type'] : 'data'; + $last_update = x($_GET,'last_update') ? $_GET['last_update'] : ''; + $destination_url = x($_GET,'destination_url') ? $_GET['destination_url'] : ''; + $sec = x($_GET,'sec') ? $_GET['sec'] : ''; + $dfrn_version = x($_GET,'dfrn_version') ? (float) $_GET['dfrn_version'] : 2.0; + $perm = x($_GET,'perm') ? $_GET['perm'] : 'r'; + $quiet = x($_GET,'quiet') ? true : false; - $dfrn_id = ((x($_GET,'dfrn_id')) ? $_GET['dfrn_id'] : ''); - $type = ((x($_GET,'type')) ? $_GET['type'] : 'data'); - $last_update = ((x($_GET,'last_update')) ? $_GET['last_update'] : ''); - $destination_url = ((x($_GET,'destination_url')) ? $_GET['destination_url'] : ''); - $sec = ((x($_GET,'sec')) ? $_GET['sec'] : ''); - $dfrn_version = ((x($_GET,'dfrn_version')) ? (float) $_GET['dfrn_version'] : 2.0); - $perm = ((x($_GET,'perm')) ? $_GET['perm'] : 'r'); - $quiet = ((x($_GET,'quiet')) ? true : false); - - $direction = (-1); - if(strpos($dfrn_id,':') == 1) { - $direction = intval(substr($dfrn_id,0,1)); - $dfrn_id = substr($dfrn_id,2); + $direction = -1; + if (strpos($dfrn_id, ':') == 1) { + $direction = intval(substr($dfrn_id, 0, 1)); + $dfrn_id = substr($dfrn_id, 2); } - - if($dfrn_id != '') { + if ($dfrn_id != '') { // initial communication from external contact $hash = random_string(); @@ -425,7 +413,7 @@ function dfrn_poll_content(App $a) { $r = q("DELETE FROM `challenge` WHERE `expire` < " . intval(time())); - if($type !== 'profile') { + if ($type !== 'profile') { $r = q("INSERT INTO `challenge` ( `challenge`, `dfrn-id`, `expire` , `type`, `last_update` ) VALUES( '%s', '%s', '%s', '%s', '%s' ) ", dbesc($hash), @@ -435,13 +423,16 @@ function dfrn_poll_content(App $a) { dbesc($last_update) ); } + $sql_extra = ''; - switch($direction) { - case (-1): - if($type === 'profile') - $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id),dbesc($dfrn_id)); - else + switch ($direction) { + case -1: + if ($type === 'profile') { + $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id), dbesc($dfrn_id)); + } else { $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($dfrn_id)); + } + $my_id = $dfrn_id; break; case 0: @@ -465,36 +456,30 @@ function dfrn_poll_content(App $a) { AND `user`.`nickname` = '%s' $sql_extra LIMIT 1", dbesc($nickname) ); - if (DBM::is_result($r)) { - $challenge = ''; $encrypted_id = ''; - $id_str = $my_id . '.' . mt_rand(1000,9999); + $id_str = $my_id . '.' . mt_rand(1000, 9999); - if(($r[0]['duplex'] && strlen($r[0]['pubkey'])) || (! strlen($r[0]['prvkey']))) { - openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']); - openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']); - } - else { - openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']); - openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']); + if (($r[0]['duplex'] && strlen($r[0]['pubkey'])) || !strlen($r[0]['prvkey'])) { + openssl_public_encrypt($hash, $challenge, $r[0]['pubkey']); + openssl_public_encrypt($id_str, $encrypted_id, $r[0]['pubkey']); + } else { + openssl_private_encrypt($hash, $challenge, $r[0]['prvkey']); + openssl_private_encrypt($id_str, $encrypted_id, $r[0]['prvkey']); } $challenge = bin2hex($challenge); $encrypted_id = bin2hex($encrypted_id); - } - else { + } else { $status = 1; $challenge = ''; $encrypted_id = ''; } - if(($type === 'profile') && (strlen($sec))) { - + if (($type === 'profile') && (strlen($sec))) { // URL reply - - if($dfrn_version < 2.2) { + if ($dfrn_version < 2.2) { $s = fetch_url($r[0]['poll'] . '?dfrn_id=' . $encrypted_id . '&type=profile-check' @@ -502,8 +487,7 @@ function dfrn_poll_content(App $a) { . '&challenge=' . $challenge . '&sec=' . $sec ); - } - else { + } else { $s = post_url($r[0]['poll'], array( 'dfrn_id' => $encrypted_id, 'type' => 'profile-check', @@ -515,7 +499,7 @@ function dfrn_poll_content(App $a) { $profile = ((DBM::is_result($r) && $r[0]['nickname']) ? $r[0]['nickname'] : $nickname); - switch($destination_url) { + switch ($destination_url) { case 'profile': $dest = System::baseUrl() . '/profile/' . $profile . '?f=&tab=profile'; break; @@ -534,26 +518,28 @@ function dfrn_poll_content(App $a) { logger("dfrn_poll: sec profile: " . $s, LOGGER_DATA); - if(strlen($s) && strstr($s,'challenge . ' expecting ' . $hash); logger('dfrn_poll: secure profile: sec: ' . $xml->sec . ' expecting ' . $sec); - - if(((int) $xml->status == 0) && ($xml->challenge == $hash) && ($xml->sec == $sec)) { + if (((int) $xml->status == 0) && ($xml->challenge == $hash) && ($xml->sec == $sec)) { $_SESSION['authenticated'] = 1; - if(! x($_SESSION,'remote')) + if (!x($_SESSION, 'remote')) { $_SESSION['remote'] = array(); - $_SESSION['remote'][] = array('cid' => $r[0]['id'],'uid' => $r[0]['uid'],'url' => $r[0]['url']); + } + + $_SESSION['remote'][] = array('cid' => $r[0]['id'], 'uid' => $r[0]['uid'], 'url' => $r[0]['url']); $_SESSION['visitor_id'] = $r[0]['id']; $_SESSION['visitor_home'] = $r[0]['url']; $_SESSION['visitor_visiting'] = $r[0]['uid']; - if(!$quiet) - info( sprintf(t('%1$s welcomes %2$s'), $r[0]['username'] , $r[0]['name']) . EOL); + if (!$quiet) { + info(sprintf(t('%1$s welcomes %2$s'), $r[0]['username'], $r[0]['name']) . EOL); + } + // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; @@ -567,9 +553,7 @@ function dfrn_poll_content(App $a) { } goaway($dest); // NOTREACHED - - } - else { + } else { // XML reply header("Content-type: text/xml"); echo '' . "\r\n" @@ -578,7 +562,7 @@ function dfrn_poll_content(App $a) { . "\t" . '' . DFRN_PROTOCOL_VERSION . '' . "\r\n" . "\t" . '' . $encrypted_id . '' . "\r\n" . "\t" . '' . $challenge . '' . "\r\n" - . '' . "\r\n" ; + . '' . "\r\n"; killme(); // NOTREACHED } diff --git a/mod/display.php b/mod/display.php index 67e6f435ec..2d91d2d1ae 100644 --- a/mod/display.php +++ b/mod/display.php @@ -202,8 +202,9 @@ function display_content(App $a, $update = false, $update_uid = 0) { if ($update) { $item_id = $_REQUEST['item_id']; - $item = dba::select('item', ['uid'], ['id' => $item_id], ['limit' => 1]); + $item = dba::select('item', ['uid', 'parent'], ['id' => $item_id], ['limit' => 1]); $a->profile = array('uid' => intval($item['uid']), 'profile_uid' => intval($item['uid'])); + $item_parent = $item['parent']; } else { $item_id = (($a->argc > 2) ? $a->argv[2] : 0); @@ -261,7 +262,7 @@ function display_content(App $a, $update = false, $update_uid = 0) { $contact_id = 0; - if (is_array($_SESSION['remote'])) { + if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) { foreach ($_SESSION['remote'] as $v) { if ($v['uid'] == $a->profile['uid']) { $contact_id = $v['cid']; @@ -295,7 +296,7 @@ function display_content(App $a, $update = false, $update_uid = 0) { } $is_owner = (local_user() && (in_array($a->profile['profile_uid'], [local_user(), 0])) ? true : false); - if ($a->profile['hidewall'] && !$is_owner && !$remote_contact) { + if (x($a->profile, 'hidewall') && !$is_owner && !$remote_contact) { notice(t('Access to this profile has been restricted.') . EOL); return; } diff --git a/mod/events.php b/mod/events.php index 7a05274e23..eb804b5d66 100644 --- a/mod/events.php +++ b/mod/events.php @@ -20,7 +20,7 @@ function events_init(App $a) { return; } - if ($a->argc == 1) { + if ($a->argc > 1) { // If it's a json request abort here because we don't // need the widget data if ($a->argv[1] === 'json') { @@ -234,6 +234,7 @@ function events_content(App $a) { )); $o = ''; + $tabs = ''; // tabs if ($a->theme_events_in_profile) { $tabs = profile_tabs($a, true); @@ -309,10 +310,13 @@ function events_content(App $a) { $start = sprintf('%d-%d-%d %d:%d:%d', $y, $m, 1, 0, 0, 0); $finish = sprintf('%d-%d-%d %d:%d:%d', $y, $m, $dim, 23, 59, 59); - - if ($a->argv[1] === 'json') { - if (x($_GET, 'start')) {$start = $_GET['start'];} - if (x($_GET, 'end')) {$finish = $_GET['end'];} + if ($a->argc > 1 && $a->argv[1] === 'json') { + if (x($_GET, 'start')) { + $start = $_GET['start']; + } + if (x($_GET, 'end')) { + $finish = $_GET['end']; + } } $start = datetime_convert('UTC', 'UTC', $start); @@ -358,7 +362,7 @@ function events_content(App $a) { $events = process_events($r); } - if ($a->argv[1] === 'json'){ + if ($a->argc > 1 && $a->argv[1] === 'json'){ echo json_encode($events); killme(); } diff --git a/mod/fetch.php b/mod/fetch.php index 68f6acc917..c097ee4c46 100644 --- a/mod/fetch.php +++ b/mod/fetch.php @@ -8,8 +8,6 @@ use Friendica\Core\System; use Friendica\Protocol\Diaspora; use Friendica\Util\XML; -require_once "include/crypto.php"; - function fetch_init(App $a) { diff --git a/mod/hostxrd.php b/mod/hostxrd.php index 0403945efc..1da8fda998 100644 --- a/mod/hostxrd.php +++ b/mod/hostxrd.php @@ -1,18 +1,21 @@ $a->get_hostname(), '$zroot' => System::baseUrl(), '$domain' => System::baseUrl(), - '$bigkey' => salmon_key(Config::get('system','site_pubkey')), - )); - exit(); + '$bigkey' => Salmon::salmonKey(Config::get('system', 'site_pubkey'))) + ); + exit(); } diff --git a/mod/hovercard.php b/mod/hovercard.php index 8ad5cd0ebe..29dfd26891 100644 --- a/mod/hovercard.php +++ b/mod/hovercard.php @@ -7,90 +7,87 @@ * Author: Rabuzarus * License: GNU AFFERO GENERAL PUBLIC LICENSE (Version 3) */ - use Friendica\App; use Friendica\Core\Config; use Friendica\Model\Contact; use Friendica\Model\GContact; -function hovercard_init(App $a) { +function hovercard_init(App $a) +{ // Just for testing purposes - $_GET["mode"] = "minimal"; + $_GET['mode'] = 'minimal'; } -function hovercard_content() { - $profileurl = (x($_REQUEST,'profileurl') ? $_REQUEST['profileurl'] : ""); - $datatype = (x($_REQUEST,'datatype') ?$_REQUEST['datatype'] : "json"); +function hovercard_content() +{ + $profileurl = defaults($_REQUEST, 'profileurl', ''); + $datatype = defaults($_REQUEST, 'datatype' , 'json'); // Get out if the system doesn't have public access allowed - if(intval(Config::get('system','block_public'))) + if (intval(Config::get('system', 'block_public'))) { http_status_exit(401); + } // Return the raw content of the template. We use this to make templates usable for js functions. // Look at hovercard.js (function getHoverCardTemplate()). - // This part should be moved in it's own module. Maybe we could make more templates accessabel. - // (We need to discuss possible security lacks before doing this) - if ($datatype == "tpl") { - $templatecontent = get_template_content("hovercard.tpl"); + // This part should be moved in its own module. Maybe we could make more templates accessible. + // (We need to discuss possible security leaks before doing this) + if ($datatype == 'tpl') { + $templatecontent = get_template_content('hovercard.tpl'); echo $templatecontent; killme(); } - // If a contact is connected the url is internally changed to "redir/CID". We need the pure url to search for + // If a contact is connected the url is internally changed to 'redir/CID'. We need the pure url to search for // the contact. So we strip out the contact id from the internal url and look in the contact table for // the real url (nurl) - if (local_user() && strpos($profileurl, "redir/") === 0) { + $cid = 0; + if (local_user() && strpos($profileurl, 'redir/') === 0) { $cid = intval(substr($profileurl, 6)); - $r = dba::select('contact', array('nurl', 'self'), array('id' => $cid), array('limit' => 1)); - $profileurl = ($r["nurl"] ? $r["nurl"] : ""); - $self = ($r["self"] ? $r["self"] : ""); + $r = dba::select('contact', array('nurl'), array('id' => $cid), array('limit' => 1)); + $profileurl = defaults($r, 'nurl', ''); } + $contact = []; // if it's the url containing https it should be converted to http $nurl = normalise_link(GContact::cleanContactUrl($profileurl)); - if($nurl) { + if ($nurl) { // Search for contact data $contact = Contact::getDetailsByURL($nurl); } - if(!is_array($contact)) + if (!count($contact)) { return; + } // Get the photo_menu - the menu if possible contact actions - if(local_user()) + if (local_user()) { $actions = Contact::photoMenu($contact); - + } // Move the contact data to the profile array so we can deliver it to - // $profile = array( - 'name' => $contact["name"], - 'nick' => $contact["nick"], - 'addr' => (($contact["addr"] != "") ? $contact["addr"] : $contact["url"]), - 'thumb' => proxy_url($contact["thumb"], false, PROXY_SIZE_THUMB), - 'url' => ($cid ? ("redir/".$cid) : zrl($contact["url"])), - 'nurl' => $contact["nurl"], // We additionally store the nurl as identifier -// 'alias' => $contact["alias"], - 'location' => $contact["location"], - 'gender' => $contact["gender"], - 'about' => $contact["about"], - 'network' => format_network_name($contact["network"], $contact["url"]), - 'tags' => $contact["keywords"], -// 'nsfw' => intval($contact["nsfw"]), -// 'server_url' => $contact["server_url"], - 'bd' => (($contact["birthday"] <= '0001-01-01') ? "" : $contact["birthday"]), -// 'generation' => $contact["generation"], + 'name' => $contact['name'], + 'nick' => $contact['nick'], + 'addr' => defaults($contact, 'addr', $contact['url']), + 'thumb' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB), + 'url' => $cid ? ('redir/' . $cid) : zrl($contact['url']), + 'nurl' => $contact['nurl'], // We additionally store the nurl as identifier + 'location' => $contact['location'], + 'gender' => $contact['gender'], + 'about' => $contact['about'], + 'network' => format_network_name($contact['network'], $contact['url']), + 'tags' => $contact['keywords'], + 'bd' => $contact['birthday'] <= '0001-01-01' ? '' : $contact['birthday'], 'account_type' => Contact::getAccountType($contact), - 'actions' => $actions, + 'actions' => $actions, ); - if($datatype == "html") { - $t = get_markup_template("hovercard.tpl"); - - $o = replace_macros($t, array( + if ($datatype == 'html') { + $tpl = get_markup_template('hovercard.tpl'); + $o = replace_macros($tpl, array( '$profile' => $profile, )); return $o; - } else { json_return_and_die($profile); } @@ -104,15 +101,15 @@ function hovercard_content() { * * @return string|bool Output the raw content if existent, otherwise false */ -function get_template_content($template, $root = "") { - +function get_template_content($template, $root = '') +{ // We load the whole template system to get the filename. // Maybe we can do it a little bit smarter if I get time. $t = get_markup_template($template, $root); $filename = $t->filename; // Get the content of the template file - if(file_exists($filename)) { + if (file_exists($filename)) { $content = file_get_contents($filename); return $content; diff --git a/mod/item.php b/mod/item.php index 13877fb356..1faef96016 100644 --- a/mod/item.php +++ b/mod/item.php @@ -29,7 +29,6 @@ use Friendica\Protocol\Diaspora; use Friendica\Protocol\Email; use Friendica\Util\Emailer; -require_once 'include/crypto.php'; require_once 'include/enotify.php'; require_once 'include/tags.php'; require_once 'include/files.php'; diff --git a/mod/message.php b/mod/message.php index eba1c9a62c..9e0cb32c0e 100644 --- a/mod/message.php +++ b/mod/message.php @@ -10,107 +10,104 @@ require_once 'include/acl_selectors.php'; require_once 'include/message.php'; require_once 'include/conversation.php'; -function message_init(App $a) { - +function message_init(App $a) +{ $tabs = ''; - if ($a->argc >1 && is_numeric($a->argv[1])) { - $tabs = render_messages(get_messages(local_user(),0,5), 'mail_list.tpl'); + if ($a->argc > 1 && is_numeric($a->argv[1])) { + $tabs = render_messages(get_messages(local_user(), 0, 5), 'mail_list.tpl'); } $new = array( 'label' => t('New Message'), 'url' => 'message/new', - 'sel'=> ($a->argv[1] == 'new'), + 'sel' => $a->argc > 1 && $a->argv[1] == 'new', 'accesskey' => 'm', ); $tpl = get_markup_template('message_side.tpl'); $a->page['aside'] = replace_macros($tpl, array( - '$tabs'=>$tabs, - '$new'=>$new, + '$tabs' => $tabs, + '$new' => $new, )); $base = System::baseUrl(); $head_tpl = get_markup_template('message-head.tpl'); - $a->page['htmlhead'] .= replace_macros($head_tpl,array( + $a->page['htmlhead'] .= replace_macros($head_tpl, array( '$baseurl' => System::baseUrl(true), '$base' => $base )); $end_tpl = get_markup_template('message-end.tpl'); - $a->page['end'] .= replace_macros($end_tpl,array( + $a->page['end'] .= replace_macros($end_tpl, array( '$baseurl' => System::baseUrl(true), '$base' => $base )); - } -function message_post(App $a) { - - if (! local_user()) { - notice( t('Permission denied.') . EOL); +function message_post(App $a) +{ + if (!local_user()) { + notice(t('Permission denied.') . EOL); return; } - $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : ''); - $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : ''); - $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : ''); - $recipient = ((x($_REQUEST,'messageto')) ? intval($_REQUEST['messageto']) : 0 ); + $replyto = x($_REQUEST, 'replyto') ? notags(trim($_REQUEST['replyto'])) : ''; + $subject = x($_REQUEST, 'subject') ? notags(trim($_REQUEST['subject'])) : ''; + $body = x($_REQUEST, 'body') ? escape_tags(trim($_REQUEST['body'])) : ''; + $recipient = x($_REQUEST, 'messageto') ? intval($_REQUEST['messageto']) : 0; $ret = send_message($recipient, $body, $subject, $replyto); $norecip = false; - switch($ret){ + switch ($ret) { case -1: - notice( t('No recipient selected.') . EOL ); + notice(t('No recipient selected.') . EOL); $norecip = true; break; case -2: - notice( t('Unable to locate contact information.') . EOL ); + notice(t('Unable to locate contact information.') . EOL); break; case -3: - notice( t('Message could not be sent.') . EOL ); + notice(t('Message could not be sent.') . EOL); break; case -4: - notice( t('Message collection failure.') . EOL ); + notice(t('Message collection failure.') . EOL); break; default: - info( t('Message sent.') . EOL ); + info(t('Message sent.') . EOL); } // fake it to go back to the input form if no recipient listed - if ($norecip) { $a->argc = 2; $a->argv[1] = 'new'; - } else + } else { goaway($_SESSION['return_url']); - + } } -function message_content(App $a) { - +function message_content(App $a) +{ $o = ''; nav_set_selected('messages'); - if (! local_user()) { - notice( t('Permission denied.') . EOL); + if (!local_user()) { + notice(t('Permission denied.') . EOL); return; } - $myprofile = System::baseUrl().'/profile/' . $a->user['nickname']; + $myprofile = System::baseUrl() . '/profile/' . $a->user['nickname']; $tpl = get_markup_template('mail_head.tpl'); $header = replace_macros($tpl, array( '$messages' => t('Messages'), - '$tab_content' => $tab_content )); - if (($a->argc == 3) && ($a->argv[1] === 'drop' || $a->argv[1] === 'dropconv')) { - if (! intval($a->argv[2])) + if (!intval($a->argv[2])) { return; + } // Check if we should do HTML-based delete confirmation if ($_REQUEST['confirm']) { @@ -118,7 +115,7 @@ function message_content(App $a) { // so add any arguments as hidden inputs $query = explode_querystring($a->query_string); $inputs = array(); - foreach($query['args'] as $arg) { + foreach ($query['args'] as $arg) { if (strpos($arg, 'confirm=') === false) { $arg_parts = explode('=', $arg); $inputs[] = array('name' => $arg_parts[0], 'value' => $arg_parts[1]); @@ -148,7 +145,7 @@ function message_content(App $a) { intval(local_user()) ); if ($r) { - info( t('Message deleted.') . EOL ); + info(t('Message deleted.') . EOL); } //goaway(System::baseUrl(true) . '/message' ); goaway($_SESSION['return_url']); @@ -170,24 +167,22 @@ function message_content(App $a) { // Actually if we do this, we can never receive another reply to that conversation, // as we will never again have the info we need to re-create it. // We'll just have to orphan it. - //if ($convid) { // q("delete from conv where id = %d limit 1", // intval($convid) // ); //} - if ($r) - info( t('Conversation removed.') . EOL ); + if ($r) { + info(t('Conversation removed.') . EOL); + } } //goaway(System::baseUrl(true) . '/message' ); goaway($_SESSION['return_url']); } - } if (($a->argc > 1) && ($a->argv[1] === 'new')) { - $o .= $header; $tpl = get_markup_template('msg-header.tpl'); @@ -204,8 +199,7 @@ function message_content(App $a) { '$linkurl' => t('Please enter a link URL:') )); - $preselect = (isset($a->argv[2])?array($a->argv[2]):false); - + $preselect = isset($a->argv[2]) ? array($a->argv[2]) : false; $prename = $preurl = $preid = ''; @@ -233,18 +227,18 @@ function message_content(App $a) { $preurl = $r[0]['url']; $preid = $r[0]['id']; $preselect = array($preid); - } else + } else { $preselect = false; + } } - $prefill = (($preselect) ? $prename : ''); + $prefill = $preselect ? $prename : ''; // the ugly select box - - $select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10); + $select = contact_select('messageto', 'message-to-select', $preselect, 4, true, false, false, 10); $tpl = get_markup_template('prv_message.tpl'); - $o .= replace_macros($tpl,array( + $o .= replace_macros($tpl, array( '$header' => t('Send Private Message'), '$to' => t('To:'), '$showinputs' => 'true', @@ -252,8 +246,8 @@ function message_content(App $a) { '$autocomp' => $autocomp, '$preid' => $preid, '$subject' => t('Subject:'), - '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''), - '$text' => ((x($_REQUEST,'body')) ? escape_tags(htmlspecialchars($_REQUEST['body'])) : ''), + '$subjtxt' => x($_REQUEST, 'subject') ? strip_tags($_REQUEST['subject']) : '', + '$text' => x($_REQUEST, 'body') ? escape_tags(htmlspecialchars($_REQUEST['body'])) : '', '$readonly' => '', '$yourmessage' => t('Your message:'), '$select' => $select, @@ -286,8 +280,8 @@ function message_content(App $a) { $r = get_messages(local_user(), $a->pager['start'], $a->pager['itemspage']); - if (! DBM::is_result($r)) { - info( t('No messages.') . EOL); + if (!DBM::is_result($r)) { + info(t('No messages.') . EOL); return $o; } @@ -325,8 +319,8 @@ function message_content(App $a) { intval(local_user()) ); } - if (! count($messages)) { - notice( t('Message not available.') . EOL ); + if (!count($messages)) { + notice(t('Message not available.') . EOL); return $o; } @@ -355,24 +349,24 @@ function message_content(App $a) { $seen = 0; $unknown = false; - foreach($messages as $message) { + foreach ($messages as $message) { if ($message['unknown']) $unknown = true; if ($message['from-url'] == $myprofile) { $from_url = $myprofile; $sparkle = ''; } elseif ($message['contact-id'] != 0) { - $from_url = 'redir/'.$message['contact-id']; + $from_url = 'redir/' . $message['contact-id']; $sparkle = ' sparkle'; } else { - $from_url = $message['from-url']."?zrl=".urlencode($myprofile); + $from_url = $message['from-url'] . "?zrl=" . urlencode($myprofile); $sparkle = ' sparkle'; } - $extracted = item_extract_images($message['body']); - if ($extracted['images']) + if ($extracted['images']) { $message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']); + } $from_name_e = $message['from-name']; $subject_e = $message['title']; @@ -380,10 +374,11 @@ function message_content(App $a) { $to_name_e = $message['name']; $contact = Contact::getDetailsByURL($message['from-url']); - if (isset($contact["thumb"])) + if (isset($contact["thumb"])) { $from_photo = $contact["thumb"]; - else + } else { $from_photo = $message['from-photo']; + } $mails[] = array( 'id' => $message['id'], @@ -396,26 +391,22 @@ function message_content(App $a) { 'body' => $body_e, 'delete' => t('Delete message'), 'to_name' => $to_name_e, - 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'), - 'ago' => relative_date($message['created']), + 'date' => datetime_convert('UTC', date_default_timezone_get(), $message['created'], 'D, d M Y - g:i A'), + 'ago' => relative_date($message['created']), ); $seen = $message['seen']; } - $select = $message['name'] . ''; $parent = ''; $tpl = get_markup_template('mail_display.tpl'); - - $subjtxt_e = $message['title']; - $o = replace_macros($tpl, array( '$thread_id' => $a->argv[1], '$thread_subject' => $message['title'], '$thread_seen' => $seen, - '$delete' => t('Delete conversation'), + '$delete' => t('Delete conversation'), '$canreply' => (($unknown) ? false : '1'), '$unknown_text' => t("No secure communications available. You may be able to respond from the sender's profile page."), '$mails' => $mails, @@ -425,7 +416,7 @@ function message_content(App $a) { '$to' => t('To:'), '$showinputs' => '', '$subject' => t('Subject:'), - '$subjtxt' => $subjtxt_e, + '$subjtxt' => $message['title'], '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ', '$yourmessage' => t('Your message:'), '$text' => '', @@ -435,14 +426,14 @@ function message_content(App $a) { '$insert' => t('Insert web link'), '$submit' => t('Submit'), '$wait' => t('Please wait') - )); return $o; } } -function get_messages($user, $lstart, $lend) { +function get_messages($user, $lstart, $lend) +{ //TODO: rewritte with a sub-query to get the first message of each private thread with certainty return q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`, ANY_VALUE(`mail`.`id`) AS `id`, ANY_VALUE(`mail`.`uid`) AS `uid`, ANY_VALUE(`mail`.`guid`) AS `guid`, @@ -461,33 +452,34 @@ function get_messages($user, $lstart, $lend) { ); } -function render_messages(array $msg, $t) { - +function render_messages(array $msg, $t) +{ $a = get_app(); $tpl = get_markup_template($t); $rslt = ''; - $myprofile = System::baseUrl().'/profile/' . $a->user['nickname']; + $myprofile = System::baseUrl() . '/profile/' . $a->user['nickname']; - foreach($msg as $rr) { - - if ($rr['unknown']) - $participants = sprintf( t("Unknown sender - %s"),$rr['from-name']); - elseif (link_compare($rr['from-url'], $myprofile)) - $participants = sprintf( t("You and %s"), $rr['name']); - else - $participants = sprintf(t("%s and You"), $rr['from-name']); + foreach ($msg as $rr) { + if ($rr['unknown']) { + $participants = t("Unknown sender - %s", $rr['from-name']); + } elseif (link_compare($rr['from-url'], $myprofile)) { + $participants = t("You and %s", $rr['name']); + } else { + $participants = t("%s and You", $rr['from-name']); + } $subject_e = (($rr['mailseen']) ? $rr['title'] : '' . $rr['title'] . ''); $body_e = $rr['body']; $to_name_e = $rr['name']; $contact = Contact::getDetailsByURL($rr['url']); - if (isset($contact["thumb"])) + if (isset($contact["thumb"])) { $from_photo = $contact["thumb"]; - else + } else { $from_photo = (($rr['thumb']) ? $rr['thumb'] : $rr['from-photo']); + } $rslt .= replace_macros($tpl, array( '$id' => $rr['id'], @@ -500,10 +492,10 @@ function render_messages(array $msg, $t) { '$delete' => t('Delete conversation'), '$body' => $body_e, '$to_name' => $to_name_e, - '$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A')), - '$ago' => relative_date($rr['mailcreated']), + '$date' => datetime_convert('UTC', date_default_timezone_get(), $rr['mailcreated'], t('D, d M Y - g:i A')), + '$ago' => relative_date($rr['mailcreated']), '$seen' => $rr['mailseen'], - '$count' => sprintf( tt('%d message', '%d messages', $rr['count']), $rr['count']), + '$count' => tt('%d message', '%d messages', $rr['count']), )); } diff --git a/mod/network.php b/mod/network.php index 1933c3d1e6..65b15cb03a 100644 --- a/mod/network.php +++ b/mod/network.php @@ -366,7 +366,7 @@ function networkConversation($a, $items, $mode, $update) { // Set this so that the conversation function can find out contact info for our wall-wall items $a->page_contact = $a->contact; - $o .= conversation($a, $items, $mode, $update); + $o = conversation($a, $items, $mode, $update); if (!$update) { if (PConfig::get(local_user(), 'system', 'infinite_scroll')) { @@ -568,9 +568,9 @@ function networkThreadedView(App $a, $update = 0) { if ($group) { if (($t = Contact::getOStatusCountByGroupId($group)) && !PConfig::get(local_user(), 'system', 'nowarn_insecure')) { - notice(sprintf(tt("Warning: This group contains %s member from a network that doesn't allow non public messages.", + notice(tt("Warning: This group contains %s member from a network that doesn't allow non public messages.", "Warning: This group contains %s members from a network that doesn't allow non public messages.", - $t), $t).EOL); + $t) . EOL); notice(t("Messages in this group won't be send to these receivers.").EOL); } } @@ -664,7 +664,7 @@ function networkThreadedView(App $a, $update = 0) { } $o = replace_macros(get_markup_template("section_title.tpl"),array( - '$title' => sprintf(t('Group: %s'), $r['name']) + '$title' => t('Group: %s', $r['name']) )) . $o; } elseif ($cid) { @@ -716,13 +716,6 @@ function networkThreadedView(App $a, $update = 0) { $sql_order = ""; $order_mode = "received"; - if (strlen($file)) { - $sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", - dbesc(protect_sprintf($file)), intval(TERM_OBJ_POST), intval(TERM_FILE), intval(local_user())); - $sql_order = "`item`.`id`"; - $order_mode = "id"; - } - if ($conv) { $sql_extra3 .= " AND $sql_table.`mention`"; } @@ -744,7 +737,7 @@ function networkThreadedView(App $a, $update = 0) { $sql_order = "$sql_table.$ordering"; } - if (($_GET["offset"] != "")) { + if (x($_GET, 'offset')) { $sql_extra3 .= sprintf(" AND $sql_order <= '%s'", dbesc($_GET["offset"])); } @@ -816,9 +809,10 @@ function networkThreadedView(App $a, $update = 0) { $parents_str = ''; $date_offset = ""; + $items = array(); if (DBM::is_result($r)) { foreach ($r as $rr) { - if (!in_array($rr['item_id'],$parents_arr)) { + if (!in_array($rr['item_id'], $parents_arr)) { $parents_arr[] = $rr['item_id']; } } @@ -833,12 +827,10 @@ function networkThreadedView(App $a, $update = 0) { $max_comments = 100; } - $items = array(); - foreach ($parents_arr AS $parents) { - $thread_items = dba::p(item_query()." AND `item`.`uid` = ? + $thread_items = dba::p(item_query() . " AND `item`.`uid` = ? AND `item`.`parent` = ? - ORDER BY `item`.`commented` DESC LIMIT ".intval($max_comments + 1), + ORDER BY `item`.`commented` DESC LIMIT " . intval($max_comments + 1), local_user(), $parents ); @@ -847,15 +839,15 @@ function networkThreadedView(App $a, $update = 0) { $items = array_merge($items, dba::inArray($thread_items)); } } - $items = conv_sort($items,$ordering); - } else { - $items = array(); + $items = conv_sort($items, $ordering); } - if ($_GET["offset"] == "") { + if (x($_GET, 'offset')) { + $date_offset = $_GET["offset"]; + } elseif(count($items)) { $date_offset = $items[0][$order_mode]; } else { - $date_offset = $_GET["offset"]; + $date_offset = ''; } $a->page_offset = $date_offset; diff --git a/mod/nogroup.php b/mod/nogroup.php index d80b6d3dbd..9f5425d9eb 100644 --- a/mod/nogroup.php +++ b/mod/nogroup.php @@ -41,28 +41,25 @@ function nogroup_content(App $a) $contact_details = Contact::getDetailsByURL($rr['url'], local_user(), $rr); $contacts[] = array( - 'img_hover' => sprintf(t('Visit %s\'s profile [%s]'), $contact_details['name'], $rr['url']), + 'img_hover' => t('Visit %s\'s profile [%s]', $contact_details['name'], $rr['url']), 'edit_hover' => t('Edit contact'), 'photo_menu' => Contact::photoMenu($rr), 'id' => $rr['id'], - 'alt_text' => $alt_text, - 'dir_icon' => $dir_icon, 'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB), 'name' => $contact_details['name'], 'username' => $contact_details['name'], 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'sparkle' => $sparkle, 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']), 'url' => $rr['url'], - 'network' => network_to_name($rr['network'], $url), + 'network' => network_to_name($rr['network'], $rr['url']), ); } } $tpl = get_markup_template("nogroup-template.tpl"); - $o .= replace_macros( + $o = replace_macros( $tpl, array( '$header' => t('Contacts who are not members of a group'), diff --git a/mod/oembed.php b/mod/oembed.php deleted file mode 100644 index 3266ad963e..0000000000 --- a/mod/oembed.php +++ /dev/null @@ -1,38 +0,0 @@ -query_string, LOGGER_ALL); - - if ($a->argv[1]=='b2h'){ - $url = array( "", trim(hex2bin($_REQUEST['url']))); - echo oembed_replacecb($url); - killme(); - } - - if ($a->argv[1]=='h2b'){ - $text = trim(hex2bin($_REQUEST['text'])); - echo oembed_html2bbcode($text); - killme(); - } - - if ($a->argc == 2){ - echo ""; - $url = base64url_decode($a->argv[1]); - $j = oembed_fetch_url($url); - - // workaround for media.ccc.de (and any other endpoint that return size 0) - if (substr($j->html, 0, 7) == "html, 'width="0"')) { - $j->html = ''. $j->html; - $j->html = str_replace('width="0"', '', $j->html); - $j->html = str_replace('height="0"', '', $j->html); - } - echo $j->html; -// logger('mod-oembed ' . $j->html, LOGGER_ALL); - echo ""; - } - killme(); -} diff --git a/mod/photo.php b/mod/photo.php index 243dfda029..dc7d856783 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -1,4 +1,5 @@ $e) { - $uid = str_replace('.'.$e, '', $uid); + $uid = str_replace('.' . $e, '', $uid); } $r = q("SELECT * FROM `photo` WHERE `scale` = %d AND `uid` = %d AND `profile` = 1 LIMIT 1", @@ -92,16 +90,12 @@ function photo_init(App $a) { $mimetype = 'image/jpeg'; } } else { - - /** - * Other photos - */ - + // Other photos $resolution = 0; $photo = str_replace(array('.jpg', '.png', '.gif'), array('', '', ''), $photo); foreach (Image::supportedTypes() AS $m => $e) { - $photo = str_replace('.'.$e, '', $photo); + $photo = str_replace('.' . $e, '', $photo); } if (substr($photo, -2, 1) == '-') { @@ -115,22 +109,18 @@ function photo_init(App $a) { intval($resolution) ); if (DBM::is_result($r)) { - $sql_extra = permissions_sql($r[0]['uid']); // Now we'll see if we can access the photo - $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1", dbesc($photo), intval($resolution) ); - - $public = (DBM::is_result($r)) && ($r[0]['allow_cid'] == '') && ($r[0]['allow_gid'] == '') && ($r[0]['deny_cid'] == '') && ($r[0]['deny_gid'] == ''); - if (DBM::is_result($r)) { $resolution = $r[0]['scale']; $data = $r[0]['data']; $mimetype = $r[0]['type']; + $public = $r[0]['allow_cid'] == '' && $r[0]['allow_gid'] == '' && $r[0]['deny_cid'] == '' && $r[0]['deny_gid'] == ''; } else { // The picure exists. We already checked with the first query. // obviously, this is not an authorized viev! @@ -145,7 +135,6 @@ function photo_init(App $a) { if (empty($data)) { if (isset($resolution)) { switch ($resolution) { - case 4: $data = file_get_contents('images/person-175.jpg'); $mimetype = 'image/jpeg'; @@ -167,7 +156,7 @@ function photo_init(App $a) { } // Resize only if its not a GIF and it is supported by the library - if (($mimetype != "image/gif") && in_array($mimetype, Image::supportedTypes())) { + if ($mimetype != "image/gif" && in_array($mimetype, Image::supportedTypes())) { $Image = new Image($data, $mimetype); if ($Image->isValid()) { if (isset($customres) && $customres > 0 && $customres < 500) { @@ -183,36 +172,33 @@ function photo_init(App $a) { header_remove('pragma'); } - header("Content-type: ".$mimetype); + header("Content-type: " . $mimetype); if ($prvcachecontrol) { - // it is a private photo that they have no permission to view. // tell the browser not to cache it, in case they authenticate // and subsequently have permission to see it - header("Cache-Control: no-store, no-cache, must-revalidate"); - } else { header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT"); - header('Etag: "'.md5($data).'"'); - header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT"); + header('Etag: "' . md5($data) . '"'); + header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT"); header("Cache-Control: max-age=31536000"); } echo $data; // If the photo is public and there is an existing photo directory store the photo there - if ($public and ($file != "")) { + if ($public and $file != '') { // If the photo path isn't there, try to create it $basepath = $a->get_basepath(); - if (!is_dir($basepath."/photo")) { + if (!is_dir($basepath . "/photo")) { if (is_writable($basepath)) { - mkdir($basepath."/photo"); + mkdir($basepath . "/photo"); } } - if (is_dir($basepath."/photo")) { - file_put_contents($basepath."/photo/".$file, $data); + if (is_dir($basepath . "/photo")) { + file_put_contents($basepath . "/photo/" . $file, $data); } } diff --git a/mod/photos.php b/mod/photos.php index 68b9752b5e..460deba25d 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -55,12 +55,12 @@ function photos_init(App $a) { $tpl = get_markup_template("vcard-widget.tpl"); - $vcard_widget .= replace_macros($tpl, array( + $vcard_widget = replace_macros($tpl, array( '$name' => $profile['name'], '$photo' => $profile['photo'], - '$addr' => (($profile['addr'] != "") ? $profile['addr'] : ""), + '$addr' => defaults($profile, 'addr', ''), '$account_type' => $account_type, - '$pdesc' => (($profile['pdesc'] != "") ? $profile['pdesc'] : ""), + '$pdesc' => defaults($profile, 'pdesc', ''), )); $albums = photo_albums($a->data['user']['uid']); @@ -92,18 +92,16 @@ function photos_init(App $a) { } } - $albums = $ret; - if (local_user() && $a->data['user']['uid'] == local_user()) { $can_post = true; } - if ($albums['success']) { + if ($ret['success']) { $photo_albums_widget = replace_macros(get_markup_template('photo_albums.tpl'), array( '$nick' => $a->data['user']['nickname'], '$title' => t('Photo Albums'), '$recent' => t('Recent Photos'), - '$albums' => $albums['albums'], + '$albums' => $ret['albums'], '$baseurl' => System::baseUrl(), '$upload' => array(t('Upload New Photos'), 'photos/' . $a->data['user']['nickname'] . '/upload'), '$can_post' => $can_post @@ -117,26 +115,20 @@ function photos_init(App $a) { $a->page['aside'] .= $vcard_widget; $a->page['aside'] .= $photo_albums_widget; - $tpl = get_markup_template("photos_head.tpl"); $a->page['htmlhead'] .= replace_macros($tpl,array( '$ispublic' => t('everybody') )); - } return; } - - -function photos_post(App $a) { - +function photos_post(App $a) +{ logger('mod-photos: photos_post: begin' , LOGGER_DEBUG); - - - logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA); - logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA); + logger('mod_photos: REQUEST ' . print_r($_REQUEST, true), LOGGER_DATA); + logger('mod_photos: FILES ' . print_r($_FILES, true), LOGGER_DATA); $phototypes = Image::supportedTypes(); @@ -144,14 +136,14 @@ function photos_post(App $a) { $visitor = 0; $page_owner_uid = $a->data['user']['uid']; - $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false); + $community_page = $a->data['user']['page-flags'] == PAGE_COMMUNITY; if (local_user() && (local_user() == $page_owner_uid)) { $can_post = true; } else { if ($community_page && remote_user()) { $contact_id = 0; - if (is_array($_SESSION['remote'])) { + if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) { foreach ($_SESSION['remote'] as $v) { if ($v['uid'] == $page_owner_uid) { $contact_id = $v['cid']; @@ -160,7 +152,6 @@ function photos_post(App $a) { } } if ($contact_id) { - $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1", intval($contact_id), intval($page_owner_uid) @@ -191,8 +182,7 @@ function photos_post(App $a) { $owner_record = $r[0]; - - if (($a->argc > 3) && ($a->argv[2] === 'album')) { + if ($a->argc > 3 && $a->argv[2] === 'album') { $album = hex2bin($a->argv[3]); if ($album === t('Profile Photos') || $album === 'Contact Photos' || $album === t('Contact Photos')) { @@ -215,10 +205,7 @@ function photos_post(App $a) { goaway($_SESSION['photo_return']); } - /* - * RENAME photo album - */ - + // RENAME photo album $newalbum = notags(trim($_POST['albumname'])); if ($newalbum != $album) { q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d", @@ -229,7 +216,7 @@ function photos_post(App $a) { // Update the photo albums cache photo_albums($page_owner_uid, true); - $newurl = str_replace(bin2hex($album),bin2hex($newalbum),$_SESSION['photo_return']); + $newurl = str_replace(bin2hex($album), bin2hex($newalbum), $_SESSION['photo_return']); goaway($newurl); return; // NOTREACHED } @@ -239,9 +226,8 @@ function photos_post(App $a) { */ if ($_POST['dropalbum'] == t('Delete Album')) { - // Check if we should do HTML-based delete confirmation - if ($_REQUEST['confirm']) { + if (x($_REQUEST, 'confirm')) { $drop_url = $a->query_string; $extra_inputs = array( array('name' => 'albumname', 'value' => $_POST['albumname']), @@ -287,14 +273,12 @@ function photos_post(App $a) { $str_res = implode(',', $res); // remove the associated photos - q("DELETE FROM `photo` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d", intval($page_owner_uid) ); // find and delete the corresponding item with all the comments and likes/dislikes - - $r = q("SELECT `parent-uri` FROM `item` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d", + $r = q("SELECT `id`, `parent-uri`, `visible` FROM `item` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d", intval($page_owner_uid) ); if (DBM::is_result($r)) { @@ -310,7 +294,6 @@ function photos_post(App $a) { $drop_id = intval($rr['id']); // send the notification upstream/downstream as the case may be - if ($rr['visible']) { Worker::add(PRIORITY_HIGH, "Notifier", "drop", $drop_id); } @@ -327,16 +310,16 @@ function photos_post(App $a) { // Check if the user has responded to a delete confirmation query for a single photo - if (($a->argc > 2) && $_REQUEST['canceled']) { + if ($a->argc > 2 && x($_REQUEST, 'canceled')) { goaway($_SESSION['photo_return']); } - if (($a->argc > 2) && (x($_POST,'delete')) && ($_POST['delete'] == t('Delete Photo'))) { + if ($a->argc > 2 && defaults($_POST, 'delete', '') === t('Delete Photo')) { // same as above but remove single photo // Check if we should do HTML-based delete confirmation - if ($_REQUEST['confirm']) { + if (x($_REQUEST, 'confirm')) { $drop_url = $a->query_string; $a->page['content'] = replace_macros(get_markup_template('confirm.tpl'), array( '$method' => 'post', @@ -368,7 +351,7 @@ function photos_post(App $a) { intval($page_owner_uid), dbesc($r[0]['resource-id']) ); - $i = q("SELECT * FROM `item` WHERE `resource-id` = '%s' AND `uid` = %d LIMIT 1", + $i = q("SELECT `id`, `uri`, `visible` FROM `item` WHERE `resource-id` = '%s' AND `uid` = %d LIMIT 1", dbesc($r[0]['resource-id']), intval($page_owner_uid) ); @@ -398,13 +381,12 @@ function photos_post(App $a) { return; // NOTREACHED } - if (($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) { - - $desc = (x($_POST,'desc') ? notags(trim($_POST['desc'])) : ''); - $rawtags = (x($_POST,'newtag') ? notags(trim($_POST['newtag'])) : ''); - $item_id = (x($_POST,'item_id') ? intval($_POST['item_id']) : 0); - $albname = (x($_POST,'albname') ? notags(trim($_POST['albname'])) : ''); - $origaname = (x($_POST,'origaname') ? notags(trim($_POST['origaname'])) : ''); + if ($a->argc > 2 && (x($_POST, 'desc') !== false || x($_POST, 'newtag') !== false || x($_POST, 'albname') !== false)) { + $desc = x($_POST, 'desc') ? notags(trim($_POST['desc'])) : ''; + $rawtags = x($_POST, 'newtag') ? notags(trim($_POST['newtag'])) : ''; + $item_id = x($_POST, 'item_id') ? intval($_POST['item_id']) : 0; + $albname = x($_POST, 'albname') ? notags(trim($_POST['albname'])) : ''; + $origaname = x($_POST, 'origaname') ? notags(trim($_POST['origaname'])) : ''; $str_group_allow = perms2str($_POST['group_allow']); $str_contact_allow = perms2str($_POST['contact_allow']); $str_group_deny = perms2str($_POST['group_deny']); @@ -416,9 +398,8 @@ function photos_post(App $a) { $albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y'); } - - if ((x($_POST,'rotate') !== false) && - ( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) { + if (x($_POST,'rotate') !== false && + (intval($_POST['rotate']) == 1 || intval($_POST['rotate']) == 2)) { logger('rotate'); $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d AND `scale` = 0 LIMIT 1", @@ -504,9 +485,7 @@ function photos_post(App $a) { } if (!$item_id) { - // Create item container - $title = ''; $uri = item_new_uri($a->get_hostname(),$page_owner_uid); @@ -539,7 +518,6 @@ function photos_post(App $a) { . '[/url]'; $item_id = item_store($arr); - } if ($item_id) { @@ -554,13 +532,11 @@ function photos_post(App $a) { } if (strlen($rawtags)) { - $str_tags = ''; $inform = ''; // if the new tag doesn't have a namespace specifier (@foo or #foo) give it a hashtag - - $x = substr($rawtags,0,1); + $x = substr($rawtags, 0, 1); if ($x !== '@' && $x !== '#') { $rawtags = '#' . $rawtags; } @@ -570,10 +546,8 @@ function photos_post(App $a) { if (count($tags)) { foreach ($tags as $tag) { - if (isset($profile)) { - unset($profile); - } if (strpos($tag, '@') === 0) { + $profile = ''; $name = substr($tag,1); if ((strpos($name, '@')) || (strpos($name, 'http://'))) { $newname = $name; @@ -691,8 +665,7 @@ function photos_post(App $a) { if (count($taginfo)) { foreach ($taginfo as $tagged) { - - $uri = item_new_uri($a->get_hostname(),$page_owner_uid); + $uri = item_new_uri($a->get_hostname(), $page_owner_uid); $arr = array(); $arr['guid'] = get_guid(32); @@ -747,18 +720,12 @@ function photos_post(App $a) { } - /** - * default post action - upload a photo - */ - + // default post action - upload a photo call_hooks('photo_post_init', $_POST); - /** - * Determine the album to use - */ - - $album = notags(trim($_REQUEST['album'])); - $newalbum = notags(trim($_REQUEST['newalbum'])); + // Determine the album to use + $album = x($_REQUEST, 'album') ? notags(trim($_REQUEST['album'])) : ''; + $newalbum = x($_REQUEST, 'newalbum') ? notags(trim($_REQUEST['newalbum'])) : ''; logger('mod/photos.php: photos_post(): album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG); @@ -788,51 +755,85 @@ function photos_post(App $a) { $visible = 0; } - if (intval($_REQUEST['not_visible']) || $_REQUEST['not_visible'] === 'true') { + if (x($_REQUEST, 'not_visible') && $_REQUEST['not_visible'] !== 'false') { $visible = 0; } - $str_group_allow = perms2str((is_array($_REQUEST['group_allow']) ? $_REQUEST['group_allow'] : explode(',', $_REQUEST['group_allow']))); - $str_contact_allow = perms2str((is_array($_REQUEST['contact_allow']) ? $_REQUEST['contact_allow'] : explode(',', $_REQUEST['contact_allow']))); - $str_group_deny = perms2str((is_array($_REQUEST['group_deny']) ? $_REQUEST['group_deny'] : explode(',', $_REQUEST['group_deny']))); - $str_contact_deny = perms2str((is_array($_REQUEST['contact_deny']) ? $_REQUEST['contact_deny'] : explode(',', $_REQUEST['contact_deny']))); + $group_allow = defaults($_REQUEST, 'group_allow' , []); + $contact_allow = defaults($_REQUEST, 'contact_allow', []); + $group_deny = defaults($_REQUEST, 'group_deny' , []); + $contact_deny = defaults($_REQUEST, 'contact_deny' , []); + + $str_group_allow = perms2str(is_array($group_allow) ? $group_allow : explode(',', $group_allow)); + $str_contact_allow = perms2str(is_array($contact_allow) ? $contact_allow : explode(',', $contact_allow)); + $str_group_deny = perms2str(is_array($group_deny) ? $group_deny : explode(',', $group_deny)); + $str_contact_deny = perms2str(is_array($contact_deny) ? $contact_deny : explode(',', $contact_deny)); $ret = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''); - call_hooks('photo_post_file',$ret); + call_hooks('photo_post_file', $ret); - if (x($ret,'src') && x($ret,'filesize')) { + if (x($ret, 'src') && x($ret, 'filesize')) { $src = $ret['src']; $filename = $ret['filename']; $filesize = $ret['filesize']; $type = $ret['type']; + $error = UPLOAD_ERR_OK; } else { - $src = $_FILES['userfile']['tmp_name']; - $filename = basename($_FILES['userfile']['name']); - $filesize = intval($_FILES['userfile']['size']); - $type = $_FILES['userfile']['type']; + $src = $_FILES['userfile']['tmp_name']; + $filename = basename($_FILES['userfile']['name']); + $filesize = intval($_FILES['userfile']['size']); + $type = $_FILES['userfile']['type']; + $error = $_FILES['userfile']['error']; } + + if ($error !== UPLOAD_ERR_OK) { + switch ($error) { + case UPLOAD_ERR_INI_SIZE: + notice(t('Image exceeds size limit of %s', ini_get('upload_max_filesize')) . EOL); + break; + case UPLOAD_ERR_FORM_SIZE: + notice(t('Image exceeds size limit of %s', formatBytes(defaults($_REQUEST, 'MAX_FILE_SIZE', 0))) . EOL); + break; + case UPLOAD_ERR_PARTIAL: + notice(t('Image upload didn\'t complete, please try again') . EOL); + break; + case UPLOAD_ERR_NO_FILE: + notice(t('Image file is missing') . EOL); + break; + case UPLOAD_ERR_NO_TMP_DIR: + case UPLOAD_ERR_CANT_WRITE: + case UPLOAD_ERR_EXTENSION: + notice(t('Server can\'t accept new file upload at this time, please contact your administrator') . EOL); + break; + } + @unlink($src); + $foo = 0; + call_hooks('photo_post_end', $foo); + return; + } + if ($type == "") { $type = Image::guessType($filename); } logger('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', LOGGER_DEBUG); - $maximagesize = Config::get('system','maximagesize'); + $maximagesize = Config::get('system', 'maximagesize'); if ($maximagesize && ($filesize > $maximagesize)) { - notice( sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)) . EOL); + notice(t('Image exceeds size limit of %s', formatBytes($maximagesize)) . EOL); @unlink($src); $foo = 0; - call_hooks('photo_post_end',$foo); + call_hooks('photo_post_end', $foo); return; } if (!$filesize) { - notice( t('Image file is empty.') . EOL); + notice(t('Image file is empty.') . EOL); @unlink($src); $foo = 0; - call_hooks('photo_post_end',$foo); + call_hooks('photo_post_end', $foo); return; } @@ -844,7 +845,7 @@ function photos_post(App $a) { if (!$Image->isValid()) { logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG); - notice( t('Unable to process image.') . EOL ); + notice(t('Unable to process image.') . EOL); @unlink($src); $foo = 0; call_hooks('photo_post_end',$foo); @@ -873,7 +874,7 @@ function photos_post(App $a) { if (!$r) { logger('mod/photos.php: photos_post(): image store failed' , LOGGER_DEBUG); - notice( t('Image upload failed.') . EOL ); + notice(t('Image upload failed.') . EOL); killme(); } @@ -889,23 +890,16 @@ function photos_post(App $a) { $smallest = 2; } - $basename = basename($filename); $uri = item_new_uri($a->get_hostname(), $page_owner_uid); // Create item container - $lat = $lon = null; - - /// @TODO merge these 2 if() into one? - if ($exif && $exif['GPS']) { - if (Feature::isEnabled($channel_id,'photo_location')) { - $lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']); - $lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']); - } + if ($exif && $exif['GPS'] && Feature::isEnabled($channel_id, 'photo_location')) { + $lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']); + $lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']); } $arr = array(); - if ($lat && $lon) { $arr['coord'] = $lat . ' ' . $lon; } @@ -947,17 +941,15 @@ function photos_post(App $a) { call_hooks('photo_post_end',intval($item_id)); - /* - * addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook - * if they do not wish to be redirected - */ + // addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook + // if they do not wish to be redirected goaway($_SESSION['photo_return']); // NOTREACHED } -function photos_content(App $a) { - +function photos_content(App $a) +{ // URLs: // photos/name // photos/name/upload @@ -967,7 +959,6 @@ function photos_content(App $a) { // photos/name/image/xxxxx // photos/name/image/xxxxx/edit - if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { notice( t('Public access denied.') . EOL); return; @@ -986,10 +977,8 @@ function photos_content(App $a) { $_SESSION['photo_return'] = $a->cmd; - // // Parse arguments - // - + $datum = null; if ($a->argc > 3) { $datatype = $a->argv[2]; $datum = $a->argv[3]; @@ -1005,10 +994,7 @@ function photos_content(App $a) { $cmd = 'view'; } - // // Setup permissions structures - // - $can_post = false; $visitor = 0; $contact = null; @@ -1047,8 +1033,9 @@ function photos_content(App $a) { } } - // perhaps they're visiting - but not a community page, so they wouldn't have write access + $groups = []; + // perhaps they're visiting - but not a community page, so they wouldn't have write access if (remote_user() && !$visitor) { $contact_id = 0; if (is_array($_SESSION['remote'])) { @@ -1072,12 +1059,9 @@ function photos_content(App $a) { } } - /// @TODO merge these 2 if() into one? - if (!$remote_contact) { - if (local_user()) { - $contact_id = $_SESSION['cid']; - $contact = $a->contact; - } + if (!$remote_contact && local_user()) { + $contact_id = $_SESSION['cid']; + $contact = $a->contact; } if ($a->data['user']['hidewall'] && (local_user() != $owner_uid) && !$remote_contact) { @@ -1085,7 +1069,7 @@ function photos_content(App $a) { return; } - $sql_extra = permissions_sql($owner_uid,$remote_contact,$groups); + $sql_extra = permissions_sql($owner_uid, $remote_contact, $groups); $o = ""; @@ -1093,23 +1077,17 @@ function photos_content(App $a) { $is_owner = (local_user() && (local_user() == $owner_uid)); $o .= profile_tabs($a, $is_owner, $a->data['user']['nickname']); - /** - * Display upload form - */ - + // Display upload form if ($datatype === 'upload') { if (!$can_post) { notice(t('Permission denied.')); return; } - - $selname = ($datum ? hex2bin($datum) : ''); - + $selname = $datum ? hex2bin($datum) : ''; $albumselect = ''; - $albumselect .= ''; if (count($a->data['albums'])) { foreach ($a->data['albums'] as $album) { @@ -1136,31 +1114,8 @@ function photos_content(App $a) { $usage_message = ''; - // Private/public post links for the non-JS ACL form - $private_post = 1; - if ($_REQUEST['public']) { - $private_post = 0; - } - - $query_str = $a->query_string; - if (strpos($query_str, 'public=1') !== false) { - $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str); - } - - /* - * I think $a->query_string may never have ? in it, but I could be wrong - * It looks like it's from the index.php?q=[etc] rewrite that the web - * server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61 - */ - if (strpos($query_str, '?') === false) { - $public_post_link = '?public=1'; - } else { - $public_post_link = '&public=1'; - } - $tpl = get_markup_template('photos_upload.tpl'); - $albumselect_e = $albumselect; $aclselect_e = ($visitor ? '' : populate_acl($a->user)); $o .= replace_macros($tpl,array( @@ -1171,7 +1126,7 @@ function photos_content(App $a) { '$newalbum' => t('New album name: '), '$existalbumtext' => t('or existing album name: '), '$nosharetext' => t('Do not show a status post for this upload'), - '$albumselect' => $albumselect_e, + '$albumselect' => $albumselect, '$permissions' => t('Permissions'), '$aclselect' => $aclselect_e, '$alt_uploader' => $ret['addon_text'], @@ -1183,23 +1138,14 @@ function photos_content(App $a) { '$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector '$group_perms' => t('Show to Groups'), '$contact_perms' => t('Show to Contacts'), - '$private' => t('Private Photo'), - '$public' => t('Public Photo'), - '$is_private' => $private_post, - '$return_path' => $query_str, - '$public_link' => $public_post_link, - + '$return_path' => $a->query_string, )); return $o; } - /* - * Display a single photo album - */ - + // Display a single photo album if ($datatype === 'album') { - $album = hex2bin($datum); $r = q("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s' @@ -1213,7 +1159,8 @@ function photos_content(App $a) { } /// @TODO I have seen this many times, maybe generalize it script-wide and encapsulate it? - if ($_GET['order'] === 'posted') { + $order_field = defaults($_GET, 'order', ''); + if ($order_field === 'posted') { $order = 'ASC'; } else { $order = 'DESC'; @@ -1254,7 +1201,7 @@ function photos_content(App $a) { } } - if ($_GET['order'] === 'posted') { + if ($order_field === 'posted') { $order = array(t('Show Newest First'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album)); } else { $order = array(t('Show Oldest First'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '?f=&order=posted'); @@ -1262,7 +1209,7 @@ function photos_content(App $a) { $photos = array(); - if (DBM::is_result($r)) + if (DBM::is_result($r)) { // "Twist" is only used for the duepunto theme with style "slackr" $twist = false; foreach ($r as $rr) { @@ -1277,14 +1224,15 @@ function photos_content(App $a) { 'id' => $rr['id'], 'twist' => ' ' . ($twist ? 'rotleft' : 'rotright') . rand(2,4), 'link' => 'photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'] - . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''), + . ($order_field === 'posted' ? '?f=&order=posted' : ''), 'title' => t('View Photo'), 'src' => 'photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.' .$ext, 'alt' => $imgalt_e, 'desc'=> $desc_e, 'ext' => $ext, - 'hash'=> $rr['resource_id'], + 'hash'=> $rr['resource-id'], ); + } } $tpl = get_markup_template('photo_album.tpl'); @@ -1302,14 +1250,9 @@ function photos_content(App $a) { } - /* - * Display one photo - */ + // Display one photo if ($datatype === 'image') { - - //$o = ''; // fetch image, item containing image, then comments - $ph = q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' $sql_extra ORDER BY `scale` ASC ", intval($owner_uid), @@ -1337,7 +1280,8 @@ function photos_content(App $a) { // The query leads to a really intense used index. // By now we hide it if someone wants to. if (!Config::get('system', 'no_count', false)) { - if ($_GET['order'] === 'posted') { + $order_field = defaults($_GET, 'order', ''); + if ($order_field === 'posted') { $order = 'ASC'; } else { $order = 'DESC'; @@ -1364,8 +1308,8 @@ function photos_content(App $a) { } } $edit_suffix = ((($cmd === 'edit') && $can_post) ? '/edit' : ''); - $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''); - $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''); + $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : ''); + $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : ''); } } @@ -1439,6 +1383,7 @@ function photos_content(App $a) { ); $map = null; + $link_item = []; if (DBM::is_result($linked_items)) { $link_item = $linked_items[0]; @@ -1512,31 +1457,9 @@ function photos_content(App $a) { $edit = Null; - if (($cmd === 'edit') && $can_post) { + if ($cmd === 'edit' && $can_post) { $edit_tpl = get_markup_template('photo_edit.tpl'); - // Private/public post links for the non-JS ACL form - $private_post = 1; - if ($_REQUEST['public']) { - $private_post = 0; - } - - $query_str = $a->query_string; - if (strpos($query_str, 'public=1') !== false) { - $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str); - } - - /* - * I think $a->query_string may never have ? in it, but I could be wrong - * It looks like it's from the index.php?q=[etc] rewrite that the web - * server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61 - */ - if (strpos($query_str, '?') === false) { - $public_post_link = '?public=1'; - } else { - $public_post_link = '&public=1'; - } - $album_e = $ph[0]['album']; $caption_e = $ph[0]['desc']; $aclselect_e = populate_acl($ph[0]); @@ -1555,7 +1478,7 @@ function photos_content(App $a) { '$permissions' => t('Permissions'), '$aclselect' => $aclselect_e, - '$item_id' => (count($linked_items) ? $link_item['id'] : 0), + '$item_id' => defaults($link_item, 'id', 0), '$submit' => t('Submit'), '$delete' => t('Delete Photo'), @@ -1563,25 +1486,24 @@ function photos_content(App $a) { '$acl_data' => construct_acl_data($a, $ph[0]), // For non-Javascript ACL selector '$group_perms' => t('Show to Groups'), '$contact_perms' => t('Show to Contacts'), - '$private' => t('Private photo'), - '$public' => t('Public photo'), - '$is_private' => $private_post, - '$return_path' => $query_str, - '$public_link' => $public_post_link, + '$return_path' => $a->query_string, )); } - if (count($linked_items)) { + $like = ''; + $dislike = ''; + $likebuttons = ''; + $comments = ''; + $paginate = ''; + $responses = ''; + if (count($linked_items)) { $cmnt_tpl = get_markup_template('comment_item.tpl'); $tpl = get_markup_template('photo_item.tpl'); $return_url = $a->cmd; - $like_tpl = get_markup_template('like_noshare.tpl'); - - $likebuttons = ''; - if ($can_post || can_write_wall($a, $owner_uid)) { + $like_tpl = get_markup_template('like_noshare.tpl'); $likebuttons = replace_macros($like_tpl, array( '$id' => $link_item['id'], '$likethis' => t("I like this \x28toggle\x29"), @@ -1591,7 +1513,6 @@ function photos_content(App $a) { )); } - $comments = ''; if (!DBM::is_result($r)) { if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) { $comments .= replace_macros($cmnt_tpl, array( @@ -1614,12 +1535,6 @@ function photos_content(App $a) { } } - $alike = array(); - $dlike = array(); - - $like = ''; - $dislike = ''; - $conv_responses = array( 'like' => array('title' => t('Likes','title')),'dislike' => array('title' => t('Dislikes','title')), 'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title')) @@ -1627,13 +1542,16 @@ function photos_content(App $a) { // display comments if (DBM::is_result($r)) { - foreach ($r as $item) { builtin_activity_puller($item, $conv_responses); } - $like = (x($conv_responses['like'], $link_item['uri']) ? format_like($conv_responses['like'][$link_item['uri']], $conv_responses['like'][$link_item['uri'] . '-l'], 'like',$link_item['id']) : ''); - $dislike = (x($conv_responses['dislike'], $link_item['uri']) ? format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike',$link_item['id']) : ''); + if (x($conv_responses['like'], $link_item['uri'])) { + $like = format_like($conv_responses['like'][$link_item['uri']], $conv_responses['like'][$link_item['uri'] . '-l'], 'like', $link_item['id']); + } + if (x($conv_responses['dislike'], $link_item['uri'])) { + $dislike = format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike', $link_item['id']); + } if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) { $comments .= replace_macros($cmnt_tpl,array( @@ -1655,18 +1573,17 @@ function photos_content(App $a) { )); } - foreach ($r as $item) { $comment = ''; $template = $tpl; $sparkle = ''; - if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && ($item['id'] != $item['parent'])) + if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && ($item['id'] != $item['parent'])) { continue; + } $redirect_url = 'redir/' . $item['cid']; - if (local_user() && ($item['contact-uid'] == local_user()) && ($item['network'] == NETWORK_DFRN) && !$item['self']) { $profile_url = $redirect_url; @@ -1730,40 +1647,32 @@ function photos_content(App $a) { } } } + $response_verbs = array('like'); + if (Feature::isEnabled($owner_uid, 'dislike')) { + $response_verbs[] = 'dislike'; + } + $responses = get_responses($conv_responses, $response_verbs, '', $link_item); $paginate = paginate($a); } - - $response_verbs = array('like'); - if (Feature::isEnabled($owner_uid, 'dislike')) { - $response_verbs[] = 'dislike'; - } - $responses = get_responses($conv_responses,$response_verbs, '', $link_item); - $photo_tpl = get_markup_template('photo_view.tpl'); - - $album_e = array($album_link, $ph[0]['album']); - $tags_e = $tags; - $like_e = $like; - $dislike_e = $dislike; - $o .= replace_macros($photo_tpl, array( '$id' => $ph[0]['id'], - '$album' => $album_e, + '$album' => [$album_link, $ph[0]['album']], '$tools' => $tools, '$lock' => $lock, '$photo' => $photo, '$prevlink' => $prevlink, '$nextlink' => $nextlink, '$desc' => $ph[0]['desc'], - '$tags' => $tags_e, + '$tags' => $tags, '$edit' => $edit, '$map' => $map, '$map_text' => t('Map'), '$likebuttons' => $likebuttons, - '$like' => $like_e, - '$dislike' => $dikslike_e, + '$like' => $like, + '$dislike' => $dislike, 'responses' => $responses, '$comments' => $comments, '$paginate' => $paginate, diff --git a/mod/ping.php b/mod/ping.php index 930ed54ff9..d8eaa8126f 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -164,8 +164,8 @@ function ping_init(App $a) if (intval(Feature::isEnabled(local_user(), 'forumlist_widget'))) { $forum_counts = ForumManager::countUnseenItems(); - if (DBM::is_result($forums_counts)) { - foreach ($forums_counts as $forum_count) { + if (DBM::is_result($forum_counts)) { + foreach ($forum_counts as $forum_count) { if ($forum_count['count'] > 0) { $forums_unseen[] = $forum_count; } @@ -490,8 +490,10 @@ function ping_get_notifications($uid) $notification["href"] = System::baseUrl() . "/notify/view/" . $notification["id"]; - if ($notification["visible"] && !$notification["spam"] - && !$notification["deleted"] && !is_array($result[$notification["parent"]]) + if ($notification["visible"] + && !$notification["spam"] + && !$notification["deleted"] + && !(x($result, $notification["parent"]) && is_array($result[$notification["parent"]])) ) { // Should we condense the notifications or show them all? if (PConfig::get(local_user(), 'system', 'detailed_notif')) { diff --git a/mod/profile.php b/mod/profile.php index 9d4bd57c89..f439f754c0 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -8,78 +8,80 @@ use Friendica\Database\DBM; use Friendica\Model\Group; use Friendica\Module\Login; -require_once('include/contact_widgets.php'); -require_once('include/redir.php'); +require_once 'include/contact_widgets.php'; +require_once 'include/redir.php'; -function profile_init(App $a) { - - if(! x($a->page,'aside')) +function profile_init(App $a) +{ + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; + } - if($a->argc > 1) + if ($a->argc > 1) { $which = htmlspecialchars($a->argv[1]); - else { - $r = q("select nickname from user where blocked = 0 and account_expired = 0 and account_removed = 0 and verified = 1 order by rand() limit 1"); + } else { + $r = q("SELECT `nickname` FROM `user` WHERE `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 ORDER BY RAND() LIMIT 1"); if (DBM::is_result($r)) { goaway(System::baseUrl() . '/profile/' . $r[0]['nickname']); - } - else { + } else { logger('profile error: mod_profile ' . $a->query_string, LOGGER_DEBUG); - notice( t('Requested profile is not available.') . EOL ); + notice(t('Requested profile is not available.') . EOL); $a->error = 404; return; } } $profile = 0; - if((local_user()) && ($a->argc > 2) && ($a->argv[2] === 'view')) { + if (local_user() && $a->argc > 2 && $a->argv[2] === 'view') { $which = $a->user['nickname']; $profile = htmlspecialchars($a->argv[1]); - } - else { + } else { auto_redir($a, $which); } - profile_load($a,$which,$profile); + profile_load($a, $which, $profile); - $blocked = (((Config::get('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false); - $userblock = (($a->profile['hidewall'] && (! local_user()) && (! remote_user())) ? true : false); + $blocked = !local_user() && !remote_user() && Config::get('system', 'block_public'); + $userblock = !local_user() && !remote_user() && $a->profile['hidewall']; - if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) { + if (x($a->profile, 'page-flags') && $a->profile['page-flags'] == PAGE_COMMUNITY) { $a->page['htmlhead'] .= ''; } - if (x($a->profile,'openidserver')) { + + if (x($a->profile, 'openidserver')) { $a->page['htmlhead'] .= '' . "\r\n"; } - if (x($a->profile,'openid')) { - $delegate = ((strstr($a->profile['openid'],'://')) ? $a->profile['openid'] : 'https://' . $a->profile['openid']); + + if (x($a->profile, 'openid')) { + $delegate = strstr($a->profile['openid'], '://') ? $a->profile['openid'] : 'https://' . $a->profile['openid']; $a->page['htmlhead'] .= '' . "\r\n"; } + // site block - if ((! $blocked) && (! $userblock)) { - $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : ''); - $keywords = str_replace(array('#',',',' ',',,'),array('',' ',',',','),$keywords); - if(strlen($keywords)) - $a->page['htmlhead'] .= '' . "\r\n" ; + if (!$blocked && !$userblock) { + $keywords = str_replace(array('#', ',', ' ', ',,'), array('', ' ', ',', ','), defaults($a->profile, 'pub_keywords', '')); + if (strlen($keywords)) { + $a->page['htmlhead'] .= '' . "\r\n"; + } } - $a->page['htmlhead'] .= '' . "\r\n" ; - $a->page['htmlhead'] .= '' . "\r\n" ; - $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . ($a->path ? '/' . $a->path : '')); $a->page['htmlhead'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); $dfrn_pages = array('request', 'confirm', 'notify', 'poll'); foreach ($dfrn_pages as $dfrn) { - $a->page['htmlhead'] .= "\r\n"; + $a->page['htmlhead'] .= "\r\n"; } - $a->page['htmlhead'] .= "\r\n"; - + $a->page['htmlhead'] .= '\r\n"; } - -function profile_content(App $a, $update = 0) { - +function profile_content(App $a, $update = 0) +{ $category = $datequery = $datequery2 = ''; if ($a->argc > 2) { @@ -96,21 +98,21 @@ function profile_content(App $a, $update = 0) { } } - if (! x($category)) { - $category = ((x($_GET,'category')) ? $_GET['category'] : ''); + if (!x($category)) { + $category = defaults($_GET, 'category', ''); } - $hashtags = (x($_GET, 'tag') ? $_GET['tag'] : ''); + $hashtags = defaults($_GET, 'tag', ''); - if (Config::get('system','block_public') && (! local_user()) && (! remote_user())) { + if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { return Login::form(); } - require_once("include/bbcode.php"); - require_once('include/security.php'); - require_once('include/conversation.php'); - require_once('include/acl_selectors.php'); - require_once('include/items.php'); + require_once 'include/bbcode.php'; + require_once 'include/security.php'; + require_once 'include/conversation.php'; + require_once 'include/acl_selectors.php'; + require_once 'include/items.php'; $groups = array(); @@ -129,7 +131,7 @@ function profile_content(App $a, $update = 0) { $contact_id = 0; - if (is_array($_SESSION['remote'])) { + if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) { foreach ($_SESSION['remote'] as $v) { if ($v['uid'] == $a->profile['profile_uid']) { $contact_id = $v['cid']; @@ -150,74 +152,75 @@ function profile_content(App $a, $update = 0) { } } - if (! $remote_contact) { + if (!$remote_contact) { if (local_user()) { $contact_id = $_SESSION['cid']; $contact = $a->contact; } } - $is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false); + $is_owner = local_user() == $a->profile['profile_uid']; $last_updated_key = "profile:" . $a->profile['profile_uid'] . ":" . local_user() . ":" . remote_user(); - if ($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) { - notice( t('Access to this profile has been restricted.') . EOL); + if (x($a->profile, 'hidewall') && !$is_owner && !$remote_contact) { + notice(t('Access to this profile has been restricted.') . EOL); return; } - if (! $update) { - if (x($_GET,'tab')) { + if (!$update) { + $tab = false; + if (x($_GET, 'tab')) { $tab = notags(trim($_GET['tab'])); } - $o.=profile_tabs($a, $is_owner, $a->profile['nickname']); + $o .= profile_tabs($a, $is_owner, $a->profile['nickname']); if ($tab === 'profile') { $o .= advanced_profile($a); - call_hooks('profile_advanced',$o); + call_hooks('profile_advanced', $o); return $o; } $o .= common_friends_visitor_widget($a->profile['profile_uid']); - if (x($_SESSION,'new_member') && $_SESSION['new_member'] && $is_owner) { + if (x($_SESSION, 'new_member') && $is_owner) { $o .= '' . t('Tips for New Members') . '' . EOL; } - $commpage = (($a->profile['page-flags'] == PAGE_COMMUNITY) ? true : false); - $commvisitor = (($commpage && $remote_contact == true) ? true : false); + $commpage = $a->profile['page-flags'] == PAGE_COMMUNITY; + $commvisitor = $commpage && $remote_contact; - $a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'],$a->profile['profile_uid'],true); - $a->page['aside'] .= categories_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'],(x($category) ? xmlify($category) : '')); + $a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], $a->profile['profile_uid'], true); + $a->page['aside'] .= categories_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (x($category) ? xmlify($category) : '')); $a->page['aside'] .= tagcloud_wall_widget(); - if (can_write_wall($a,$a->profile['profile_uid'])) { - + if (can_write_wall($a, $a->profile['profile_uid'])) { $x = array( 'is_owner' => $is_owner, - 'allow_location' => ((($is_owner || $commvisitor) && $a->profile['allow_location']) ? true : false), - 'default_location' => (($is_owner) ? $a->user['default-location'] : ''), + 'allow_location' => ($is_owner || $commvisitor) && $a->profile['allow_location'], + 'default_location' => $is_owner ? $a->user['default-location'] : '', 'nickname' => $a->profile['nickname'], - 'lockstate' => (((is_array($a->user) && ((strlen($a->user['allow_cid'])) || - (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || - (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'), - 'acl' => (($is_owner) ? populate_acl($a->user, true) : ''), + 'lockstate' => is_array($a->user) + && (strlen($a->user['allow_cid']) + || strlen($a->user['allow_gid']) + || strlen($a->user['deny_cid']) + || strlen($a->user['deny_gid']) + ) ? 'lock' : 'unlock', + 'acl' => $is_owner ? populate_acl($a->user, true) : '', 'bang' => '', - 'visitor' => (($is_owner || $commvisitor) ? 'block' : 'none'), + 'visitor' => $is_owner || $commvisitor ? 'block' : 'none', 'profile_uid' => $a->profile['profile_uid'], - 'acl_data' => ( $is_owner ? construct_acl_data($a, $a->user) : '' ), // For non-Javascript ACL selector + 'acl_data' => $is_owner ? construct_acl_data($a, $a->user) : '', // For non-Javascript ACL selector ); - $o .= status_editor($a,$x); + $o .= status_editor($a, $x); } } - /** - * Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups - */ - $sql_extra = item_permissions_sql($a->profile['profile_uid'],$remote_contact,$groups); - + // Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups + $sql_extra = item_permissions_sql($a->profile['profile_uid'], $remote_contact, $groups); + $sql_extra2 = ''; if ($update) { $last_updated = (x($_SESSION['last_updated'], $last_updated_key) ? $_SESSION['last_updated'][$last_updated_key] : 0); @@ -235,7 +238,7 @@ function profile_content(App $a, $update = 0) { FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND - (`item`.`deleted` = 0 OR item.verb = '" . ACTIVITY_LIKE ."' + (`item`.`deleted` = 0 OR item.verb = '" . ACTIVITY_LIKE . "' OR item.verb = '" . ACTIVITY_DISLIKE . "' OR item.verb = '" . ACTIVITY_ATTEND . "' OR item.verb = '" . ACTIVITY_ATTENDNO . "' OR item.verb = '" . ACTIVITY_ATTENDMAYBE . "') AND `item`.`moderated` = 0 @@ -249,14 +252,12 @@ function profile_content(App $a, $update = 0) { if (!DBM::is_result($r)) { return ''; } - } else { $sql_post_table = ""; if (x($category)) { $sql_post_table = sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ", dbesc(protect_sprintf($category)), intval(TERM_OBJ_POST), intval(TERM_CATEGORY), intval($a->profile['profile_uid'])); - //$sql_extra .= protect_sprintf(file_tag_file_query('item',$category,'category')); } if (x($hashtags)) { @@ -265,10 +266,10 @@ function profile_content(App $a, $update = 0) { } if ($datequery) { - $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery)))); + $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(), '', $datequery)))); } if ($datequery2) { - $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2)))); + $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(), '', $datequery2)))); } // Belongs the profile page to a forum? @@ -276,7 +277,8 @@ function profile_content(App $a, $update = 0) { $r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `page-flags` IN (%d, %d)", intval($a->profile['profile_uid']), intval(PAGE_COMMUNITY), - intval(PAGE_PRVGROUP)); + intval(PAGE_PRVGROUP) + ); if (!DBM::is_result($r)) { $sql_extra3 = sprintf(" AND `thread`.`contact-id` = %d ", intval(intval($a->profile['contact_id']))); @@ -285,20 +287,20 @@ function profile_content(App $a, $update = 0) { // check if we serve a mobile device and get the user settings // accordingly if ($a->is_mobile) { - $itemspage_network = PConfig::get(local_user(),'system','itemspage_mobile_network'); - $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 10); + $itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_mobile_network', 10); } else { - $itemspage_network = PConfig::get(local_user(),'system','itemspage_network'); - $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 20); + $itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_network', 20); } + // now that we have the user settings, see if the theme forces // a maximum item number which is lower then the user choice - if(($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) + if (($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) { $itemspage_network = $a->force_max_items; + } $a->set_pager_itemspage($itemspage_network); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); + $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network` FROM `thread` @@ -314,7 +316,6 @@ function profile_content(App $a, $update = 0) { ORDER BY `thread`.`created` DESC $pager_sql", intval($a->profile['profile_uid']) ); - } $parents_arr = array(); @@ -325,23 +326,25 @@ function profile_content(App $a, $update = 0) { $_SESSION['last_updated'][$last_updated_key] = time(); if (DBM::is_result($r)) { - foreach($r as $rr) + foreach ($r as $rr) { $parents_arr[] = $rr['item_id']; + } + $parents_str = implode(', ', $parents_arr); - $items = q(item_query()." AND `item`.`uid` = %d + $items = q(item_query() . " AND `item`.`uid` = %d AND `item`.`parent` IN (%s) $sql_extra ", intval($a->profile['profile_uid']), dbesc($parents_str) ); - $items = conv_sort($items,'created'); + $items = conv_sort($items, 'created'); } else { $items = array(); } - if($is_owner && (! $update) && (! Config::get('theme','hide_eventlist'))) { + if ($is_owner && !$update && !Config::get('theme', 'hide_eventlist')) { $o .= get_birthdays(); $o .= get_events(); } diff --git a/mod/receive.php b/mod/receive.php index 467a0d00a5..fcc898a0c0 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -9,8 +9,6 @@ use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Protocol\Diaspora; -require_once 'include/crypto.php'; - /** * @param object $a App * @return void diff --git a/mod/salmon.php b/mod/salmon.php index 4d8b130f94..bd08431a4c 100644 --- a/mod/salmon.php +++ b/mod/salmon.php @@ -7,8 +7,8 @@ use Friendica\Core\PConfig; use Friendica\Database\DBM; use Friendica\Protocol\OStatus; use Friendica\Protocol\Salmon; +use Friendica\Util\Crypto; -require_once 'include/crypto.php'; require_once 'include/items.php'; require_once 'include/follow.php'; @@ -117,23 +117,23 @@ function salmon_post(App $a) { logger('mod-salmon: key details: ' . print_r($key_info,true), LOGGER_DEBUG); - $pubkey = metopem($m,$e); + $pubkey = Crypto::meToPem($m, $e); // We should have everything we need now. Let's see if it verifies. // Try GNU Social format - $verify = rsa_verify($signed_data, $signature, $pubkey); + $verify = Crypto::rsaVerify($signed_data, $signature, $pubkey); $mode = 1; if (! $verify) { logger('mod-salmon: message did not verify using protocol. Trying compliant format.'); - $verify = rsa_verify($compliant_format, $signature, $pubkey); + $verify = Crypto::rsaVerify($compliant_format, $signature, $pubkey); $mode = 2; } if (! $verify) { logger('mod-salmon: message did not verify using padding. Trying old statusnet format.'); - $verify = rsa_verify($stnet_signed_data, $signature, $pubkey); + $verify = Crypto::rsaVerify($stnet_signed_data, $signature, $pubkey); $mode = 3; } diff --git a/mod/videos.php b/mod/videos.php index 11b7e21be7..a7759f7419 100644 --- a/mod/videos.php +++ b/mod/videos.php @@ -8,11 +8,11 @@ use Friendica\Database\DBM; use Friendica\Model\Contact; use Friendica\Model\Group; -require_once('include/items.php'); -require_once('include/acl_selectors.php'); -require_once('include/bbcode.php'); -require_once('include/security.php'); -require_once('include/redir.php'); +require_once 'include/items.php'; +require_once 'include/acl_selectors.php'; +require_once 'include/bbcode.php'; +require_once 'include/security.php'; +require_once 'include/redir.php'; function videos_init(App $a) { @@ -45,12 +45,12 @@ function videos_init(App $a) { $tpl = get_markup_template("vcard-widget.tpl"); - $vcard_widget .= replace_macros($tpl, array( + $vcard_widget = replace_macros($tpl, array( '$name' => $profile['name'], '$photo' => $profile['photo'], - '$addr' => (($profile['addr'] != "") ? $profile['addr'] : ""), + '$addr' => defaults($profile, 'addr', ''), '$account_type' => $account_type, - '$pdesc' => (($profile['pdesc'] != "") ? $profile['pdesc'] : ""), + '$pdesc' => defaults($profile, 'pdesc', ''), )); @@ -281,8 +281,9 @@ function videos_content(App $a) { } } - // perhaps they're visiting - but not a community page, so they wouldn't have write access + $groups = []; + // perhaps they're visiting - but not a community page, so they wouldn't have write access if(remote_user() && (! $visitor)) { $contact_id = 0; if(is_array($_SESSION['remote'])) { @@ -318,7 +319,7 @@ function videos_content(App $a) { return; } - $sql_extra = permissions_sql($owner_uid,$remote_contact,$groups); + $sql_extra = permissions_sql($owner_uid, $remote_contact, $groups); $o = ""; diff --git a/mod/xrd.php b/mod/xrd.php index 49fdde2544..363994a8d4 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -1,12 +1,14 @@ argv[0] == 'xrd') { $uri = urldecode(notags(trim($_GET['uri']))); if ($_SERVER['HTTP_ACCEPT'] == 'application/jrd+json') { @@ -54,8 +56,9 @@ function xrd_init(App $a) { } } -function xrd_json($a, $uri, $alias, $profile_url, $r) { - $salmon_key = salmon_key($r['spubkey']); +function xrd_json($a, $uri, $alias, $profile_url, $r) +{ + $salmon_key = Salmon::salmonKey($r['spubkey']); header('Access-Control-Allow-Origin: *'); header("Content-type: application/json; charset=utf-8"); @@ -79,8 +82,9 @@ function xrd_json($a, $uri, $alias, $profile_url, $r) { killme(); } -function xrd_xml($a, $uri, $alias, $profile_url, $r) { - $salmon_key = salmon_key($r['spubkey']); +function xrd_xml($a, $uri, $alias, $profile_url, $r) +{ + $salmon_key = Salmon::salmonKey($r['spubkey']); header('Access-Control-Allow-Origin: *'); header("Content-type: text/xml"); @@ -100,8 +104,8 @@ function xrd_xml($a, $uri, $alias, $profile_url, $r) { '$salmon' => System::baseUrl() . '/salmon/' . $r['nickname'], '$salmen' => System::baseUrl() . '/salmon/' . $r['nickname'] . '/mention', '$subscribe' => System::baseUrl() . '/follow?url={uri}', - '$modexp' => 'data:application/magic-public-key,' . $salmon_key, - )); + '$modexp' => 'data:application/magic-public-key,' . $salmon_key) + ); $arr = array('user' => $r, 'xml' => $o); call_hooks('personal_xrd', $arr); diff --git a/src/App.php b/src/App.php index c32cf79d98..f9f4434490 100644 --- a/src/App.php +++ b/src/App.php @@ -37,6 +37,7 @@ class App { public $query_string; public $config; public $page; + public $page_offset; public $profile; public $profile_uid; public $user; diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php new file mode 100644 index 0000000000..70be8fd738 --- /dev/null +++ b/src/Content/OEmbed.php @@ -0,0 +1,355 @@ + + */ +class OEmbed +{ + public static function replaceCallback($matches) + { + $embedurl = $matches[1]; + $j = self::fetchURL($embedurl); + $s = self::formatObject($j); + + return $s; + } + + /** + * @brief Get data from an URL to embed its content. + * + * @param string $embedurl The URL from which the data should be fetched. + * @param bool $no_rich_type If set to true rich type content won't be fetched. + * + * @return bool|object Returns object with embed content or false if no embedable + * content exists + */ + public static function fetchURL($embedurl, $no_rich_type = false) + { + $embedurl = trim($embedurl, "'"); + $embedurl = trim($embedurl, '"'); + + $a = get_app(); + + $condition = array('url' => normalise_link($embedurl)); + $r = dba::select('oembed', array('content'), $condition, array('limit' => 1)); + + if (DBM::is_result($r)) { + $txt = $r["content"]; + } else { + $txt = Cache::get($a->videowidth . $embedurl); + } + // These media files should now be caught in bbcode.php + // left here as a fallback in case this is called from another source + + $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm"); + $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION); + + + if (is_null($txt)) { + $txt = ""; + + if (!in_array($ext, $noexts)) { + // try oembed autodiscovery + $redirects = 0; + $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*"); + if ($html_text) { + $dom = @DOMDocument::loadHTML($html_text); + if ($dom) { + $xpath = new DOMXPath($dom); + $entries = $xpath->query("//link[@type='application/json+oembed']"); + foreach ($entries as $e) { + $href = $e->getAttributeNode("href")->nodeValue; + $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); + break; + } + $entries = $xpath->query("//link[@type='text/json+oembed']"); + foreach ($entries as $e) { + $href = $e->getAttributeNode("href")->nodeValue; + $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); + break; + } + } + } + } + + $txt = trim($txt); + + if (!$txt || $txt[0] != "{") { + $txt = '{"type":"error"}'; + } else { //save in cache + $j = json_decode($txt); + if ($j->type != "error") { + dba::insert('oembed', array('url' => normalise_link($embedurl), + 'content' => $txt, 'created' => datetime_convert()), true); + } + + Cache::set($a->videowidth . $embedurl, $txt, CACHE_DAY); + } + } + + $j = json_decode($txt); + + if (!is_object($j)) { + return false; + } + + // Always embed the SSL version + if (isset($j->html)) { + $j->html = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), array("https://www.youtube.com/", "https://player.vimeo.com/"), $j->html); + } + + $j->embedurl = $embedurl; + + // If fetching information doesn't work, then improve via internal functions + if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) { + $data = ParseUrl::getSiteinfoCached($embedurl, true, false); + $j->type = $data["type"]; + + if ($j->type == "photo") { + $j->url = $data["url"]; + //$j->width = $data["images"][0]["width"]; + //$j->height = $data["images"][0]["height"]; + } + + if (isset($data["title"])) { + $j->title = $data["title"]; + } + + if (isset($data["text"])) { + $j->description = $data["text"]; + } + + if (is_array($data["images"])) { + $j->thumbnail_url = $data["images"][0]["src"]; + $j->thumbnail_width = $data["images"][0]["width"]; + $j->thumbnail_height = $data["images"][0]["height"]; + } + } + + call_hooks('oembed_fetch_url', $embedurl, $j); + + return $j; + } + + public static function formatObject($j) + { + $embedurl = $j->embedurl; + $jhtml = self::iframe($j->embedurl, (isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null)); + $ret = ""; + switch ($j->type) { + case "video": + if (isset($j->thumbnail_url)) { + $tw = (isset($j->thumbnail_width) && intval($j->thumbnail_width)) ? $j->thumbnail_width : 200; + $th = (isset($j->thumbnail_height) && intval($j->thumbnail_height)) ? $j->thumbnail_height : 180; + // make sure we don't attempt divide by zero, fallback is a 1:1 ratio + $tr = (($th) ? $tw / $th : 1); + + $th = 120; + $tw = $th * $tr; + $tpl = get_markup_template('oembed_video.tpl'); + $ret.=replace_macros($tpl, array( + '$baseurl' => System::baseUrl(), + '$embedurl' => $embedurl, + '$escapedhtml' => base64_encode($jhtml), + '$tw' => $tw, + '$th' => $th, + '$turl' => $j->thumbnail_url, + )); + } else { + $ret = $jhtml; + } + //$ret.="
"; + break; + case "photo": + $ret.= ""; + break; + case "link": + break; + case "rich": + // not so safe.. + if (!Config::get("system", "no_oembed_rich_content")) { + $ret.= proxy_parse_html($jhtml); + } + break; + } + + // add link to source if not present in "rich" type + if ($j->type != 'rich' || !strpos($j->html, $embedurl)) { + $ret .= "

"; + if (isset($j->title)) { + if (isset($j->provider_name)) { + $ret .= $j->provider_name . ": "; + } + + $embedlink = (isset($j->title)) ? $j->title : $embedurl; + $ret .= "$embedlink"; + if (isset($j->author_name)) { + $ret.=" (" . $j->author_name . ")"; + } + } elseif (isset($j->provider_name) || isset($j->author_name)) { + $embedlink = ""; + if (isset($j->provider_name)) { + $embedlink .= $j->provider_name; + } + + if (isset($j->author_name)) { + if ($embedlink != "") { + $embedlink .= ": "; + } + + $embedlink .= $j->author_name; + } + if (trim($embedlink) == "") { + $embedlink = $embedurl; + } + + $ret .= "$embedlink"; + } + //if (isset($j->author_name)) $ret.=" by ".$j->author_name; + //if (isset($j->provider_name)) $ret.=" on ".$j->provider_name; + $ret .= "

"; + } else { + // add for html2bbcode conversion + $ret .= "$embedurl"; + } + $ret.="
"; + $ret = str_replace("\n", "", $ret); + return mb_convert_encoding($ret, 'HTML-ENTITIES', mb_detect_encoding($ret)); + } + + public static function BBCode2HTML($text) + { + $stopoembed = Config::get("system", "no_oembed"); + if ($stopoembed == true) { + return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "" . t('Embedding disabled') . " : $1", $text); + } + return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", ['self', 'replaceCallback'], $text); + } + + /** + * Find .... + * and replace it with [embed]url[/embed] + */ + public static function HTML2BBCode($text) + { + // start parser only if 'oembed' is in text + if (strpos($text, "oembed")) { + + // convert non ascii chars to html entities + $html_text = mb_convert_encoding($text, 'HTML-ENTITIES', mb_detect_encoding($text)); + + // If it doesn't parse at all, just return the text. + $dom = @DOMDocument::loadHTML($html_text); + if (!$dom) { + return $text; + } + $xpath = new DOMXPath($dom); + + $xattr = self::buildXPath("class", "oembed"); + $entries = $xpath->query("//span[$xattr]"); + + $xattr = "@rel='oembed'"; //oe_build_xpath("rel","oembed"); + foreach ($entries as $e) { + $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue; + if (!is_null($href)) { + $e->parentNode->replaceChild(new DOMText("[embed]" . $href . "[/embed]"), $e); + } + } + return self::getInnerHTML($dom->getElementsByTagName("body")->item(0)); + } else { + return $text; + } + } + + /** + * @brief Generates the iframe HTML for an oembed attachment. + * + * Width and height are given by the remote, and are regularly too small for + * the generated iframe. + * + * The width is entirely discarded for the actual width of the post, while fixed + * height is used as a starting point before the inevitable resizing. + * + * Since the iframe is automatically resized on load, there are no need for ugly + * and impractical scrollbars. + * + * @param string $src Original remote URL to embed + * @param string $width + * @param string $height + * @return string formatted HTML + * + * @see oembed_format_object() + */ + private static function iframe($src, $width, $height) + { + $a = get_app(); + + if (!$height || strstr($height, '%')) { + $height = '200'; + } + $width = '100%'; + + $s = System::baseUrl() . '/oembed/' . base64url_encode($src); + return ''; + } + + /** + * Generates an XPath query to select elements whose provided attribute contains + * the provided value in a space-separated list. + * + * @brief Generates attribute search XPath string + * + * @param string $attr Name of the attribute to seach + * @param string $value Value to search in a space-separated list + * @return string + */ + private static function buildXPath($attr, $value) + { + // https://www.westhoffswelt.de/blog/2009/6/9/select-html-elements-with-more-than-one-css-class-using-xpath + return "contains(normalize-space(@$attr), ' $value ') or substring(normalize-space(@$attr), 1, string-length('$value') + 1) = '$value ' or substring(normalize-space(@$attr), string-length(@$attr) - string-length('$value')) = ' $value' or @$attr = '$value'"; + } + + /** + * Returns the inner XML string of a provided DOMNode + * + * @brief Returns the inner XML string of a provided DOMNode + * + * @param DOMNode $node + * @return string + */ + private static function getInnerHTML(DOMNode $node) + { + $innerHTML = ''; + $children = $node->childNodes; + foreach ($children as $child) { + $innerHTML .= $child->ownerDocument->saveXML($child); + } + return $innerHTML; + } +} diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 760b40b1d3..55e2b33a04 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -606,6 +606,7 @@ class Worker $exponent = 3; $slope = $maxworkers / pow($maxsysload, $exponent); $queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent)); + $processlist = ''; if (Config::get('system', 'worker_debug')) { // Create a list of queue entries grouped by their priority diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 1b15f1c76d..067a2fda7f 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -662,7 +662,7 @@ class Contact extends BaseObject if (!DBM::is_result($contact)) { // The link could be provided as http although we stored it as https $ssl_url = str_replace('http://', 'https://', $url); - $r = dba::select('contact', array('id', 'avatar-date'), array('`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid), array('limit' => 1)); + $r = dba::select('contact', array('id', 'avatar', 'avatar-date'), array('`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid), array('limit' => 1)); $contact = dba::fetch($r); dba::close($r); } @@ -674,7 +674,7 @@ class Contact extends BaseObject $update_contact = ($contact['avatar-date'] < datetime_convert('', '', 'now -7 days')); // We force the update if the avatar is empty - if ($contact['avatar'] == '') { + if (!x($contact, 'avatar')) { $update_contact = true; } diff --git a/src/Model/User.php b/src/Model/User.php index 99222f5229..c6d6c044d5 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -16,11 +16,11 @@ use Friendica\Model\Contact; use Friendica\Model\Group; use Friendica\Model\Photo; use Friendica\Object\Image; +use Friendica\Util\Crypto; use dba; use Exception; require_once 'boot.php'; -require_once 'include/crypto.php'; require_once 'include/dba.php'; require_once 'include/enotify.php'; require_once 'include/network.php'; @@ -297,7 +297,7 @@ class User $return['password'] = $new_password; - $keys = new_keypair(4096); + $keys = Crypto::newKeypair(4096); if ($keys === false) { throw new Exception(t('SERIOUS ERROR: Generation of security keys failed.')); } @@ -306,7 +306,7 @@ class User $pubkey = $keys['pubkey']; // Create another keypair for signing/verifying salmon protocol messages. - $sres = new_keypair(512); + $sres = Crypto::newKeypair(512); $sprvkey = $sres['prvkey']; $spubkey = $sres['pubkey']; diff --git a/src/Module/Feed.php b/src/Module/Feed.php new file mode 100644 index 0000000000..678e77e83a --- /dev/null +++ b/src/Module/Feed.php @@ -0,0 +1,59 @@ + posts + * - /feed/[nickname]/posts => posts + * - /feed/[nickname]/comments => comments + * - /feed/[nickname]/replies => comments + * - /feed/[nickname]/activity => activity + * + * The nocache GET parameter is provided mainly for debug purposes, requires auth + * + * @brief Provides public Atom feeds + * + * @author Hypolite Petovan + */ +class Feed extends BaseModule +{ + public static function content() + { + $a = self::getApp(); + + $last_update = x($_GET, 'last_update') ? $_GET['last_update'] : ''; + $nocache = x($_GET, 'nocache') && local_user(); + + if ($a->argc < 2) { + http_status_exit(400); + } + + $type = null; + if ($a->argc > 2) { + $type = $a->argv[2]; + } + + switch ($type) { + case 'posts': + case 'comments': + case 'activity': + break; + case 'replies': + $type = 'comments'; + break; + default: + $type = 'posts'; + } + + $nickname = $a->argv[1]; + header("Content-type: application/atom+xml"); + echo OStatus::feed($nickname, $last_update, 10, $type, $nocache); + killme(); + } +} diff --git a/src/Module/Oembed.php b/src/Module/Oembed.php new file mode 100644 index 0000000000..f30fb861bc --- /dev/null +++ b/src/Module/Oembed.php @@ -0,0 +1,53 @@ + + */ +class Oembed extends BaseModule +{ + public static function content() + { + $a = self::getApp(); + + // Unused form: /oembed/b2h?url=... + if ($a->argv[1] == 'b2h') { + $url = array("", trim(hex2bin($_REQUEST['url']))); + echo Content\OEmbed::replaceCallback($url); + killme(); + } + + // Unused form: /oembed/h2b?text=... + if ($a->argv[1] == 'h2b') { + $text = trim(hex2bin($_REQUEST['text'])); + echo Content\OEmbed::HTML2BBCode($text); + killme(); + } + + if ($a->argc == 2) { + echo ''; + $url = base64url_decode($a->argv[1]); + $j = Content\OEmbed::fetchURL($url); + + // workaround for media.ccc.de (and any other endpoint that return size 0) + if (substr($j->html, 0, 7) == "html, 'width="0"')) { + $j->html = '' . $j->html; + $j->html = str_replace('width="0"', '', $j->html); + $j->html = str_replace('height="0"', '', $j->html); + } + echo $j->html; + echo ''; + } + killme(); + } +} diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 56abbb7fdc..8912088cbb 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -17,6 +17,7 @@ use Friendica\Database\DBM; use Friendica\Model\Profile; use Friendica\Protocol\Email; use Friendica\Protocol\Feed; +use Friendica\Util\Crypto; use Friendica\Util\XML; use dba; @@ -25,7 +26,6 @@ use DOMDocument; require_once 'include/dba.php'; require_once 'include/network.php'; -require_once "include/crypto.php"; /** * @brief This class contain functions for probing URL @@ -330,7 +330,7 @@ class Probe $data["url"] = $uri; } - if ($data["photo"] != "") { + if (x($data, "photo")) { $data["baseurl"] = matching_url(normalise_link($data["baseurl"]), normalise_link($data["photo"])); } else { $data["photo"] = System::baseUrl().'/images/person-175.jpg'; @@ -341,7 +341,7 @@ class Probe $data["name"] = $data["nick"]; } - if ($data["name"] == "") { + if (!x($data, "name")) { $data["name"] = $data["url"]; } } @@ -944,7 +944,7 @@ class Probe //if (strstr($data["pubkey"], 'RSA ') || ($link["type"] == "RSA")) if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } } @@ -1043,7 +1043,7 @@ class Probe if ($search->length > 0) { $data["pubkey"] = $search->item(0)->nodeValue; if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } @@ -1133,7 +1133,7 @@ class Probe //if (strstr($data["pubkey"], 'RSA ') || ($link["type"] == "RSA")) if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } } @@ -1244,7 +1244,7 @@ class Probe if (sizeof($key) >= 3) { $m = base64url_decode($key[1]); $e = base64url_decode($key[2]); - $data["pubkey"] = metopem($m, $e); + $data["pubkey"] = Crypto::meToPem($m, $e); } } } diff --git a/src/Object/Post.php b/src/Object/Post.php index 08e7548b9f..dd32fc3e3e 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -1,7 +1,9 @@ data = $data; $this->setTemplate('wall'); - $this->toplevel = ($this->getId() == $this->getDataValue('parent')); + $this->toplevel = $this->getId() == $this->getDataValue('parent'); - if (is_array($_SESSION['remote'])) { + if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) { foreach ($_SESSION['remote'] as $visitor) { if ($visitor['cid'] == $this->getDataValue('contact-id')) { $this->visiting = true; @@ -63,9 +65,7 @@ class Post extends BaseObject } } - $this->writable = ($this->getDataValue('writable') || $this->getDataValue('self')); - - $ssl_state = ((local_user()) ? true : false); + $this->writable = $this->getDataValue('writable') || $this->getDataValue('self'); $this->redirect_url = 'redir/' . $this->getDataValue('cid'); if (!$this->isToplevel()) { @@ -75,12 +75,10 @@ class Post extends BaseObject // Prepare the children if (count($data['children'])) { foreach ($data['children'] as $item) { - /* - * Only add will be displayed - */ + // Only add will be displayed if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { continue; - } elseif (! visible_activity($item)) { + } elseif (!visible_activity($item)) { continue; } @@ -145,13 +143,13 @@ class Post extends BaseObject || strlen($item['deny_cid']) || strlen($item['deny_gid'])))) ? t('Private Message') : false); - $shareable = ((in_array($conv->getProfileOwner(), [0, local_user()]) && ($item['private'] != 1)) ? true : false); + $shareable = in_array($conv->getProfileOwner(), [0, local_user()]) && $item['private'] != 1; if (local_user() && link_compare($a->contact['url'], $item['author-link'])) { if ($item["event-id"] != 0) { - $edpost = array("events/event/".$item['event-id'], t("Edit")); + $edpost = array("events/event/" . $item['event-id'], t("Edit")); } else { - $edpost = array("editpost/".$item['id'], t("Edit")); + $edpost = array("editpost/" . $item['id'], t("Edit")); } } else { $edpost = false; @@ -170,9 +168,9 @@ class Post extends BaseObject $filer = (($conv->getProfileOwner() == local_user()) ? t("save to folder") : false); - $diff_author = ((link_compare($item['url'], $item['author-link'])) ? false : true); - $profile_name = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']); - if ($item['author-link'] && (! $item['author-name'])) { + $diff_author = !link_compare($item['url'], $item['author-link']); + $profile_name = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']); + if ($item['author-link'] && (!$item['author-name'])) { $profile_name = $item['author-link']; } @@ -210,39 +208,25 @@ class Post extends BaseObject call_hooks('render_location', $locate); $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate)); - $tags=array(); - $hashtags = array(); - $mentions = array(); - - /*foreach(explode(',',$item['tag']) as $tag){ - $tag = trim($tag); - if ($tag!="") { - $t = bbcode($tag); - $tags[] = $t; - if($t[0] == '#') - $hashtags[] = $t; - elseif($t[0] == '@') - $mentions[] = $t; - } - }*/ - // process action responses - e.g. like/dislike/attend/agree/whatever $response_verbs = array('like', 'dislike'); + $isevent = false; + $attend = []; if ($item['object-type'] === ACTIVITY_OBJ_EVENT) { $response_verbs[] = 'attendyes'; $response_verbs[] = 'attendno'; $response_verbs[] = 'attendmaybe'; if ($conv->isWritable()) { $isevent = true; - $attend = array( t('I will attend'), t('I will not attend'), t('I might attend')); + $attend = array(t('I will attend'), t('I will not attend'), t('I might attend')); } } $responses = get_responses($conv_responses, $response_verbs, $this, $item); foreach ($response_verbs as $value => $verbs) { - $responses[$verbs]['output'] = ((x($conv_responses[$verbs], $item['uri'])) ? format_like($conv_responses[$verbs][$item['uri']], $conv_responses[$verbs][$item['uri'] . '-l'], $verbs, $item['uri']) : ''); + $responses[$verbs]['output'] = x($conv_responses[$verbs], $item['uri']) ? format_like($conv_responses[$verbs][$item['uri']], $conv_responses[$verbs][$item['uri'] . '-l'], $verbs, $item['uri']) : ''; } /* @@ -256,6 +240,8 @@ class Post extends BaseObject $osparkle = ' sparkle'; } + $tagger = ''; + if ($this->isToplevel()) { if ($conv->getProfileOwner() == local_user()) { $isstarred = (($item['starred']) ? "starred" : "unstarred"); @@ -264,9 +250,9 @@ class Post extends BaseObject 'do' => t("add star"), 'undo' => t("remove star"), 'toggle' => t("toggle star status"), - 'classdo' => (($item['starred']) ? "hidden" : ""), - 'classundo' => (($item['starred']) ? "" : "hidden"), - 'starred' => t('starred'), + 'classdo' => $item['starred'] ? "hidden" : "", + 'classundo' => $item['starred'] ? "" : "hidden", + 'starred' => t('starred'), ); $r = dba::select('thread', array('ignored'), array('uid' => $item['uid'], 'iid' => $item['id']), array('limit' => 1)); if (DBM::is_result($r)) { @@ -274,13 +260,12 @@ class Post extends BaseObject 'do' => t("ignore thread"), 'undo' => t("unignore thread"), 'toggle' => t("toggle ignore status"), - 'classdo' => (($r['ignored']) ? "hidden" : ""), - 'classundo' => (($r['ignored']) ? "" : "hidden"), - 'ignored' => t('ignored'), + 'classdo' => $r['ignored'] ? "hidden" : "", + 'classundo' => $r['ignored'] ? "" : "hidden", + 'ignored' => t('ignored'), ); } - $tagger = ''; if (Feature::isEnabled($conv->getProfileOwner(), 'commtag')) { $tagger = array( 'add' => t("add tag"), @@ -294,11 +279,11 @@ class Post extends BaseObject if ($conv->isWritable()) { $buttons = array( - 'like' => array( t("I like this \x28toggle\x29"), t("like")), - 'dislike' => ((Feature::isEnabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''), + 'like' => array(t("I like this \x28toggle\x29"), t("like")), + 'dislike' => Feature::isEnabled($conv->getProfileOwner(), 'dislike') ? array(t("I don't like this \x28toggle\x29"), t("dislike")) : '', ); if ($shareable) { - $buttons['share'] = array( t('Share this'), t('share')); + $buttons['share'] = array(t('Share this'), t('share')); } } @@ -322,10 +307,10 @@ class Post extends BaseObject $owner_name_e = $this->getOwnerName(); // Disable features that aren't available in several networks - /// @todo Add NETWORK_DIASPORA when it will pass this information if (!in_array($item["item_network"], array(NETWORK_DFRN)) && isset($buttons["dislike"])) { - unset($buttons["dislike"], $isevent); + unset($buttons["dislike"]); + $isevent = false; $tagger = ''; } @@ -355,8 +340,8 @@ class Post extends BaseObject 'guid' => urlencode($item['guid']), 'isevent' => $isevent, 'attend' => $attend, - 'linktitle' => sprintf(t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])), - 'olinktitle' => sprintf(t('View %s\'s profile @ %s'), htmlentities($this->getOwnerName()), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])), + 'linktitle' => t('View %s\'s profile @ %s', $profile_name, defaults($item, 'author-link', $item['url'])), + 'olinktitle' => t('View %s\'s profile @ %s', htmlentities($this->getOwnerName()), defaults($item, 'owner-link', $item['url'])), 'to' => t('to'), 'via' => t('via'), 'wall' => t('Wall-to-Wall'), @@ -369,7 +354,7 @@ class Post extends BaseObject 'sparkle' => $sparkle, 'title' => $title_e, 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'), - 'ago' => (($item['app']) ? sprintf(t('%s from %s'), relative_date($item['created']), $item['app']) : relative_date($item['created'])), + 'ago' => $item['app'] ? t('%s from %s', relative_date($item['created']), $item['app']) : relative_date($item['created']), 'app' => $item['app'], 'created' => relative_date($item['created']), 'lock' => $lock, @@ -380,12 +365,12 @@ class Post extends BaseObject 'owner_photo' => $a->remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)), 'owner_name' => htmlentities($owner_name_e), 'plink' => get_plink($item), - 'edpost' => ((Feature::isEnabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''), + 'edpost' => Feature::isEnabled($conv->getProfileOwner(), 'edit_posts') ? $edpost : '', 'isstarred' => $isstarred, - 'star' => ((Feature::isEnabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''), - 'ignore' => ((Feature::isEnabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''), + 'star' => Feature::isEnabled($conv->getProfileOwner(), 'star_posts') ? $star : '', + 'ignore' => Feature::isEnabled($conv->getProfileOwner(), 'ignore_posts') ? $ignore : '', 'tagger' => $tagger, - 'filer' => ((Feature::isEnabled($conv->getProfileOwner(), 'filing')) ? $filer : ''), + 'filer' => Feature::isEnabled($conv->getProfileOwner(), 'filing') ? $filer : '', 'drop' => $drop, 'vote' => $buttons, 'like' => $responses['like']['output'], @@ -393,7 +378,7 @@ class Post extends BaseObject 'responses' => $responses, 'switchcomment' => t('Comment'), 'comment' => $comment, - 'previewing' => ($conv->isPreview() ? ' preview ' : ''), + 'previewing' => $conv->isPreview() ? ' preview ' : '', 'wait' => t('Please wait'), 'thread_level' => $thread_level, 'edited' => $edited, @@ -419,7 +404,7 @@ class Post extends BaseObject // Collapse if (($nb_children > 2) || ($thread_level > 1)) { $result['children'][0]['comment_firstcollapsed'] = true; - $result['children'][0]['num_comments'] = sprintf(tt('%d comment', '%d comments', $total_children), $total_children); + $result['children'][0]['num_comments'] = tt('%d comment', '%d comments', $total_children); $result['children'][0]['hidden_comments_num'] = $total_children; $result['children'][0]['hidden_comments_text'] = tt('comment', 'comments', $total_children); $result['children'][0]['hide_text'] = t('show more'); @@ -480,7 +465,7 @@ class Post extends BaseObject logger('[ERROR] Post::addChild : Item has no ID!!', LOGGER_DEBUG); return false; } elseif ($this->getChild($item->getId())) { - logger('[WARN] Post::addChild : Item already exists ('. $item->getId() .').', LOGGER_DEBUG); + logger('[WARN] Post::addChild : Item already exists (' . $item->getId() . ').', LOGGER_DEBUG); return false; } /* @@ -574,7 +559,7 @@ class Post extends BaseObject return true; } } - logger('[WARN] Item::removeChild : Item is not a child ('. $id .').', LOGGER_DEBUG); + logger('[WARN] Item::removeChild : Item is not a child (' . $id . ').', LOGGER_DEBUG); return false; } @@ -657,7 +642,7 @@ class Post extends BaseObject private function setTemplate($name) { if (!x($this->available_templates, $name)) { - logger('[ERROR] Item::setTemplate : Template not available ("'. $name .'").', LOGGER_DEBUG); + logger('[ERROR] Item::setTemplate : Template not available ("' . $name . '").', LOGGER_DEBUG); return false; } @@ -696,7 +681,6 @@ class Post extends BaseObject if ($conv) { // This will allow us to comment on wall-to-wall items owned by our friends // and community forums even if somebody else wrote the post. - // bug #517 - this fixes for conversation owner if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == local_user()) { return true; @@ -750,14 +734,13 @@ class Post extends BaseObject $comment_box = ''; $conv = $this->getThread(); - $template = get_markup_template($this->getCommentBoxTemplate()); $ww = ''; if (($conv->getMode() === 'network') && $this->isWallToWall()) { $ww = 'ww'; } if ($conv->isWritable() && $this->isWritable()) { - $qc = $qcomment = null; + $qc = $qcomment = null; /* * Hmmm, code depending on the presence of a particular plugin? @@ -768,18 +751,16 @@ class Post extends BaseObject $qcomment = (($qc) ? explode("\n", $qc) : null); } - $comment_box = replace_macros( - $template, - array( + $template = get_markup_template($this->getCommentBoxTemplate()); + $comment_box = replace_macros($template, array( '$return_path' => $a->query_string, '$threaded' => $this->isThreaded(), - // '$jsreload' => (($conv->getMode() === 'display') ? $_SESSION['return_url'] : ''), '$jsreload' => '', - '$type' => (($conv->getMode() === 'profile') ? 'wall-comment' : 'net-comment'), + '$type' => $conv->getMode() === 'profile' ? 'wall-comment' : 'net-comment', '$id' => $this->getId(), '$parent' => $this->getId(), '$qcomment' => $qcomment, - '$profile_uid' => $conv->getProfileOwner(), + '$profile_uid' => $conv->getProfileOwner(), '$mylink' => $a->remove_baseurl($a->contact['url']), '$mytitle' => t('This is you'), '$myphoto' => $a->remove_baseurl($a->contact['thumb']), @@ -796,9 +777,9 @@ class Post extends BaseObject '$preview' => ((Feature::isEnabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''), '$indent' => $indent, '$sourceapp' => t($a->sourcename), - '$ww' => (($conv->getMode() === 'network') ? $ww : ''), - '$rand_num' => random_digits(12)) - ); + '$ww' => $conv->getMode() === 'network' ? $ww : '', + '$rand_num' => random_digits(12) + )); } return $comment_box; @@ -839,14 +820,13 @@ class Post extends BaseObject $alias_linkmatch = (($this->getDataValue('alias')) && link_compare($this->getDataValue('alias'), $this->getDataValue('author-link'))); $owner_namematch = (($this->getDataValue('owner-name')) && $this->getDataValue('owner-name') == $this->getDataValue('author-name')); - if ((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) { + if ((!$owner_linkmatch) && (!$alias_linkmatch) && (!$owner_namematch)) { // The author url doesn't match the owner (typically the contact) // and also doesn't match the contact alias. // The name match is a hack to catch several weird cases where URLs are // all over the park. It can be tricked, but this prevents you from // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn // well that it's the same Bob Smith. - // But it could be somebody else with the same name. It just isn't highly likely. @@ -854,8 +834,8 @@ class Post extends BaseObject $this->owner_name = $this->getDataValue('owner-name'); $this->wall_to_wall = true; // If it is our contact, use a friendly redirect link - if ((link_compare($this->getDataValue('owner-link'), $this->getDataValue('url'))) - && ($this->getDataValue('network') === NETWORK_DFRN) + if ($this->getDataValue('network') === NETWORK_DFRN + && link_compare($this->getDataValue('owner-link'), $this->getDataValue('url')) ) { $this->owner_url = $this->getRedirectUrl(); } else { diff --git a/src/ParseUrl.php b/src/ParseUrl.php index 9e46281ec9..0c67589ddf 100644 --- a/src/ParseUrl.php +++ b/src/ParseUrl.php @@ -5,7 +5,7 @@ */ namespace Friendica; -use Friendica\Core\Config; +use Friendica\Content\OEmbed; use Friendica\Object\Image; use Friendica\Util\XML; @@ -15,7 +15,6 @@ use DOMDocument; require_once 'include/dba.php'; require_once "include/network.php"; -require_once "include/oembed.php"; /** * @brief Class with methods for extracting certain content from an url @@ -164,7 +163,7 @@ class ParseUrl $body = $data["body"]; if ($do_oembed) { - $oembed_data = oembed_fetch_url($url); + $oembed_data = OEmbed::fetchURL($url); if (!in_array($oembed_data->type, array("error", "rich", ""))) { $siteinfo["type"] = $oembed_data->type; diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 070cf598ac..4d63f2b0bb 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -8,6 +8,7 @@ */ namespace Friendica\Protocol; +use Friendica\Content\OEmbed; use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Core\Worker; @@ -34,7 +35,6 @@ require_once "include/tags.php"; require_once "include/files.php"; require_once "include/event.php"; require_once "include/text.php"; -require_once "include/oembed.php"; require_once "include/html2bbcode.php"; require_once "include/bbcode.php"; @@ -464,7 +464,7 @@ class DFRN /* get site pubkey. this could be a new installation with no site keys*/ $pubkey = Config::get('system', 'site_pubkey'); if (! $pubkey) { - $res = new_keypair(1024); + $res = Crypto::newKeypair(1024); Config::set('system', 'site_prvkey', $res['prvkey']); Config::set('system', 'site_pubkey', $res['pubkey']); } @@ -2503,7 +2503,7 @@ class DFRN $item['body'] = html2bb_video($item['body']); - $item['body'] = oembed_html2bbcode($item['body']); + $item['body'] = OEmbed::HTML2BBCode($item['body']); $config = \HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 15a30f532e..59ca2757f3 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -22,6 +22,7 @@ use Friendica\Model\Group; use Friendica\Model\Profile; use Friendica\Model\User; use Friendica\Network\Probe; +use Friendica\Util\Crypto; use Friendica\Util\XML; use dba; @@ -173,7 +174,7 @@ class Diaspora $key = self::key($handle); - $verify = rsa_verify($signable_data, $sig, $key); + $verify = Crypto::rsaVerify($signable_data, $sig, $key); if (!$verify) { logger('Message did not verify. Discarding.'); return false; @@ -273,7 +274,7 @@ class Diaspora $author_addr = base64_decode($key_id); $key = self::key($author_addr); - $verify = rsa_verify($signed_data, $signature, $key); + $verify = Crypto::rsaVerify($signed_data, $signature, $key); if (!$verify) { logger('Message did not verify. Discarding.'); http_status_exit(400); @@ -406,7 +407,7 @@ class Diaspora http_status_exit(400); } - $verify = rsa_verify($signed_data, $signature, $key); + $verify = Crypto::rsaVerify($signed_data, $signature, $key); if (!$verify) { logger('Message did not verify. Discarding.'); @@ -699,7 +700,7 @@ class Diaspora $key = self::key($msg["author"]); - if (!rsa_verify($signed_data, $parent_author_signature, $key, "sha256")) { + if (!Crypto::rsaVerify($signed_data, $parent_author_signature, $key, "sha256")) { logger("No valid parent author signature for parent author ".$msg["author"]. " in type ".$type." - signed data: ".$signed_data." - Message: ".$msg["message"]." - Signature ".$parent_author_signature, LOGGER_DEBUG); return false; } @@ -709,7 +710,7 @@ class Diaspora $key = self::key($fields->author); - if (!rsa_verify($signed_data, $author_signature, $key, "sha256")) { + if (!Crypto::rsaVerify($signed_data, $author_signature, $key, "sha256")) { logger("No valid author signature for author ".$fields->author. " in type ".$type." - signed data: ".$signed_data." - Message: ".$msg["message"]." - Signature ".$author_signature, LOGGER_DEBUG); return false; } else { @@ -1432,7 +1433,7 @@ class Diaspora // Check signature $signed_text = 'AccountMigration:'.$old_handle.':'.$new_handle; $key = self::key($old_handle); - if (!rsa_verify($signed_text, $signature, $key, "sha256")) { + if (!Crypto::rsaVerify($signed_text, $signature, $key, "sha256")) { logger('No valid signature for migration.'); return false; } @@ -3032,7 +3033,7 @@ class Diaspora $user['uprvkey'] = $user['prvkey']; } - $signature = rsa_sign($signable_data, $user["uprvkey"]); + $signature = Crypto::rsaSign($signable_data, $user["uprvkey"]); $sig = base64url_encode($signature); $xmldata = array("me:env" => array("me:data" => $data, @@ -3088,7 +3089,7 @@ class Diaspora $signed_text = implode(";", $sigmsg); - return base64_encode(rsa_sign($signed_text, $owner["uprvkey"], "sha256")); + return base64_encode(Crypto::rsaSign($signed_text, $owner["uprvkey"], "sha256")); } /** @@ -3282,7 +3283,7 @@ class Diaspora $profile = self::createProfileData($uid); $signed_text = 'AccountMigration:'.$old_handle.':'.$profile['author']; - $signature = base64_encode(rsa_sign($signed_text, $owner["uprvkey"], "sha256")); + $signature = base64_encode(Crypto::rsaSign($signed_text, $owner["uprvkey"], "sha256")); $message = array("author" => $old_handle, "profile" => $profile, diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 757c525f96..3c284b29f5 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1235,12 +1235,13 @@ class OStatus /** * @brief Adds the header elements to the XML document * - * @param object $doc XML document - * @param array $owner Contact data of the poster + * @param object $doc XML document + * @param array $owner Contact data of the poster + * @param string $filter The related feed filter (activity, posts or comments) * * @return object header root element */ - private static function addHeader($doc, $owner) + private static function addHeader($doc, $owner, $filter) { $a = get_app(); @@ -1256,10 +1257,16 @@ class OStatus $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET); $root->setAttribute("xmlns:mastodon", NAMESPACE_MASTODON); - $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION); + switch ($filter) { + case 'activity': $title = t('%s\'s timeline', $owner['name']); break; + case 'posts' : $title = t('%s\'s posts' , $owner['name']); break; + case 'comments': $title = t('%s\'s comments', $owner['name']); break; + } + + $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION . "-" . DB_UPDATE_VERSION); XML::addElement($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes); - XML::addElement($doc, $root, "id", System::baseUrl()."/profile/".$owner["nick"]); - XML::addElement($doc, $root, "title", sprintf("%s timeline", $owner["name"])); + XML::addElement($doc, $root, "id", System::baseUrl() . "/profile/" . $owner["nick"]); + XML::addElement($doc, $root, "title", $title); XML::addElement($doc, $root, "subtitle", sprintf("Updates from %s on %s", $owner["name"], $a->config["sitename"])); XML::addElement($doc, $root, "logo", $owner["photo"]); XML::addElement($doc, $root, "updated", datetime_convert("UTC", "UTC", "now", ATOM_TIME)); @@ -1278,17 +1285,17 @@ class OStatus self::hublinks($doc, $root, $owner["nick"]); - $attributes = array("href" => System::baseUrl()."/salmon/".$owner["nick"], "rel" => "salmon"); + $attributes = array("href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "salmon"); XML::addElement($doc, $root, "link", "", $attributes); - $attributes = array("href" => System::baseUrl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-replies"); + $attributes = array("href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-replies"); XML::addElement($doc, $root, "link", "", $attributes); - $attributes = array("href" => System::baseUrl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention"); + $attributes = array("href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention"); XML::addElement($doc, $root, "link", "", $attributes); - $attributes = array("href" => System::baseUrl()."/api/statuses/user_timeline/".$owner["nick"].".atom", - "rel" => "self", "type" => "application/atom+xml"); + $attributes = array("href" => System::baseUrl() . "/api/statuses/user_timeline/" . $owner["nick"] . ".atom", + "rel" => "self", "type" => "application/atom+xml"); XML::addElement($doc, $root, "link", "", $attributes); return $root; @@ -2067,42 +2074,51 @@ class OStatus } /** + * Creates the XML feed for a given nickname + * + * Supported filters: + * - activity (default): all the public posts + * - posts: all the public top-level posts + * - comments: all the public replies + * + * Updates the provided last_update parameter if the result comes from the + * cache or it is empty + * * @brief Creates the XML feed for a given nickname * - * @param object $a The application class * @param string $owner_nick Nickname of the feed owner * @param string $last_update Date of the last update * @param integer $max_items Number of maximum items to fetch + * @param string $filter Feed items filter (activity, posts or comments) + * @param boolean $nocache Wether to bypass caching * * @return string XML feed */ - public static function feed(App $a, $owner_nick, &$last_update, $max_items = 300) + public static function feed($owner_nick, &$last_update, $max_items = 300, $filter = 'activity', $nocache = false) { $stamp = microtime(true); - $cachekey = "ostatus:feed:".$owner_nick.":".$last_update; + $cachekey = "ostatus:feed:" . $owner_nick . ":" . $filter . ":" . $last_update; $previous_created = $last_update; $result = Cache::get($cachekey); - if (!is_null($result)) { - logger('Feed duration: '.number_format(microtime(true) - $stamp, 3).' - '.$owner_nick.' - '.$previous_created.' (cached)', LOGGER_DEBUG); + if (!$nocache && !is_null($result)) { + logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created . ' (cached)', LOGGER_DEBUG); $last_update = $result['last_update']; return $result['feed']; } - $r = q( + $owner = dba::fetch_first( "SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid` - WHERE `contact`.`self` AND `user`.`nickname` = '%s' LIMIT 1", - dbesc($owner_nick) + WHERE `contact`.`self` AND `user`.`nickname` = ? LIMIT 1", + $owner_nick ); - if (!DBM::is_result($r)) { + if (!DBM::is_result($owner)) { return; } - $owner = $r[0]; - if (!strlen($last_update)) { $last_update = 'now -30 days'; } @@ -2110,23 +2126,40 @@ class OStatus $check_date = datetime_convert('UTC', 'UTC', $last_update, 'Y-m-d H:i:s'); $authorid = Contact::getIdForURL($owner["url"], 0); + $sql_extra = ''; + if ($filter === 'posts') { + $sql_extra .= ' AND `item`.`id` = `item`.`parent` '; + } + + if ($filter === 'comments') { + $sql_extra .= sprintf(" AND `item`.`object-type` = '%s' ", dbesc(ACTIVITY_OBJ_COMMENT)); + } + $items = q( "SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` USE INDEX (`uid_contactid_created`) STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` - WHERE `item`.`uid` = %d AND `item`.`contact-id` = %d AND - `item`.`author-id` = %d AND `item`.`created` > '%s' AND - NOT `item`.`deleted` AND NOT `item`.`private` AND - `thread`.`network` IN ('%s', '%s') + WHERE `item`.`uid` = %d + AND `item`.`contact-id` = %d + AND `item`.`author-id` = %d + AND `item`.`created` > '%s' + AND NOT `item`.`deleted` + AND NOT `item`.`private` + AND `thread`.`network` IN ('%s', '%s') + $sql_extra ORDER BY `item`.`created` DESC LIMIT %d", - intval($owner["uid"]), intval($owner["id"]), - intval($authorid), dbesc($check_date), - dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN), intval($max_items) + intval($owner["uid"]), + intval($owner["id"]), + intval($authorid), + dbesc($check_date), + dbesc(NETWORK_OSTATUS), + dbesc(NETWORK_DFRN), + intval($max_items) ); $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::addHeader($doc, $owner); + $root = self::addHeader($doc, $owner, $filter); foreach ($items as $item) { if (Config::get('system', 'ostatus_debug')) { @@ -2145,7 +2178,7 @@ class OStatus $msg = array('feed' => $feeddata, 'last_update' => $last_update); Cache::set($cachekey, $msg, CACHE_QUARTER_HOUR); - logger('Feed duration: '.number_format(microtime(true) - $stamp, 3).' - '.$owner_nick.' - '.$previous_created, LOGGER_DEBUG); + logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created, LOGGER_DEBUG); return $feeddata; } diff --git a/src/Protocol/Salmon.php b/src/Protocol/Salmon.php index d26a3229d1..2bf86f0e36 100644 --- a/src/Protocol/Salmon.php +++ b/src/Protocol/Salmon.php @@ -5,10 +5,9 @@ namespace Friendica\Protocol; use Friendica\Network\Probe; +use Friendica\Util\Crypto; use Friendica\Util\XML; -require_once 'include/crypto.php'; - /** * @brief Salmon Protocol class * The Salmon Protocol is a message exchange protocol running over HTTP designed to decentralize commentary @@ -107,18 +106,18 @@ class Salmon $data_type = 'application/atom+xml'; $encoding = 'base64url'; $algorithm = 'RSA-SHA256'; - $keyhash = base64url_encode(hash('sha256', salmon_key($owner['spubkey'])), true); + $keyhash = base64url_encode(hash('sha256', self::salmonKey($owner['spubkey'])), true); $precomputed = '.' . base64url_encode($data_type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($algorithm); // GNU Social format - $signature = base64url_encode(rsa_sign($data . $precomputed, $owner['sprvkey'])); + $signature = base64url_encode(Crypto::rsaSign($data . $precomputed, $owner['sprvkey'])); // Compliant format - $signature2 = base64url_encode(rsa_sign(str_replace('=', '', $data . $precomputed), $owner['sprvkey'])); + $signature2 = base64url_encode(Crypto::rsaSign(str_replace('=', '', $data . $precomputed), $owner['sprvkey'])); // Old Status.net format - $signature3 = base64url_encode(rsa_sign($data, $owner['sprvkey'])); + $signature3 = base64url_encode(Crypto::rsaSign($data, $owner['sprvkey'])); // At first try the non compliant method that works for GNU Social $xmldata = array("me:env" => array("me:data" => $data, @@ -201,4 +200,14 @@ class Salmon return (($return_code >= 200) && ($return_code < 300)) ? 0 : 1; } + + /** + * @param string $pubkey public key + * @return string + */ + public static function salmonKey($pubkey) + { + Crypto::pemToMe($pubkey, $m, $e); + return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true); + } } diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php new file mode 100644 index 0000000000..adee8cd60e --- /dev/null +++ b/src/Util/Crypto.php @@ -0,0 +1,252 @@ +SetIntBuffer($Modulus); + $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); + $publicExponent->SetIntBuffer($PublicExponent); + $keySequenceItems = array($modulus, $publicExponent); + $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); + $keySequence->SetSequence($keySequenceItems); + //Encode bit string + $bitStringValue = $keySequence->Encode(); + $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte + $bitString = new ASNValue(ASNValue::TAG_BITSTRING); + $bitString->Value = $bitStringValue; + //Encode body + $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode(); + $body = new ASNValue(ASNValue::TAG_SEQUENCE); + $body->Value = $bodyValue; + //Get DER encoded public key: + $PublicDER = $body->Encode(); + return $PublicDER; + } + + /** + * @param string $Modulus modulo + * @param string $PublicExponent exponent + * @return string + */ + private static function pkcs1Encode($Modulus, $PublicExponent) + { + //Encode key sequence + $modulus = new ASNValue(ASNValue::TAG_INTEGER); + $modulus->SetIntBuffer($Modulus); + $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); + $publicExponent->SetIntBuffer($PublicExponent); + $keySequenceItems = array($modulus, $publicExponent); + $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); + $keySequence->SetSequence($keySequenceItems); + //Encode bit string + $bitStringValue = $keySequence->Encode(); + return $bitStringValue; + } + + /** + * @param string $m modulo + * @param string $e exponent + * @return string + */ + public static function meToPem($m, $e) + { + $der = self::pkcs8Encode($m, $e); + $key = self::DerToPem($der, false); + return $key; + } + + /** + * @param string $key key + * @param string $m modulo reference + * @param object $e exponent reference + * @return void + */ + private static function pubRsaToMe($key, &$m, &$e) + { + $lines = explode("\n", $key); + unset($lines[0]); + unset($lines[count($lines)]); + $x = base64_decode(implode('', $lines)); + + $r = ASN_BASE::parseASNString($x); + + $m = base64url_decode($r[0]->asnData[0]->asnData); + $e = base64url_decode($r[0]->asnData[1]->asnData); + } + + /** + * @param string $key key + * @return string + */ + public static function rsaToPem($key) + { + self::pubRsaToMe($key, $m, $e); + return self::meToPem($m, $e); + } + + /** + * @param string $key key + * @return string + */ + private static function pemToRsa($key) + { + self::pemToMe($key, $m, $e); + return self::meToRsa($m, $e); + } + + /** + * @param string $key key + * @param string $m modulo reference + * @param string $e exponent reference + * @return void + */ + public static function pemToMe($key, &$m, &$e) + { + $lines = explode("\n", $key); + unset($lines[0]); + unset($lines[count($lines)]); + $x = base64_decode(implode('', $lines)); + + $r = ASN_BASE::parseASNString($x); + + $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData); + $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData); + } + + /** + * @param string $m modulo + * @param string $e exponent + * @return string + */ + private static function meToRsa($m, $e) + { + $der = self::pkcs1Encode($m, $e); + $key = self::DerToRsa($der); + return $key; + } + + /** + * @param integer $bits number of bits + * @return mixed + */ + public static function newKeypair($bits) + { + $openssl_options = array( + 'digest_alg' => 'sha1', + 'private_key_bits' => $bits, + 'encrypt_key' => false + ); + + $conf = Config::get('system', 'openssl_conf_file'); + if ($conf) { + $openssl_options['config'] = $conf; + } + $result = openssl_pkey_new($openssl_options); + + if (empty($result)) { + logger('new_keypair: failed'); + return false; + } + + // Get private key + $response = array('prvkey' => '', 'pubkey' => ''); + + openssl_pkey_export($result, $response['prvkey']); + + // Get public key + $pkey = openssl_pkey_get_details($result); + $response['pubkey'] = $pkey["key"]; + + return $response; + } +} diff --git a/src/Worker/PubSubPublish.php b/src/Worker/PubSubPublish.php index e2ecedbdf0..3af206e80d 100644 --- a/src/Worker/PubSubPublish.php +++ b/src/Worker/PubSubPublish.php @@ -52,7 +52,7 @@ class PubSubPublish { logger("Generate feed of user ".$rr['nickname']." to ".$rr['callback_url']." - last updated ".$rr['last_update'], LOGGER_DEBUG); $last_update = $rr['last_update']; - $params = OStatus::feed($a, $rr['nickname'], $last_update); + $params = OStatus::feed($rr['nickname'], $last_update); if (!$params) { return; diff --git a/view/templates/shared_content.tpl b/view/templates/shared_content.tpl index d3df6321ab..ee78f842c0 100644 --- a/view/templates/shared_content.tpl +++ b/view/templates/shared_content.tpl @@ -5,7 +5,6 @@ {{/if}} - {{*{{$author}} wrote the following post{{$reldate}}:*}} diff --git a/view/theme/frio/style.php b/view/theme/frio/style.php index 04379b244e..a7b8c8a9d8 100644 --- a/view/theme/frio/style.php +++ b/view/theme/frio/style.php @@ -8,7 +8,7 @@ $schemecss = ""; $schemecssfile = false; $scheme_modified = 0; -if (! $a->install) { +if ($a->module !== 'install') { // Get the UID of the profile owner. $uid = get_theme_uid(); if ($uid) { @@ -57,7 +57,7 @@ if (! $a->install) { // Setting $schema to '' wasn't working for some reason, so we'll check it's // not --- like the mobile theme does instead. // Allow layouts to over-ride the schema. -if ($_REQUEST['schema']) { +if (x($_REQUEST, 'schema')) { $schema = $_REQUEST['schema']; } @@ -103,7 +103,7 @@ $contentbg_transp = ((isset($contentbg_transp) && $contentbg_transp != "") ? $co // Calculate some colors in dependance of existing colors. // Some colors are calculated to don't have too many selection // fields in the theme settings. -if (! $menu_background_hover_color) { +if (!isset($menu_background_hover_color)) { $mbhc = new Color($nav_bg); $mcolor = $mbhc->getHex(); @@ -115,7 +115,7 @@ if (! $menu_background_hover_color) { $menu_background_hover_color = '#' . $mbhc->lighten(5); } } -if (! $nav_icon_hover_color) { +if (!isset($nav_icon_hover_color)) { $nihc = new Color($nav_bg); if ($nihc->isLight()) { @@ -124,7 +124,7 @@ if (! $nav_icon_hover_color) { $nav_icon_hover_color = '#' . $nihc->lighten(10); } } -if (! $link_hover_color) { +if (!isset($link_hover_color)) { $lhc = new Color($link_color); $lcolor = $lhc->getHex(); @@ -137,6 +137,9 @@ if (! $link_hover_color) { } // Convert $bg_image_options into css. +if (!isset($bg_image_option)) { + $bg_image_option = null; +} switch ($bg_image_option) { case "stretch": $background_size_img = "100%"; diff --git a/view/theme/frio/templates/searchbox.tpl b/view/theme/frio/templates/searchbox.tpl index 7d6fbef654..d95d1a4114 100644 --- a/view/theme/frio/templates/searchbox.tpl +++ b/view/theme/frio/templates/searchbox.tpl @@ -47,8 +47,10 @@ Some parts of this template will be moved by js to other places (see theme.js) - {{* This form is inserted as experiment to move the search-save button to the second navbar with js *}} + {{if $savedsearch}}
+ {{/if}} diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 8b17130269..c529b1f98e 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -1,4 +1,5 @@ ReadMe. @@ -18,8 +19,8 @@ $frio = "view/theme/frio"; global $frio; -function frio_init(App $a) { - +function frio_init(App $a) +{ // disable the events module link in the profile tab $a->theme_events_in_profile = false; @@ -35,19 +36,21 @@ function frio_init(App $a) { // if the device is a mobile device set js is_mobile // variable so the js scripts can use this information - if($a->is_mobile || $a->is_tablet) { + if ($a->is_mobile || $a->is_tablet) { $a->page["htmlhead"] .= <<< EOT EOT; -} + } - if ($style == "") + if ($style == "") { $style = Config::get('frio', 'style'); + } } -function frio_install() { +function frio_install() +{ register_hook('prepare_body_final', 'view/theme/frio/theme.php', 'frio_item_photo_links'); register_hook('item_photo_menu', 'view/theme/frio/theme.php', 'frio_item_photo_menu'); register_hook('contact_photo_menu', 'view/theme/frio/theme.php', 'frio_contact_photo_menu'); @@ -58,7 +61,8 @@ function frio_install() { logger("installed theme frio"); } -function frio_uninstall() { +function frio_uninstall() +{ unregister_hook('prepare_body_final', 'view/theme/frio/theme.php', 'frio_item_photo_links'); unregister_hook('item_photo_menu', 'view/theme/frio/theme.php', 'frio_item_photo_menu'); unregister_hook('contact_photo_menu', 'view/theme/frio/theme.php', 'frio_contact_photo_menu'); @@ -68,6 +72,7 @@ function frio_uninstall() { logger("uninstalled theme frio"); } + /** * @brief Replace friendica photo links hook * @@ -86,19 +91,19 @@ function frio_item_photo_links(App $a, &$body_info) $occurence = 1; $p = bb_find_open_close($body_info['html'], ""); - while($p !== false && ($occurence++ < 500)) { + while ($p !== false && ($occurence++ < 500)) { $link = substr($body_info['html'], $p['start'], $p['end'] - $p['start']); $matches = array(); preg_match("/\/photos\/[\w]+\/image\/([\w]+)/", $link, $matches); - if($matches) { + if ($matches) { // Replace the link for the photo's page with a direct link to the photo itself $newlink = str_replace($matches[0], "/photo/{$matches[1]}", $link); // Add a "quiet" parameter to any redir links to prevent the "XX welcomes YY" info boxes $newlink = preg_replace("/href=\"([^\"]+)\/redir\/([^\"]+)&url=([^\"]+)\"/", 'href="$1/redir/$2&quiet=1&url=$3"', $newlink); - // Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image + // Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image $newlink = preg_replace("/\/[?&]zrl=([^&\"]+)/", '', $newlink); $body_info['html'] = str_replace($link, $newlink, $body_info['html']); @@ -118,15 +123,14 @@ function frio_item_photo_links(App $a, &$body_info) * @param App $a Unused but required by the hook definition * @param array $arr Contains item data and the original photo_menu */ -function frio_item_photo_menu(App $a, &$arr) { - - foreach($arr["menu"] as $k =>$v) { - if(strpos($v,'poke/?f=&c=') === 0 || strpos($v,'message/new/') === 0) { +function frio_item_photo_menu(App $a, &$arr) +{ + foreach ($arr["menu"] as $k => $v) { + if (strpos($v, 'poke/?f=&c=') === 0 || strpos($v, 'message/new/') === 0) { $v = "javascript:addToModal('" . $v . "'); return false;"; $arr["menu"][$k] = $v; } } - $args = array('item' => $item, 'menu' => $menu); } /** @@ -141,12 +145,8 @@ function frio_item_photo_menu(App $a, &$arr) { * @param App $a The app data * @param array $args Contains contact data and the original photo_menu */ -function frio_contact_photo_menu(App $a, &$args){ - - $pokelink = ""; - $pmlink = ""; - $cid = ""; - +function frio_contact_photo_menu(App $a, &$args) +{ $cid = $args["contact"]["id"]; $pokelink = $args["menu"]["poke"][1]; $pmlink = $args["menu"]["pm"][1]; @@ -160,8 +160,8 @@ function frio_contact_photo_menu(App $a, &$args){ // The value for opening in a new tab is e.g. when // $args["menu"]["status"][2] is true. If the value of the [2] key is true // and if it's a friendica contact we set it to false - foreach($args["menu"] as $k =>$v) { - if($k === "status" || $k === "profile" || $k === "photos") { + foreach ($args["menu"] as $k => $v) { + if ($k === "status" || $k === "profile" || $k === "photos") { $v[2] = (($args["contact"]["network"] === "dfrn") ? false : true); $args["menu"][$k][2] = $v[2]; } @@ -170,13 +170,13 @@ function frio_contact_photo_menu(App $a, &$args){ // Add to pm and poke links a new key with the value 'modal'. // Later we can make conditions in the corresponing templates (e.g. // contact_template.tpl) - if(strpos($pokelink,'poke/?f=&c='. $cid) !== false) + if (strpos($pokelink, 'poke/?f=&c=' . $cid) !== false) { $args["menu"]["poke"][3] = "modal"; + } - if(strpos($pmlink,'message/new/' . $cid) !== false) + if (strpos($pmlink, 'message/new/' . $cid) !== false) { $args["menu"]["pm"][3] = "modal"; - - $args = array('contact' => $contact, 'menu' => &$menu); + } } /** @@ -193,11 +193,13 @@ function frio_contact_photo_menu(App $a, &$args){ * @param App $a The App class * @param array $nav The original nav menu */ -function frio_remote_nav($a,&$nav) { +function frio_remote_nav($a, &$nav) +{ // get the homelink from $_XSESSION $homelink = get_my_url(); - if(! $homelink) - $homelink = ((x($_SESSION,'visitor_home')) ? $_SESSION['visitor_home'] : ''); + if (!$homelink) { + $homelink = defaults($_SESSION, 'visitor_home', ''); + } // split up the url in it's parts (protocol,domain/directory, /profile/, nickname // I'm not familiar with regex, so someone might find a better solutionen @@ -213,7 +215,7 @@ function frio_remote_nav($a,&$nav) { // And construct a webbie (e.g. mickey@friendica.domain.com for the search in gcontact // We use the webbie for search in gcontact because we don't know if gcontact table stores // the right value if its http or https protocol - if(count($url_parts)) { + if (count($url_parts)) { $server_url = $url_parts[1] . $url_parts[2]; $webbie = $url_parts[4] . '@' . $url_parts[2]; } @@ -228,11 +230,9 @@ function frio_remote_nav($a,&$nav) { $r[0]['photo'] = (DBM::is_result($r) ? $a->remove_baseurl($r[0]['micro']) : "images/person-48.jpg"); $r[0]['name'] = $a->user['username']; - } elseif (!local_user() && remote_user()) { $r = q("SELECT `name`, `nick`, `micro` AS `photo` FROM `contact` WHERE `id` = %d", intval(remote_user())); $nav['remote'] = t("Guest"); - } elseif (get_my_url()) { $r = q("SELECT `name`, `nick`, `photo` FROM `gcontact` WHERE `addr` = '%s' AND `network` = 'dfrn'", @@ -243,18 +243,18 @@ function frio_remote_nav($a,&$nav) { } if (DBM::is_result($r)) { - $nav['userinfo'] = array( - 'icon' => (DBM::is_result($r) ? $r[0]['photo'] : "images/person-48.jpg"), - 'name' => $r[0]['name'], - ); - } + $nav['userinfo'] = array( + 'icon' => (DBM::is_result($r) ? $r[0]['photo'] : "images/person-48.jpg"), + 'name' => $r[0]['name'], + ); + } if (!local_user() && !empty($server_url)) { $nav['logout'] = Array($server_url . '/logout', t('Logout'), "", t('End this session')); // user menu $nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname'], t('Status'), "", t('Your posts and conversations')); - $nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname']. '?tab=profile', t('Profile'), "", t('Your profile page')); + $nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname'] . '?tab=profile', t('Profile'), "", t('Your profile page')); $nav['usermenu'][] = Array($server_url . '/photos/' . $a->user['nickname'], t('Photos'), "", t('Your photos')); $nav['usermenu'][] = Array($server_url . '/videos/' . $a->user['nickname'], t('Videos'), "", t('Your videos')); $nav['usermenu'][] = Array($server_url . '/events/', t('Events'), "", t('Your events')); @@ -263,11 +263,12 @@ function frio_remote_nav($a,&$nav) { $nav['network'] = array($server_url . '/network', t('Network'), "", t('Conversations from your friends')); $nav['events'] = Array($server_url . '/events', t('Events'), "", t('Events and Calendar')); $nav['messages'] = array($server_url . '/message', t('Messages'), "", t('Private mail')); - $nav['settings'] = array($server_url . '/settings', t('Settings'),"", t('Account settings')); - $nav['contacts'] = array($server_url . '/contacts', t('Contacts'),"", t('Manage/edit friends and contacts')); + $nav['settings'] = array($server_url . '/settings', t('Settings'), "", t('Account settings')); + $nav['contacts'] = array($server_url . '/contacts', t('Contacts'), "", t('Manage/edit friends and contacts')); $nav['sitename'] = $a->config['sitename']; } } + /** * @brief: Search for contacts * @@ -281,10 +282,11 @@ function frio_remote_nav($a,&$nav) { * @param App $a The app data @TODO Unused * @param array $results The array with the originals from acl_lookup() */ -function frio_acl_lookup(App $a, &$results) { - require_once("mod/contacts.php"); +function frio_acl_lookup(App $a, &$results) +{ + require_once 'mod/contacts.php'; - $nets = ((x($_GET,"nets")) ? notags(trim($_GET["nets"])) : ""); + $nets = x($_GET, "nets") ? notags(trim($_GET["nets"])) : ""; // we introduce a new search type, r should do the same query like it's // done in /mod/contacts for connections @@ -295,17 +297,17 @@ function frio_acl_lookup(App $a, &$results) { $search_txt = dbesc(protect_sprintf(preg_quote($search))); $searching = true; } - $sql_extra .= (($searching) ? " AND (`attag` LIKE '%%".dbesc($search_txt)."%%' OR `name` LIKE '%%".dbesc($search_txt)."%%' OR `nick` LIKE '%%".dbesc($search_txt)."%%') " : ""); + $sql_extra = ''; + if ($searching) { + $sql_extra .= " AND (`attag` LIKE '%%" . dbesc($search_txt) . "%%' OR `name` LIKE '%%" . dbesc($search_txt) . "%%' OR `nick` LIKE '%%" . dbesc($search_txt) . "%%') "; + } if ($nets) { $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets)); } - $sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : ''); - - $r = q("SELECT COUNT(*) AS `total` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra $sql_extra2 ", + WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra ", intval($_SESSION['uid'])); if (DBM::is_result($r)) { $total = $r[0]["total"]; @@ -313,7 +315,7 @@ function frio_acl_lookup(App $a, &$results) { $sql_extra3 = unavailable_networks(); - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra $sql_extra2 $sql_extra3 ORDER BY `name` ASC LIMIT 100 ", + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra $sql_extra3 ORDER BY `name` ASC LIMIT 100 ", intval($_SESSION['uid']) ); @@ -332,19 +334,19 @@ function frio_acl_lookup(App $a, &$results) { /** * @brief Manipulate the data of the item - * + * * At the moment we use this function to add some own stuff to the item menu - * + * * @param App $a App $a The app data * @param array $arr Array with the item and the item actions
* 'item' => Array with item data
* 'output' => Array with item actions
*/ -function frio_display_item(App $a,&$arr) { - +function frio_display_item(App $a, &$arr) +{ // Add subthread to the item menu $subthread = array(); - if ((local_user()) && local_user() == $arr['item']['uid'] && $arr['item']['parent'] == $arr['item']['id'] && (! $arr['item']['self'])) { + if (local_user() == $arr['item']['uid'] && $arr['item']['parent'] == $arr['item']['id'] && !$arr['item']['self']) { $subthread = array( 'menu' => 'follow_thread', 'title' => t('Follow Thread'),