if ($build != DB_UPDATE_VERSION) {
// When we cannot execute the database update via the worker, we will do it directly
if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
- update_db(get_app());
+ update_db();
}
}
}
// and www.example.com vs example.com.
// We will only change the url to an ip address if there is no existing setting
- if (empty($url)) {
- $url = Config::set('system', 'url', System::baseUrl());
- }
- if ((!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) {
- $url = Config::set('system', 'url', System::baseUrl());
+ if (empty($url) || (!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) {
+ Config::set('system', 'url', System::baseUrl());
}
return;
* @brief Automatic database updates
* @param object $a App
*/
-function update_db(App $a)
+function update_db()
{
$build = Config::get('system', 'build');
Config::set('system', 'build', $x + 1);
return true;
}
- return true;
}
/**
if ($is_mobile) {
if (isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
- $system_theme = $standard_system_theme;
$theme_name = $standard_theme_name;
} else {
$system_theme = Config::get('system', 'mobile-theme', '');
if ($theme_name === '---') {
// user has selected to have the mobile theme be the same as the normal one
- $system_theme = $standard_system_theme;
$theme_name = $standard_theme_name;
if ($page_theme) {
}
}
} else {
- $system_theme = $standard_system_theme;
$theme_name = $standard_theme_name;
if ($page_theme) {
* **allowed_link_protocols** (Array) - Allowed protocols in links URLs, add at your own risk. http is always allowed.
* **always_show_preview** (Boolean) - Only show small preview picures. Default value is false.
-* **birthday_input_format** - Default value is "ymd".
* **block_local_dir** (Boolean) - Blocks the access to the directory of the local users.
* **auth_cookie_lifetime** (Integer) - Number of days that should pass without any activity before a user who chose "Remember me" when logging in is considered logged out. Defaults to 7.
* **curl_range_bytes** - Maximum number of bytes that should be fetched. Default is 0, which mean "no limit".
* **disable_email_validation** (Boolean) - Disables the check if a mail address is in a valid format and can be resolved via DNS.
* **disable_url_validation** (Boolean) - Disables the DNS lookup of an URL.
* **dlogfile - location of the developer log file
-* **event_input_format** - Default value is "ymd".
* **frontend_worker_timeout** - Value in minutes after we think that a frontend task was killed by the webserver. Default value is 10.
* **hsts** (Boolean) - Enables the sending of HTTP Strict Transport Security headers
* **ignore_cache** (Boolean) - For development only. Disables the item cache.
* **memcache_port** - Portnumber of the memcache daemon. Default is 11211.
* **no_count** (Boolean) - Don't do count calculations (currently only when showing albums)
* **no_oembed** (Boolean) - Don't use OEmbed to fetch more information about a link.
-* **no_oembed_rich_content** (Boolean) - Don't show the rich content (e.g. embedded PDF).
* **no_smilies** (Boolean) - Don't show smilies.
* **no_view_full_size** (Boolean) - Don't add the link "View full size" under a resized image.
* **optimize_items** (Boolean) - Triggers an SQL command to optimize the item table before expiring items.
}
-function construct_acl_data(App $a, $user) {
- // This function is now deactivated. It seems as if the generated data isn't used anywhere.
- /// @todo Remove this function and all function calls before releasing Friendica 3.5.3
- return;
-
- // Get group and contact information for html ACL selector
- $acl_data = acl_lookup($a, 'html');
-
- $user_defaults = get_acl_permissions($user);
-
- if ($acl_data['groups']) {
- foreach ($acl_data['groups'] as $key => $group) {
- // Add a "selected" flag to groups that are posted to by default
- if ($user_defaults['allow_gid'] &&
- in_array($group['id'], $user_defaults['allow_gid']) && !in_array($group['id'], $user_defaults['deny_gid']) ) {
- $acl_data['groups'][$key]['selected'] = 1;
- } else {
- $acl_data['groups'][$key]['selected'] = 0;
- }
- }
- }
- if ($acl_data['contacts']) {
- foreach ($acl_data['contacts'] as $key => $contact) {
- // Add a "selected" flag to groups that are posted to by default
- if ($user_defaults['allow_cid'] &&
- in_array($contact['id'], $user_defaults['allow_cid']) && !in_array($contact['id'], $user_defaults['deny_cid']) ) {
- $acl_data['contacts'][$key]['selected'] = 1;
- } else {
- $acl_data['contacts'][$key]['selected'] = 0;
- }
- }
- }
-
- return $acl_data;
-
-}
-
-function acl_lookup(App $a, $out_type = 'json') {
-
+function acl_lookup(App $a, $out_type = 'json')
+{
if (!local_user()) {
return '';
}
- $start = (x($_REQUEST,'start') ? $_REQUEST['start'] : 0);
- $count = (x($_REQUEST,'count') ? $_REQUEST['count'] : 100);
- $search = (x($_REQUEST,'search') ? $_REQUEST['search'] : "");
- $type = (x($_REQUEST,'type') ? $_REQUEST['type'] : "");
- $mode = (x($_REQUEST,'smode') ? $_REQUEST['smode'] : "");
- $conv_id = (x($_REQUEST,'conversation') ? $_REQUEST['conversation'] : null);
+ $start = defaults($_REQUEST, 'start' , 0);
+ $count = defaults($_REQUEST, 'count' , 100);
+ $search = defaults($_REQUEST, 'search' , '');
+ $type = defaults($_REQUEST, 'type' , '');
+ $conv_id = defaults($_REQUEST, 'conversation', null);
// For use with jquery.textcomplete for private mail completion
-
- if (x($_REQUEST, 'query') && strlen($_REQUEST['query'])) {
+ if (x($_REQUEST, 'query')) {
if (! $type) {
$type = 'm';
}
logger("Searching for ".$search." - type ".$type, LOGGER_DEBUG);
- if ($search != "") {
+ if ($search != '') {
$sql_extra = "AND `name` LIKE '%%".dbesc($search)."%%'";
$sql_extra2 = "AND (`attag` LIKE '%%".dbesc($search)."%%' OR `name` LIKE '%%".dbesc($search)."%%' OR `nick` LIKE '%%".dbesc($search)."%%')";
} else {
$contact_count = (int)$r[0]['c'];
} elseif ($type == 'm') {
// autocomplete for Private Messages
-
$r = q("SELECT COUNT(*) AS c FROM `contact`
WHERE `uid` = %d AND NOT `self`
AND NOT `blocked` AND NOT `pending` AND NOT `archive`
$contact_count = (int)$r[0]['c'];
} elseif ($type == 'a') {
-
// autocomplete for Contacts
-
$r = q("SELECT COUNT(*) AS c FROM `contact`
WHERE `uid` = %d AND NOT `self`
AND NOT `pending` $sql_extra2" ,
intval(local_user())
);
$contact_count = (int)$r[0]['c'];
-
} else {
$contact_count = 0;
}
-
- $tot = $group_count+$contact_count;
+ $tot = $group_count + $contact_count;
$groups = array();
$contacts = array();
if ($type == '' || $type == 'g') {
-
/// @todo We should cache this query.
// This can be done when we can delete cache entries via wildcard
$r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') AS uids
);
foreach ($r as $g) {
-// logger('acl: group: ' . $g['name'] . ' members: ' . $g['uids']);
$groups[] = array(
"type" => "g",
"photo" => "images/twopeople.png",
}
if ($type == '') {
-
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact`
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
AND `success_update` >= `failure_update` AND NOT (`network` IN ('%s', '%s'))
$r = array();
}
-
if (DBM::is_result($r)) {
$forums = array();
foreach ($r as $g) {
if (! $localsearch) {
$p = (($a->pager['page'] != 1) ? '&p=' . $a->pager['page'] : '');
- $x = z_fetch_url(get_server().'/lsearch?f=' . $p . '&search=' . urlencode($search));
+ $x = z_fetch_url(get_server() . '/lsearch?f=' . $p . '&search=' . urlencode($search));
if ($x['success']) {
- $t = 0;
$j = json_decode($x['body'],true);
- if ($j && $j['results']) {
+ if ($j && isset($j['results'])) {
return $j['results'];
}
}
logger('API parameters: ' . print_r($_REQUEST, true));
$stamp = microtime(true);
- $r = call_user_func($info['func'], $type);
+ $return = call_user_func($info['func'], $type);
$duration = (float) (microtime(true) - $stamp);
logger("API call duration: " . round($duration, 2) . "\t" . $a->query_string, LOGGER_DEBUG);
}
}
- if (false === $r) {
+ if (false === $return) {
/*
* api function returned false withour throw an
* exception. This should not happend, throw a 500
switch ($type) {
case "xml":
header("Content-Type: text/xml");
- return $r;
break;
case "json":
header("Content-Type: application/json");
- foreach ($r as $rr) {
+ foreach ($return as $rr) {
$json = json_encode($rr);
}
if (x($_GET, 'callback')) {
$json = $_GET['callback'] . "(" . $json . ")";
}
- return $json;
+ $return = $json;
break;
case "rss":
header("Content-Type: application/rss+xml");
- return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
+ $return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
break;
case "atom":
header("Content-Type: application/atom+xml");
- return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
+ $return = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $return;
break;
}
+ return $return;
}
}
"code" => $e->httpcode . " " . $e->httpdesc,
"request" => $a->query_string);
- $ret = api_format_data('status', $type, array('status' => $error));
+ $return = api_format_data('status', $type, array('status' => $error));
switch ($type) {
case "xml":
header("Content-Type: text/xml");
- return $ret;
break;
case "json":
header("Content-Type: application/json");
- return json_encode($ret);
+ $return = json_encode($return);
break;
case "rss":
header("Content-Type: application/rss+xml");
- return $ret;
break;
case "atom":
header("Content-Type: application/atom+xml");
- return $ret;
break;
}
+
+ return $return;
}
/**
$user = null;
$extra_query = "";
$url = "";
- $nick = "";
logger("api_get_user: Fetching user data for user ".$contact_id, LOGGER_DEBUG);
}
if (is_null($user) && x($_GET, 'screen_name')) {
$user = dbesc($_GET['screen_name']);
- $nick = $user;
$extra_query = "AND `contact`.`nick` = '%s' ";
if (api_user() !== false) {
$extra_query .= "AND `contact`.`uid`=".intval(api_user());
if (is_null($user) && x($_GET, 'profileurl')) {
$user = dbesc(normalise_link($_GET['profileurl']));
- $nick = $user;
$extra_query = "AND `contact`.`nurl` = '%s' ";
if (api_user() !== false) {
$extra_query .= "AND `contact`.`uid`=".intval(api_user());
}
} else {
$user = dbesc($user);
- $nick = $user;
$extra_query = "AND `contact`.`nick` = '%s' ";
if (api_user() !== false) {
$extra_query .= "AND `contact`.`uid`=" . intval(api_user());
throw new ForbiddenException();
}
- $user_info = api_get_user($a);
+ api_get_user($a);
// convert $_POST array items to the form we use for web posts.
-
- // logger('api_post: ' . print_r($_POST,true));
-
if (requestdata('htmlstatus')) {
$txt = requestdata('htmlstatus');
if ((strpos($txt, '<') !== false) || (strpos($txt, '>') !== false)) {
/**
* Uploads an image to Friendica.
*
- * @param string $type Return type (atom, rss, xml, json)
- *
* @return array
* @see https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload
*/
-function api_media_upload($type)
+function api_media_upload()
{
$a = get_app();
throw new ForbiddenException();
}
- $user_info = api_get_user($a);
+ api_get_user($a);
if (!x($_FILES, 'media')) {
// Output error
{
$a = get_app();
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] - 1 : 0);
-
$userlist = array();
if (x($_GET, 'q')) {
} else {
throw new BadRequestException("User not found.");
}
+
return api_format_data("users", $type, $userlist);
}
$unseen = q("SELECT `id` FROM `item` WHERE `unseen` AND `id` IN (%s)", $idlist);
if ($unseen) {
- $r = q("UPDATE `item` SET `unseen` = 0 WHERE `unseen` AND `id` IN (%s)", $idlist);
+ q("UPDATE `item` SET `unseen` = 0 WHERE `unseen` AND `id` IN (%s)", $idlist);
}
}
throw new ForbiddenException();
}
- $user_info = api_get_user($a);
+ api_get_user($a);
// params
$id = intval($a->argv[3]);
throw new ForbiddenException();
}
- $user_info = api_get_user($a);
+ api_get_user($a);
// params
$id = intval($a->argv[3]);
// params
- $count = (x($_REQUEST, 'count') ? $_REQUEST['count'] : 20);
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] -1 : 0);
- if ($page < 0) {
- $page = 0;
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id' , 0);
+ $count = defaults($_REQUEST, 'count' , 20);
+ $page = defaults($_REQUEST, 'page' , 1);
+ if ($page < 1) {
+ $page = 1;
}
- $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0);
- $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0);
- //$since_id = 0;//$since_id = (x($_REQUEST, 'since_id')?$_REQUEST['since_id'] : 0);
- $start = $page * $count;
+ $start = ($page - 1) * $count;
// Ugly code - should be changed
$myurl = System::baseUrl() . '/profile/'. $a->user['nickname'];
$myurl = substr($myurl, strpos($myurl, '://') + 3);
- //$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
$myurl = str_replace('www.', '', $myurl);
- $diasp_url = str_replace('/profile/', '/u/', $myurl);
if ($max_id > 0) {
$sql_extra = ' AND `item`.`id` <= ' . intval($max_id);
*/
function api_get_entitities(&$text, $bbcode)
{
- $a = get_app();
-
$include_entities = strtolower(x($_REQUEST, 'include_entities') ? $_REQUEST['include_entities'] : "false");
if ($include_entities != "true") {
*
* @return string
*/
-function api_format_items_embeded_images(&$item, $text)
+function api_format_items_embeded_images($item, $text)
{
$text = preg_replace_callback(
- "|data:image/([^;]+)[^=]+=*|m",
- function ($match) use ($item) {
- return System::baseUrl()."/display/".$item['guid'];
+ '|data:image/([^;]+)[^=]+=*|m',
+ function () use ($item) {
+ return System::baseUrl() . '/display/' . $item['guid'];
},
$text
);
return $text;
}
-
/**
* @brief return <a href='url'>name</a> as array
*
/**
* @brief return data from profiles
*
- * @param array $profile array containing data from db table 'profile'
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+ * @param array $profile_row array containing data from db table 'profile'
* @return array
*/
-function api_format_items_profiles(&$profile = null, $type = "json")
+function api_format_items_profiles($profile_row)
{
- if ($profile != null) {
- $profile = array('profile_id' => $profile['id'],
- 'profile_name' => $profile['profile-name'],
- 'is_default' => $profile['is-default'] ? true : false,
- 'hide_friends'=> $profile['hide-friends'] ? true : false,
- 'profile_photo' => $profile['photo'],
- 'profile_thumb' => $profile['thumb'],
- 'publish' => $profile['publish'] ? true : false,
- 'net_publish' => $profile['net-publish'] ? true : false,
- 'description' => $profile['pdesc'],
- 'date_of_birth' => $profile['dob'],
- 'address' => $profile['address'],
- 'city' => $profile['locality'],
- 'region' => $profile['region'],
- 'postal_code' => $profile['postal-code'],
- 'country' => $profile['country-name'],
- 'hometown' => $profile['hometown'],
- 'gender' => $profile['gender'],
- 'marital' => $profile['marital'],
- 'marital_with' => $profile['with'],
- 'marital_since' => $profile['howlong'],
- 'sexual' => $profile['sexual'],
- 'politic' => $profile['politic'],
- 'religion' => $profile['religion'],
- 'public_keywords' => $profile['pub_keywords'],
- 'private_keywords' => $profile['prv_keywords'],
- 'likes' => bbcode(api_clean_plain_items($profile['likes']), false, false, 2, false),
- 'dislikes' => bbcode(api_clean_plain_items($profile['dislikes']), false, false, 2, false),
- 'about' => bbcode(api_clean_plain_items($profile['about']), false, false, 2, false),
- 'music' => bbcode(api_clean_plain_items($profile['music']), false, false, 2, false),
- 'book' => bbcode(api_clean_plain_items($profile['book']), false, false, 2, false),
- 'tv' => bbcode(api_clean_plain_items($profile['tv']), false, false, 2, false),
- 'film' => bbcode(api_clean_plain_items($profile['film']), false, false, 2, false),
- 'interest' => bbcode(api_clean_plain_items($profile['interest']), false, false, 2, false),
- 'romance' => bbcode(api_clean_plain_items($profile['romance']), false, false, 2, false),
- 'work' => bbcode(api_clean_plain_items($profile['work']), false, false, 2, false),
- 'education' => bbcode(api_clean_plain_items($profile['education']), false, false, 2, false),
- 'social_networks' => bbcode(api_clean_plain_items($profile['contact']), false, false, 2, false),
- 'homepage' => $profile['homepage'],
- 'users' => null);
- return $profile;
- }
+ $profile = array(
+ 'profile_id' => $profile_row['id'],
+ 'profile_name' => $profile_row['profile-name'],
+ 'is_default' => $profile_row['is-default'] ? true : false,
+ 'hide_friends' => $profile_row['hide-friends'] ? true : false,
+ 'profile_photo' => $profile_row['photo'],
+ 'profile_thumb' => $profile_row['thumb'],
+ 'publish' => $profile_row['publish'] ? true : false,
+ 'net_publish' => $profile_row['net-publish'] ? true : false,
+ 'description' => $profile_row['pdesc'],
+ 'date_of_birth' => $profile_row['dob'],
+ 'address' => $profile_row['address'],
+ 'city' => $profile_row['locality'],
+ 'region' => $profile_row['region'],
+ 'postal_code' => $profile_row['postal-code'],
+ 'country' => $profile_row['country-name'],
+ 'hometown' => $profile_row['hometown'],
+ 'gender' => $profile_row['gender'],
+ 'marital' => $profile_row['marital'],
+ 'marital_with' => $profile_row['with'],
+ 'marital_since' => $profile_row['howlong'],
+ 'sexual' => $profile_row['sexual'],
+ 'politic' => $profile_row['politic'],
+ 'religion' => $profile_row['religion'],
+ 'public_keywords' => $profile_row['pub_keywords'],
+ 'private_keywords' => $profile_row['prv_keywords'],
+ 'likes' => bbcode(api_clean_plain_items($profile_row['likes']) , false, false, 2, false),
+ 'dislikes' => bbcode(api_clean_plain_items($profile_row['dislikes']) , false, false, 2, false),
+ 'about' => bbcode(api_clean_plain_items($profile_row['about']) , false, false, 2, false),
+ 'music' => bbcode(api_clean_plain_items($profile_row['music']) , false, false, 2, false),
+ 'book' => bbcode(api_clean_plain_items($profile_row['book']) , false, false, 2, false),
+ 'tv' => bbcode(api_clean_plain_items($profile_row['tv']) , false, false, 2, false),
+ 'film' => bbcode(api_clean_plain_items($profile_row['film']) , false, false, 2, false),
+ 'interest' => bbcode(api_clean_plain_items($profile_row['interest']) , false, false, 2, false),
+ 'romance' => bbcode(api_clean_plain_items($profile_row['romance']) , false, false, 2, false),
+ 'work' => bbcode(api_clean_plain_items($profile_row['work']) , false, false, 2, false),
+ 'education' => bbcode(api_clean_plain_items($profile_row['education']), false, false, 2, false),
+ 'social_networks' => bbcode(api_clean_plain_items($profile_row['contact']) , false, false, 2, false),
+ 'homepage' => $profile_row['homepage'],
+ 'users' => null
+ );
+ return $profile;
}
/**
/**
*
* @param string $type Return type (atom, rss, xml, json)
- * @param string $qtype
*
* @todo use api_format_data() to return data
*/
-function api_ff_ids($type, $qtype)
+function api_ff_ids($type)
{
- $a = get_app();
-
if (! api_user()) {
throw new ForbiddenException();
}
- $user_info = api_get_user($a);
+ api_get_user($a);
- $stringify_ids = (x($_REQUEST, 'stringify_ids') ? $_REQUEST['stringify_ids'] : false);
+ $stringify_ids = defaults($_REQUEST, 'stringify_ids', false);
$r = q(
"SELECT `pcontact`.`id` FROM `contact`
WHERE `contact`.`uid` = %s AND NOT `contact`.`self`",
intval(api_user())
);
-
if (!DBM::is_result($r)) {
return;
}
*/
function api_friends_ids($type)
{
- return api_ff_ids($type, 'friends');
+ return api_ff_ids($type);
}
/**
*/
function api_followers_ids($type)
{
- return api_ff_ids($type, 'followers');
+ return api_ff_ids($type);
}
/// @TODO move to top of file or somewhere better
/**
* Returns an OAuth Request Token.
*
- * @param string $type Return type (atom, rss, xml, json)
* @see https://oauth.net/core/1.0/#auth_step1
*/
-function api_oauth_request_token($type)
+function api_oauth_request_token()
{
$oauth1 = new FKOAuth1();
try {
/**
* Returns an OAuth Access Token.
*
- * @param string $type Return type (atom, rss, xml, json)
- *
* @return array|string
* @see https://oauth.net/core/1.0/#auth_step3
*/
-function api_oauth_access_token($type)
+function api_oauth_access_token()
{
$oauth1 = new FKOAuth1();
try {
throw new ForbiddenException();
}
// input params
- $profileid = (x($_REQUEST, 'profile_id') ? $_REQUEST['profile_id'] : 0);
+ $profileid = defaults($_REQUEST, 'profile_id', 0);
// error if image data is missing
if (!x($_FILES, 'image')) {
}
// change specified profile or all profiles to the new resource-id
if ($is_default_profile) {
- $r = q(
+ q(
"UPDATE `photo` SET `profile` = 0 WHERE `profile` = 1 AND `resource-id` != '%s' AND `uid` = %d",
dbesc($data['photo']['id']),
intval(local_user())
);
- $r = q(
+ q(
"UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s' WHERE `self` AND `uid` = %d",
dbesc(System::baseUrl() . '/photo/' . $data['photo']['id'] . '-4.' . $fileext),
dbesc(System::baseUrl() . '/photo/' . $data['photo']['id'] . '-5.' . $fileext),
intval(local_user())
);
} else {
- $r = q(
+ q(
"UPDATE `profile` SET `photo` = '%s', `thumb` = '%s' WHERE `id` = %d AND `uid` = %d",
dbesc(System::baseUrl() . '/photo/' . $data['photo']['id'] . '-4.' . $filetype),
dbesc(System::baseUrl() . '/photo/' . $data['photo']['id'] . '-5.' . $filetype),
// we'll set the updated profile-photo timestamp even if it isn't the default profile,
// so that browsers will do a cache update unconditionally
- $r = q(
+ q(
"UPDATE `contact` SET `avatar-date` = '%s' WHERE `self` = 1 AND `uid` = %d",
dbesc(datetime_convert()),
intval(local_user())
$cid = $r['id'];
- $dfrn_id = $orig_id = (($r['issued-id']) ? $r['issued-id'] : $r['dfrn-id']);
+ $dfrn_id = defaults($r, 'issued-id', $r['dfrn-id']);
if ($r['duplex'] && $r['issued-id']) {
$orig_id = $r['issued-id'];
intval($uid)
);
if (count($contact)) {
- $result = Group::addMember($gid, $cid);
+ Group::addMember($gid, $cid);
} else {
$erroraddinguser = true;
$errorusers[] = $cid;
$found = ($user['cid'] == $cid ? true : false);
}
if (!$found) {
- $ret = Group::removeMemberByName($uid, $name, $cid);
+ Group::removeMemberByName($uid, $name, $cid);
}
}
);
if (count($contact)) {
- $result = Group::addMember($gid, $cid);
+ Group::addMember($gid, $cid);
} else {
$erroraddinguser = true;
$errorusers[] = $cid;
// loop through all returned profiles and retrieve data and users
$k = 0;
foreach ($r as $rr) {
- $profile = api_format_items_profiles($rr, $type);
+ $profile = api_format_items_profiles($rr);
// select all users from contact table, loop and prepare standard return for user data
$users = array();
} else {
if ($simplehtml != 4) {
$text = sprintf('<span class="type-%s">', $data["type"]);
- } else {
- $span_end = '';
}
$bookmark = array(sprintf('[bookmark=%s]%s[/bookmark]', $data["url"], $data["title"]), $data["url"], $data["title"]);
* returning [i]italic[/i]
*/
function bb_unspacefy_and_trim($st) {
- $whole_match = $st[0];
$captured = $st[1];
$unspacefied = preg_replace("/\[ (.*?)\ ]/", "[$1]", $captured);
return $unspacefied;
<?php
+
/**
* @file include/contact_widgets.php
*/
require_once 'include/contact_selectors.php';
-function follow_widget($value = "") {
-
+function follow_widget($value = "")
+{
return replace_macros(get_markup_template('follow.tpl'), array(
'$connect' => t('Add New Contact'),
'$desc' => t('Enter address or web location'),
'$value' => $value,
'$follow' => t('Connect')
));
-
}
-function findpeople_widget() {
+function findpeople_widget()
+{
$a = get_app();
$global_dir = Config::get('system', 'directory');
$x = PConfig::get(local_user(), 'system', 'invites_remaining');
if ($x || is_site_admin()) {
$a->page['aside'] .= '<div class="side-link" id="side-invite-remain">'
- . sprintf( tt('%d invitation available', '%d invitations available', $x), $x)
- . '</div>' . $inv;
+ . tt('%d invitation available', '%d invitations available', $x)
+ . '</div>' . $inv;
}
}
'$directory' => t('View Global Directory'),
'$global_dir' => $global_dir
));
-
}
-function unavailable_networks() {
- $network_filter = "";
-
+function unavailable_networks()
+{
$networks = array();
if (!plugin_enabled("appnet")) {
return $network_filter;
}
-function networks_widget($baseurl, $selected = '') {
-
- $a = get_app();
-
+function networks_widget($baseurl, $selected = '')
+{
if (!local_user()) {
return '';
}
'$all' => t('All Networks'),
'$nets' => $nets,
'$base' => $baseurl,
-
));
}
-function fileas_widget($baseurl, $selected = '') {
- if (! local_user()) {
+function fileas_widget($baseurl, $selected = '')
+{
+ if (!local_user()) {
return '';
}
- if (! Feature::isEnabled(local_user(), 'filing')) {
+ if (!Feature::isEnabled(local_user(), 'filing')) {
return '';
}
$saved = PConfig::get(local_user(), 'system', 'filetags');
- if (! strlen($saved)) {
+ if (!strlen($saved)) {
return;
}
'$all' => t('Everything'),
'$terms' => $terms,
'$base' => $baseurl,
-
));
}
-function categories_widget($baseurl, $selected = '') {
-
+function categories_widget($baseurl, $selected = '')
+{
$a = get_app();
- if (! Feature::isEnabled($a->profile['profile_uid'], 'categories')) {
+ if (!Feature::isEnabled($a->profile['profile_uid'], 'categories')) {
return '';
}
$saved = PConfig::get($a->profile['profile_uid'], 'system', 'filetags');
- if (! strlen($saved)) {
+ if (!strlen($saved)) {
return;
}
'$all' => t('Everything'),
'$terms' => $terms,
'$base' => $baseurl,
-
));
}
-function common_friends_visitor_widget($profile_uid) {
-
- $a = get_app();
-
+function common_friends_visitor_widget($profile_uid)
+{
if (local_user() == $profile_uid) {
return;
}
}
}
- if (! $cid) {
+ if (!$cid) {
if (get_my_url()) {
$r = dba::select('contact', array('id'),
array('nurl' => normalise_link(get_my_url()), 'uid' => $profile_uid), array('limit' => 1));
$cid = $r['id'];
} else {
$r = dba::select('gcontact', array('id'), array('nurl' => normalise_link(get_my_url())), array('limit' => 1));
- if (DBM::is_result($r))
+ if (DBM::is_result($r)) {
$zcid = $r['id'];
+ }
}
}
}
} else {
$t = GContact::countCommonFriendsZcid($profile_uid, $zcid);
}
- if (! $t) {
+
+ if (!$t) {
return;
}
}
return replace_macros(get_markup_template('remote_friends_common.tpl'), array(
- '$desc' => sprintf(tt("%d contact in common", "%d contacts in common", $t), $t),
+ '$desc' => tt("%d contact in common", "%d contacts in common", $t),
'$base' => System::baseUrl(),
'$uid' => $profile_uid,
'$cid' => (($cid) ? $cid : '0'),
$page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false);
-
- if ($update) {
- $return_url = $_SESSION['return_url'];
- } else {
- $return_url = $_SESSION['return_url'] = $a->query_string;
+ if (!$update) {
+ $_SESSION['return_url'] = $a->query_string;
}
$cb = array('items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview);
$items = $cb['items'];
- $cmnt_tpl = get_markup_template('comment_item.tpl');
- $hide_comments_tpl = get_markup_template('hide_comments.tpl');
-
$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'))
$lock = false;
$likebuttons = false;
- $shareable = false;
$body = prepare_body($item, true, $preview);
* this shouldn't be needed, as we should have only them in our array
* But for now, this array respects the old style, just in case
*/
- $threads = array();
foreach ($items as $item) {
-
if ($arr_blocked) {
$blocked = false;
foreach ($arr_blocked as $b) {
}
$threads = $conv->getTemplateData($conv_responses);
-
if (!$threads) {
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
$threads = array();
$status_link = '';
$photos_link = '';
$posts_link = '';
- $network = '';
if ((local_user()) && local_user() == $item['uid'] && $item['parent'] == $item['id'] && (! $item['self'])) {
$sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
$status_link = $profile_link . '?url=status';
$photos_link = $profile_link . '?url=photos';
$profile_link = $profile_link . '?url=profile';
- $zurl = '';
} else {
$profile_link = zrl($profile_link);
}
break;
default:
return;
- break;
}
if ((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
// ACL permissions box
'$acl' => $x['acl'],
- '$acl_data' => $x['acl_data'],
'$group_perms' => t('Post to Groups'),
'$contact_perms' => t('Post to Contacts'),
'$private' => t('Private post'),
return $ret;
}
-function get_response_button_text($v, $count) {
+function get_response_button_text($v, $count)
+{
switch ($v) {
case 'like':
- return tt('Like', 'Likes', $count, 'noun');
+ $return = tt('Like', 'Likes', $count);
break;
case 'dislike':
- return tt('Dislike', 'Dislikes', $count, 'noun');
+ $return = tt('Dislike', 'Dislikes', $count);
break;
case 'attendyes':
- return tt('Attending', 'Attending', $count, 'noun');
+ $return = tt('Attending', 'Attending', $count);
break;
case 'attendno':
- return tt('Not Attending', 'Not Attending', $count, 'noun');
+ $return = tt('Not Attending', 'Not Attending', $count);
break;
case 'attendmaybe':
- return tt('Undecided', 'Undecided', $count, 'noun');
+ $return = tt('Undecided', 'Undecided', $count);
break;
}
+
+ return $return;
}
* @param string $dob Date of Birth
* @return string Formatted html
*/
-function dob($dob) {
- list($year,$month,$day) = sscanf($dob,'%4d-%2d-%2d');
+function dob($dob)
+{
+ list($year, $month, $day) = sscanf($dob, '%4d-%2d-%2d');
- $f = Config::get('system', 'birthday_input_format');
- if (! $f) {
- $f = 'ymd';
- }
if ($dob <= '0001-01-01') {
$value = '';
} else {
/**
* @brief Returns a date selector
*
- * @param string $format
- * Format string, e.g. 'ymd' or 'mdy'. Not currently supported
* @param string $min
* Unix timestamp of minimum date
* @param string $max
*
* @return string Parsed HTML output.
*/
-function datesel($format, $min, $max, $default, $id = 'datepicker') {
- return datetimesel($format, $min, $max, $default, '', $id, true, false, '', '');
+function datesel($min, $max, $default, $id = 'datepicker')
+{
+ return datetimesel($min, $max, $default, '', $id, true, false, '', '');
}
/**
* @brief Returns a time selector
*
- * @param string $format
- * Format string, e.g. 'ymd' or 'mdy'. Not currently supported
* @param $h
* Already selected hour
* @param $m
*
* @return string Parsed HTML output.
*/
-function timesel($format, $h, $m, $id = 'timepicker') {
- return datetimesel($format, new DateTime(), new DateTime(), new DateTime("$h:$m"), '', $id, false, true);
+function timesel($h, $m, $id = 'timepicker')
+{
+ return datetimesel(new DateTime(), new DateTime(), new DateTime("$h:$m"), '', $id, false, true);
}
/**
* @brief Returns a datetime selector.
*
- * @param string $format
- * format string, e.g. 'ymd' or 'mdy'. Not currently supported
* @param string $min
* unix timestamp of minimum date
* @param string $max
* @todo Once browser support is better this could probably be replaced with
* native HTML5 date picker.
*/
-function datetimesel($format, $min, $max, $default, $label, $id = 'datetimepicker', $pickdate = true, $picktime = true, $minfrom = '', $maxfrom = '', $required = false) {
-
+function datetimesel($min, $max, $default, $label, $id = 'datetimepicker', $pickdate = true, $picktime = true, $minfrom = '', $maxfrom = '', $required = false)
+{
// First day of the week (0 = Sunday)
$firstDay = PConfig::get(local_user(), 'system', 'first_day_of_week', 0);
$bdtext = sprintf( t('%s\'s birthday'), $rr['name']);
$bdtext2 = sprintf( t('Happy Birthday %s'), ' [url=' . $rr['url'] . ']' . $rr['name'] . '[/url]') ;
- $r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`,`adjust`)
+ q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`,`adjust`)
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d' ) ",
intval($rr['uid']),
intval($rr['id']),
source_link, activity, preamble, notify_flags,
language, show_in_notification_page
*/
-function notification($params) {
-
+function notification($params)
+{
$a = get_app();
// from here on everything is in the recipients language
-
push_lang($params['language']);
$banner = t('Friendica Notification');
$siteurl = System::baseUrl(true);
$thanks = t('Thank You,');
$sitename = $a->config['sitename'];
- if (!x($a->config['admin_name']))
+ if (!x($a->config['admin_name'])) {
$site_admin = sprintf(t('%s Administrator'), $sitename);
- else
+ } else {
$site_admin = sprintf(t('%1$s, %2$s Administrator'), $a->config['admin_name'], $sitename);
-
- $nickname = "";
+ }
$sender_name = $sitename;
$hostname = $a->get_hostname();
- if (strpos($hostname, ':'))
+ if (strpos($hostname, ':')) {
$hostname = substr($hostname, 0, strpos($hostname, ':'));
+ }
$sender_email = $a->config['sender_email'];
- if (empty($sender_email))
+ if (empty($sender_email)) {
$sender_email = t('noreply').'@'.$hostname;
+ }
if ($params['type'] != SYSTEM_EMAIL) {
$user = dba::select('user', array('nickname', 'page-flags'),
if (array_key_exists('item', $params)) {
$title = $params['item']['title'];
$body = $params['item']['body'];
- } else
+ } else {
$title = $body = '';
+ }
- // e.g. "your post", "David's photo", etc.
- $possess_desc = t('%s <!item_type!>');
-
- if (isset($params['item']['id']))
+ if (isset($params['item']['id'])) {
$item_id = $params['item']['id'];
- else
+ } else {
$item_id = 0;
+ }
- if (isset($params['parent']))
+ if (isset($params['parent'])) {
$parent_id = $params['parent'];
- else
+ } else {
$parent_id = 0;
+ }
if ($params['type'] == NOTIFY_MAIL) {
$subject = sprintf(t('[Friendica:Notify] New mail received at %s'), $sitename);
// Check to see if there was already a tag notify or comment notify for this post.
// If so don't create a second notification
-
- $p = null;
$p = q("SELECT `id` FROM `notify` WHERE `type` IN (%d, %d, %d) AND `link` = '%s' AND `uid` = %d LIMIT 1",
intval(NOTIFY_TAGSELF),
intval(NOTIFY_COMMENT),
$item_post_type);
// "George Bull's post"
- if ($p)
+ if ($p) {
$dest_str = sprintf(t('%1$s commented on [url=%2$s]%3$s\'s %4$s[/url]'),
'[url='.$params['source_link'].']'.$params['source_name'].'[/url]',
$itemlink,
$p[0]['author-name'],
$item_post_type);
+ }
// "your post"
- if ($p[0]['owner-name'] == $p[0]['author-name'] && $p[0]['wall'])
+ if ($p[0]['owner-name'] == $p[0]['author-name'] && $p[0]['wall']) {
$dest_str = sprintf(t('%1$s commented on [url=%2$s]your %3$s[/url]'),
'[url='.$params['source_link'].']'.$params['source_name'].'[/url]',
$itemlink,
$item_post_type);
+ }
// Some mail softwares relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
$body = $h['body'];
- $sitelink = $h['sitelink'];
$tsitelink = $h['tsitelink'];
$hsitelink = $h['hsitelink'];
$itemlink = $h['itemlink'];
}
// create notification entry in DB
-
- $r = q("INSERT INTO `notify` (`hash`, `name`, `url`, `photo`, `date`, `uid`, `link`, `iid`, `parent`, `type`, `verb`, `otype`, `name_cache`)
+ q("INSERT INTO `notify` (`hash`, `name`, `url`, `photo`, `date`, `uid`, `link`, `iid`, `parent`, `type`, `verb`, `otype`, `name_cache`)
values('%s', '%s', '%s', '%s', '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s')",
dbesc($datarray['hash']),
dbesc($datarray['name']),
dbesc($hash),
intval($params['uid'])
);
- if ($r)
+ if ($r) {
$notify_id = $r[0]['id'];
- else {
+ } else {
pop_lang();
return False;
}
// we seem to have a lot of duplicate comment notifications due to race conditions, mostly from forums
// After we've stored everything, look again to see if there are any duplicates and if so remove them
-
- $p = null;
$p = q("SELECT `id` FROM `notify` WHERE `type` IN (%d, %d) AND `link` = '%s' AND `uid` = %d ORDER BY `id`",
intval(NOTIFY_TAGSELF),
intval(NOTIFY_COMMENT),
}
// only continue on if we stored the first one
-
if ($notify_id != $p[0]['id']) {
pop_lang();
return False;
}
}
-
$itemlink = System::baseUrl().'/notify/view/'.$notify_id;
$msg = replace_macros($epreamble, array('$itemlink' => $itemlink));
$msg_cache = format_notification_message($datarray['name_cache'], strip_tags(bbcode($msg)));
- $r = q("UPDATE `notify` SET `msg` = '%s', `msg_cache` = '%s' WHERE `id` = %d AND `uid` = %d",
+ q("UPDATE `notify` SET `msg` = '%s', `msg_cache` = '%s' WHERE `id` = %d AND `uid` = %d",
dbesc($msg),
dbesc($msg_cache),
intval($notify_id),
if (!$r) {
logger("notify_id:".intval($notify_id).", parent: ".intval($params['parent'])."uid: ".intval($params['uid']), LOGGER_DEBUG);
- $r = q("INSERT INTO `notify-threads` (`notify-id`, `master-parent-item`, `receiver-uid`, `parent-item`)
+ q("INSERT INTO `notify-threads` (`notify-id`, `master-parent-item`, `receiver-uid`, `parent-item`)
values(%d, %d, %d, %d)",
intval($notify_id),
intval($params['parent']),
));
// use the Emailer class to send the message
-
return Emailer::send(
array(
'uid' => $params['uid'],
$contact = $c[0];
}
-
// Existing event being modified.
-
if ($arr['id']) {
// has the event actually changed?
-
$r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($arr['id']),
intval($arr['uid'])
if ((! DBM::is_result($r)) || ($r[0]['edited'] === $arr['edited'])) {
// Nothing has changed. Grab the item id to return.
-
$r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
intval($arr['id']),
intval($arr['uid'])
}
// The event changed. Update it.
-
- $r = q("UPDATE `event` SET
+ q("UPDATE `event` SET
`edited` = '%s',
`start` = '%s',
`finish` = '%s',
intval($arr['id']),
intval($arr['uid'])
);
+
$r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
intval($arr['id']),
intval($arr['uid'])
return $item_id;
} else {
// New event. Store it.
-
- $r = q("INSERT INTO `event` (`uid`,`cid`,`guid`,`uri`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
+ q("INSERT INTO `event` (`uid`,`cid`,`guid`,`uri`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
`adjust`,`nofinish`,`allow_cid`,`allow_gid`,`deny_cid`,`deny_gid`)
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
intval($arr['uid']),
$item_arr['object'] .= '</object>' . "\n";
$item_id = item_store($item_arr);
-
- $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($arr['uid'])
- );
- //if (DBM::is_result($r))
- // $plink = System::baseUrl() . '/display/' . $r[0]['nickname'] . '/' . $item_id;
-
-
if ($item_id) {
- //q("UPDATE `item` SET `plink` = '%s', `event-id` = %d WHERE `uid` = %d AND `id` = %d",
- // dbesc($plink),
- // intval($event['id']),
- // intval($arr['uid']),
- // intval($item_id)
- //);
q("UPDATE `item` SET `event-id` = %d WHERE `uid` = %d AND `id` = %d",
intval($event['id']),
intval($arr['uid']),
* @param string $timezone The timezone of the user (not implemented yet).
*
* @return string Content according to selected export format.
+ *
+ * @todo Implement timezone support
*/
-function event_format_export ($events, $format = 'ical', $timezone) {
- if (! ((is_array($events)) && count($events))) {
+function event_format_export($events, $format = 'ical', $timezone)
+{
+ if (!((is_array($events)) && count($events))) {
return;
}
<?php
-function create_files_from_item($itemid) {
- $a = get_app();
+function create_files_from_item($itemid)
+{
$messages = q("SELECT `guid`, `uid`, `id`, `edited`, `deleted`, `file`, `parent` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid));
-
- if (!$messages)
+ if (!$messages) {
return;
+ }
$message = $messages[0];
if ($message["deleted"])
return;
- if (preg_match_all("/\[(.*?)\]/ism", $message["file"], $files))
- foreach ($files[1] as $file)
- $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`) VALUES (%d, %d, %d, %d, '%s')",
+ if (preg_match_all("/\[(.*?)\]/ism", $message["file"], $files)) {
+ foreach ($files[1] as $file) {
+ q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`) VALUES (%d, %d, %d, %d, '%s')",
intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_FILE), dbesc($file));
+ }
+ }
- if (preg_match_all("/\<(.*?)\>/ism", $message["file"], $files))
- foreach ($files[1] as $file)
- $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`) VALUES (%d, %d, %d, %d, '%s')",
+ if (preg_match_all("/\<(.*?)\>/ism", $message["file"], $files)) {
+ foreach ($files[1] as $file) {
+ q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`) VALUES (%d, %d, %d, %d, '%s')",
intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval(TERM_CATEGORY), dbesc($file));
+ }
+ }
}
-function create_files_from_itemuri($itemuri, $uid) {
+function create_files_from_itemuri($itemuri, $uid)
+{
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if (count($messages)) {
}
}
-function update_files_for_items() {
+function update_files_for_items()
+{
$messages = q("SELECT `id` FROM `item` where file !=''");
foreach ($messages as $message) {
- echo $message["id"]."\n";
+ echo $message["id"] . "\n";
create_files_from_item($message["id"]);
}
}
<?php
+
/**
* @file include/follow.php
*/
use Friendica\Protocol\PortableContact;
use Friendica\Protocol\Salmon;
-function update_contact($id) {
+function update_contact($id)
+{
/*
- Warning: Never ever fetch the public key via Probe::uri and write it into the contacts.
- This will reliably kill your communication with Friendica contacts.
- */
+ Warning: Never ever fetch the public key via Probe::uri and write it into the contacts.
+ This will reliably kill your communication with Friendica contacts.
+ */
$r = q("SELECT `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `network` FROM `contact` WHERE `id` = %d", intval($id));
- if (!$r)
+ if (!$r) {
return false;
+ }
$ret = Probe::uri($r[0]["url"]);
// If Probe::uri fails the network code will be different
- if ($ret["network"] != $r[0]["network"])
+ if ($ret["network"] != $r[0]["network"]) {
return false;
+ }
$update = false;
$update = true;
}
- if (!$update)
+ if (!$update) {
return true;
+ }
q("UPDATE `contact` SET `url` = '%s', `nurl` = '%s', `addr` = '%s', `alias` = '%s', `batch` = '%s', `notify` = '%s', `poll` = '%s', `poco` = '%s' WHERE `id` = %d",
dbesc($ret['url']),
return true;
}
-//
-// Takes a $uid and a url/handle and adds a new contact
-// Currently if the contact is DFRN, interactive needs to be true, to redirect to the
-// dfrn_request page.
-
-// Otherwise this can be used to bulk add statusnet contacts, twitter contacts, etc.
-// Returns an array
-// $return['success'] boolean true if successful
-// $return['message'] error text if success is false.
-
-
-
-function new_contact($uid, $url, $interactive = false, $network = '') {
-
- $result = array('cid' => -1, 'success' => false,'message' => '');
+/**
+ * Takes a $uid and a url/handle and adds a new contact
+ * Currently if the contact is DFRN, interactive needs to be true, to redirect to the
+ * dfrn_request page.
+ *
+ * Otherwise this can be used to bulk add statusnet contacts, twitter contacts, etc.
+ *
+ * Returns an array
+ * $return['success'] boolean true if successful
+ * $return['message'] error text if success is false.
+ *
+ * @brief Takes a $uid and a url/handle and adds a new contact
+ * @param int $uid
+ * @param string $url
+ * @param bool $interactive
+ * @param string $network
+ * @return boolean|string
+ */
+function new_contact($uid, $url, $interactive = false, $network = '')
+{
+ $result = array('cid' => -1, 'success' => false, 'message' => '');
$a = get_app();
// remove ajax junk, e.g. Twitter
+ $url = str_replace('/#!/', '/', $url);
- $url = str_replace('/#!/','/',$url);
-
- if (! allowed_url($url)) {
+ if (!allowed_url($url)) {
$result['message'] = t('Disallowed profile URL.');
return $result;
}
return $result;
}
- if (! $url) {
+ if (!$url) {
$result['message'] = t('Connect URL missing.');
return $result;
}
call_hooks('follow', $arr);
- if (x($arr['contact'],'name')) {
+ if (x($arr['contact'], 'name')) {
$ret = $arr['contact'];
} else {
$ret = Probe::uri($url, $network, $uid, false);
}
if (($network != '') && ($ret['network'] != $network)) {
- logger('Expected network '.$network.' does not match actual network '.$ret['network']);
+ logger('Expected network ' . $network . ' does not match actual network ' . $ret['network']);
return result;
}
// NOTREACHED
}
- } elseif (Config::get('system','dfrn_only')) {
+ } elseif (Config::get('system', 'dfrn_only')) {
$result['message'] = t('This site is not configured to allow communications with other networks.') . EOL;
$result['message'] != t('No compatible communication protocols or feeds were discovered.') . EOL;
return $result;
// This extra param just confuses things, remove it
if ($ret['network'] === NETWORK_DIASPORA) {
- $ret['url'] = str_replace('?absolute=true','',$ret['url']);
+ $ret['url'] = str_replace('?absolute=true', '', $ret['url']);
}
// do we have enough information?
- if (! ((x($ret,'name')) && (x($ret,'poll')) && ((x($ret,'url')) || (x($ret,'addr'))))) {
- $result['message'] .= t('The profile address specified does not provide adequate information.') . EOL;
- if (! x($ret,'poll')) {
+ if (!((x($ret, 'name')) && (x($ret, 'poll')) && ((x($ret, 'url')) || (x($ret, 'addr'))))) {
+ $result['message'] .= t('The profile address specified does not provide adequate information.') . EOL;
+ if (!x($ret, 'poll')) {
$result['message'] .= t('No compatible communication protocols or feeds were discovered.') . EOL;
}
- if (! x($ret,'name')) {
- $result['message'] .= t('An author or name was not found.') . EOL;
+ if (!x($ret, 'name')) {
+ $result['message'] .= t('An author or name was not found.') . EOL;
}
- if (! x($ret,'url')) {
- $result['message'] .= t('No browser URL could be matched to this address.') . EOL;
+ if (!x($ret, 'url')) {
+ $result['message'] .= t('No browser URL could be matched to this address.') . EOL;
}
- if (strpos($url,'@') !== false) {
- $result['message'] .= t('Unable to match @-style Identity Address with a known protocol or email contact.') . EOL;
- $result['message'] .= t('Use mailto: in front of address to force email check.') . EOL;
+ if (strpos($url, '@') !== false) {
+ $result['message'] .= t('Unable to match @-style Identity Address with a known protocol or email contact.') . EOL;
+ $result['message'] .= t('Use mailto: in front of address to force email check.') . EOL;
}
return $result;
}
- if ($ret['network'] === NETWORK_OSTATUS && Config::get('system','ostatus_disabled')) {
+ if ($ret['network'] === NETWORK_OSTATUS && Config::get('system', 'ostatus_disabled')) {
$result['message'] .= t('The profile address specified belongs to a network which has been disabled on this site.') . EOL;
$ret['notify'] = '';
}
- if (! $ret['notify']) {
- $result['message'] .= t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL;
+ if (!$ret['notify']) {
+ $result['message'] .= t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL;
}
$writeable = ((($ret['network'] === NETWORK_OSTATUS) && ($ret['notify'])) ? 1 : 0);
dbesc($ret['network'])
);
- if (!DBM::is_result($r))
+ if (!DBM::is_result($r)) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' LIMIT 1",
intval($uid), dbesc(normalise_link($url)), dbesc($ret['network'])
- );
+ );
+ }
if (DBM::is_result($r)) {
// update contact
$new_relation = ((in_array($ret['network'], array(NETWORK_MAIL))) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
// create contact record
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `network`, `pubkey`, `rel`, `priority`,
+ q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `network`, `pubkey`, `rel`, `priority`,
`writable`, `hidden`, `blocked`, `readonly`, `pending`, `subhub` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0, %d ) ",
intval($uid),
intval($uid)
);
- if (! DBM::is_result($r)) {
- $result['message'] .= t('Unable to retrieve contact information.') . EOL;
+ if (!DBM::is_result($r)) {
+ $result['message'] .= t('Unable to retrieve contact information.') . EOL;
return $result;
}
$contact = $r[0];
- $contact_id = $r[0]['id'];
+ $contact_id = $r[0]['id'];
$result['cid'] = $contact_id;
Group::addMember(User::getDefaultGroup($uid, $contact["network"]), $contact_id);
if ($contact['network'] == NETWORK_DIASPORA) {
$ret = Diaspora::sendShare($a->user, $contact);
- logger('share returns: '.$ret);
+ logger('share returns: ' . $ret);
}
}
<?php
-require_once("include/html2bbcode.php");
+
+require_once 'include/html2bbcode.php';
function breaklines($line, $level, $wraplength = 75)
{
-
- if ($wraplength == 0)
+ if ($wraplength == 0) {
$wraplength = 2000000;
+ }
- // return($line);
-
- $wraplen = $wraplength-$level;
+ $wraplen = $wraplength - $level;
$newlines = array();
$pos = strrpos($subline, ' ');
- if ($pos == 0)
+ if ($pos == 0) {
$pos = strpos($line, ' ');
+ }
if (($pos > 0) && strlen($line) > $wraplen) {
$newline = trim(substr($line, 0, $pos));
- if ($level > 0)
- $newline = str_repeat(">", $level).' '.$newline;
+ if ($level > 0) {
+ $newline = str_repeat(">", $level) . ' ' . $newline;
+ }
- $newlines[] = $newline." ";
- $line = substr($line, $pos+1);
+ $newlines[] = $newline . " ";
+ $line = substr($line, $pos + 1);
}
-
} while ((strlen($line) > $wraplen) && !($oldline == $line));
- if ($level > 0)
- $line = str_repeat(">", $level).' '.$line;
+ if ($level > 0) {
+ $line = str_repeat(">", $level) . ' ' . $line;
+ }
$newlines[] = $line;
-
- return(implode($newlines, "\n"));
+ return implode($newlines, "\n");
}
function quotelevel($message, $wraplength = 75)
$newlines = array();
$level = 0;
- foreach ($lines as $line) {;
+ foreach ($lines as $line) {
$line = trim($line);
$startquote = false;
- while (strpos("*".$line, '[quote]') > 0) {
+ while (strpos("*" . $line, '[quote]') > 0) {
$level++;
$pos = strpos($line, '[quote]');
- $line = substr($line, 0, $pos).substr($line, $pos+7);
+ $line = substr($line, 0, $pos) . substr($line, $pos + 7);
$startquote = true;
}
$currlevel = $level;
- while (strpos("*".$line, '[/quote]') > 0) {
+ while (strpos("*" . $line, '[/quote]') > 0) {
$level--;
- if ($level < 0)
+ if ($level < 0) {
$level = 0;
+ }
$pos = strpos($line, '[/quote]');
- $line = substr($line, 0, $pos).substr($line, $pos+8);
+ $line = substr($line, 0, $pos) . substr($line, $pos + 8);
}
- if (!$startquote || ($line != ''))
+ if (!$startquote || ($line != '')) {
$newlines[] = breaklines($line, $currlevel, $wraplength);
+ }
}
- return(implode($newlines, "\n"));
+
+ return implode($newlines, "\n");
}
-function collecturls($message) {
+function collecturls($message)
+{
$pattern = '/<a.*?href="(.*?)".*?>(.*?)<\/a>/is';
preg_match_all($pattern, $message, $result, PREG_SET_ORDER);
$urls = array();
foreach ($result as $treffer) {
-
$ignore = false;
// A list of some links that should be ignored
$list = array("/user/", "/tag/", "/group/", "/profile/", "/search?search=", "/search?tag=", "mailto:", "/u/", "/node/",
- "//facebook.com/profile.php?id=", "//plus.google.com/", "//twitter.com/");
- foreach ($list as $listitem)
- if (strpos($treffer[1], $listitem) !== false)
+ "//facebook.com/profile.php?id=", "//plus.google.com/", "//twitter.com/");
+ foreach ($list as $listitem) {
+ if (strpos($treffer[1], $listitem) !== false) {
$ignore = true;
+ }
+ }
- if ((strpos($treffer[1], "//twitter.com/") !== false) && (strpos($treffer[1], "/status/") !== false))
- $ignore = false;
+ if ((strpos($treffer[1], "//twitter.com/") !== false) && (strpos($treffer[1], "/status/") !== false)) {
+ $ignore = false;
+ }
- if ((strpos($treffer[1], "//plus.google.com/") !== false) && (strpos($treffer[1], "/posts") !== false))
- $ignore = false;
+ if ((strpos($treffer[1], "//plus.google.com/") !== false) && (strpos($treffer[1], "/posts") !== false)) {
+ $ignore = false;
+ }
- if ((strpos($treffer[1], "//plus.google.com/") !== false) && (strpos($treffer[1], "/photos") !== false))
- $ignore = false;
+ if ((strpos($treffer[1], "//plus.google.com/") !== false) && (strpos($treffer[1], "/photos") !== false)) {
+ $ignore = false;
+ }
- if (!$ignore)
+ if (!$ignore) {
$urls[$treffer[1]] = $treffer[1];
+ }
}
- return($urls);
+
+ return $urls;
}
function html2plain($html, $wraplength = 75, $compact = false)
// MyBB-Auszeichnungen
/*
- node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_');
- node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/');
- node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*');
+ node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_');
+ node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/');
+ node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*');
- node2bbcode($doc, 'strong', array(), '*', '*');
- node2bbcode($doc, 'b', array(), '*', '*');
- node2bbcode($doc, 'i', array(), '/', '/');
- node2bbcode($doc, 'u', array(), '_', '_');
- */
+ node2bbcode($doc, 'strong', array(), '*', '*');
+ node2bbcode($doc, 'b', array(), '*', '*');
+ node2bbcode($doc, 'i', array(), '/', '/');
+ node2bbcode($doc, 'u', array(), '_', '_');
+ */
- if ($compact)
+ if ($compact) {
node2bbcode($doc, 'blockquote', array(), "»", "«");
- else
+ } else {
node2bbcode($doc, 'blockquote', array(), '[quote]', "[/quote]\n");
+ }
node2bbcode($doc, 'br', array(), "\n", '');
//node2bbcode($doc, 'ol', array(), "\n[list=1]", "[/list]\n");
node2bbcode($doc, 'li', array(), "\n* ", "\n");
- node2bbcode($doc, 'hr', array(), "\n".str_repeat("-", 70)."\n", "");
+ node2bbcode($doc, 'hr', array(), "\n" . str_repeat("-", 70) . "\n", "");
node2bbcode($doc, 'tr', array(), "\n", "");
node2bbcode($doc, 'td', array(), "\t", "");
//node2bbcode($doc, 'img', array('alt'=>'/(.+)/'), '$1', '');
//node2bbcode($doc, 'img', array('title'=>'/(.+)/'), '$1', '');
//node2bbcode($doc, 'img', array(), '', '');
- if (!$compact)
- node2bbcode($doc, 'img', array('src'=>'/(.+)/'), ' [img]$1', '[/img] ');
- else
- node2bbcode($doc, 'img', array('src'=>'/(.+)/'), ' ', ' ');
+ if (!$compact) {
+ node2bbcode($doc, 'img', array('src' => '/(.+)/'), ' [img]$1', '[/img] ');
+ } else {
+ node2bbcode($doc, 'img', array('src' => '/(.+)/'), ' ', ' ');
+ }
- node2bbcode($doc, 'iframe', array('src'=>'/(.+)/'), ' $1 ', '', true);
+ node2bbcode($doc, 'iframe', array('src' => '/(.+)/'), ' $1 ', '');
$message = $doc->saveHTML();
// was ersetze ich da?
// Irgendein stoerrisches UTF-Zeug
- $message = str_replace(chr(194).chr(160), ' ', $message);
+ $message = str_replace(chr(194) . chr(160), ' ', $message);
$message = str_replace(" ", " ", $message);
$message = html_entity_decode($message, ENT_QUOTES, 'UTF-8');
- if (!$compact && ($message != "")) {
- $counter = 1;
- foreach ($urls as $id=>$url)
- if ($url != "")
- if (strpos($message, $url) === false)
- $message .= "\n".$url." ";
- //$message .= "\n[".($counter++)."] ".$url;
+ if (!$compact && ($message != '')) {
+ foreach ($urls as $id => $url) {
+ if ($url != '' && strpos($message, $url) === false) {
+ $message .= "\n" . $url . ' ';
+ }
+ }
}
$message = str_replace("\n«", "«\n", $message);
$message = quotelevel(trim($message), $wraplength);
- return(trim($message));
+ return trim($message);
}
$o = '';
$location = false;
- $address = false;
// This function can also use contact information in $profile
$is_contact = x($profile, 'cid');
$xmpp = x($profile, 'xmpp') ? t('XMPP:') : false;
if ((x($profile, 'hidewall') || $block) && !local_user() && !remote_user()) {
- $location = $pdesc = $gender = $marital = $homepage = $about = false;
+ $location = $gender = $marital = $homepage = $about = false;
}
$split_name = Diaspora::splitName($profile['name']);
$cids[] = $rr['cid'];
$today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false);
- $sparkle = '';
$url = $rr['url'];
if ($rr['network'] === NETWORK_DFRN) {
- $sparkle = ' sparkle';
$url = System::baseUrl() . '/redir/' . $rr['cid'];
}
* @file include/items.php
*/
use Friendica\App;
-use Friendica\ParseUrl;
use Friendica\Content\Feature;
use Friendica\Core\Config;
use Friendica\Core\PConfig;
use Friendica\Protocol\DFRN;
use Friendica\Protocol\OStatus;
use Friendica\Protocol\Feed;
+use Friendica\Util\ParseUrl;
require_once 'include/bbcode.php';
require_once 'include/tags.php';
/* limit_body_size()
*
- * The purpose of this function is to apply system message length limits to
- * imported messages without including any embedded photos in the length
+ *
+ *
*/
-function limit_body_size($body) {
-
-// logger('limit_body_size: start', LOGGER_DEBUG);
+/**
+ * The purpose of this function is to apply system message length limits to
+ * imported messages without including any embedded photos in the length
+ *
+ * @brief Truncates imported message body string length to max_import_size
+ * @param string $body
+ * @return string
+ */
+function limit_body_size($body)
+{
$maxlen = get_max_import_size();
// If the length of the body, including the embedded images, is smaller
$orig_body = $body;
$new_body = '';
$textlen = 0;
- $max_found = false;
$img_start = strpos($orig_body, '[img');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
if ($textlen < $maxlen) {
logger('limit_body_size: the limit happens after the end of the last image', LOGGER_DEBUG);
$new_body = $new_body . substr($orig_body, 0, $maxlen - $textlen);
- $textlen = $maxlen;
}
} else {
logger('limit_body_size: the text size with embedded images extracted did not violate the limit', LOGGER_DEBUG);
$new_body = $new_body . $orig_body;
- $textlen += strlen($orig_body);
}
return $new_body;
return "";
}
- if (sizeof($data["images"]) > 0) {
- $preview = $data["images"][0];
- } else {
- $preview = "";
- }
-
// Escape some bad characters
$data["url"] = str_replace(array("[", "]"), array("[", "]"), htmlentities($data["url"], ENT_QUOTES, 'UTF-8', false));
$data["title"] = str_replace(array("[", "]"), array("[", "]"), htmlentities($data["title"], ENT_QUOTES, 'UTF-8', false));
logger("item_store: Checking if parent ".$parent_id." has to be tagged as mention for user ".$arr['uid'], LOGGER_DEBUG);
$u = q("SELECT `nickname` FROM `user` WHERE `uid` = %d", intval($arr['uid']));
if (DBM::is_result($u)) {
- $a = get_app();
$self = normalise_link(System::baseUrl() . '/profile/' . $u[0]['nickname']);
logger("item_store: 'myself' is ".$self." for parent ".$parent_id." checking against ".$arr['author-link']." and ".$arr['owner-link'], LOGGER_DEBUG);
if ((normalise_link($arr['author-link']) == $self) || (normalise_link($arr['owner-link']) == $self)) {
}
// Set parent id
- $r = dba::update('item', array('parent' => $parent_id), array('id' => $current_post));
+ dba::update('item', array('parent' => $parent_id), array('id' => $current_post));
$arr['id'] = $current_post;
$arr['parent'] = $parent_id;
* It is done after the transaction to avoid dead locks.
*/
if ($arr['last-child']) {
- $r = q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d",
+ q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d",
dbesc($arr['uri']),
intval($arr['uid']),
intval($current_post)
// Otherwise there could be problems with hashtags like #test and #test2
rsort($tags);
- $a = get_app();
-
$URLSearchString = "^\[\]";
// All hashtags should point to the home server if "local_tags" is activated
foreach ($contacts as $contact) {
if ($contact['id'] == $item['contact-id']) {
return $contact;
- break; // NOTREACHED
}
}
return false;
* @param int $item_id
* @return bool true if item was deleted, else false
*/
-function tag_deliver($uid, $item_id) {
-
- $a = get_app();
-
+function tag_deliver($uid, $item_id)
+{
$mention = false;
$u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($uid)
);
-
if (! DBM::is_result($u)) {
return;
}
$community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
$prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
-
$i = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($item_id),
intval($uid)
if (is_array($contact)) {
if (($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
|| ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) {
- $r = dba::update('contact', array('rel' => CONTACT_IS_FRIEND, 'writable' => true),
+ dba::update('contact', array('rel' => CONTACT_IS_FRIEND, 'writable' => true),
array('id' => $contact['id'], 'uid' => $importer['uid']));
}
// send email notification to owner?
} else {
-
// create contact record
-
- $r = q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`,
+ q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`,
`blocked`, `readonly`, `pending`, `writable`)
VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, 1)",
intval($importer['uid']),
dbesc(NETWORK_OSTATUS),
intval(CONTACT_IS_FOLLOWER)
);
+
$r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 LIMIT 1",
intval($importer['uid']),
dbesc($url)
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($importer['uid'])
);
-
if (DBM::is_result($r) && !in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE, PAGE_COMMUNITY))) {
-
// create notification
$hash = random_string();
}
} elseif (DBM::is_result($r) && in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE, PAGE_COMMUNITY))) {
- $r = q("UPDATE `contact` SET `pending` = 0 WHERE `uid` = %d AND `url` = '%s' AND `pending` LIMIT 1",
+ q("UPDATE `contact` SET `pending` = 0 WHERE `uid` = %d AND `url` = '%s' AND `pending` LIMIT 1",
intval($importer['uid']),
dbesc($url)
);
logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token);
if (!strlen($contact['hub-verify']) || ($contact['hub-verify'] != $verify_token)) {
- $r = dba::update('contact', array('hub-verify' => $verify_token), array('id' => $contact['id']));
+ dba::update('contact', array('hub-verify' => $verify_token), array('id' => $contact['id']));
}
post_url($url, $params);
}
-function fix_private_photos($s, $uid, $item = null, $cid = 0) {
-
- if (Config::get('system','disable_embedded')) {
+/**
+ *
+ * @param string $s
+ * @param int $uid
+ * @param array $item
+ * @param int $cid
+ * @return string
+ */
+function fix_private_photos($s, $uid, $item = null, $cid = 0)
+{
+ if (Config::get('system', 'disable_embedded')) {
return $s;
}
- $a = get_app();
-
logger('fix_private_photos: check for photos', LOGGER_DEBUG);
- $site = substr(System::baseUrl(),strpos(System::baseUrl(),'://'));
+ $site = substr(System::baseUrl(), strpos(System::baseUrl(), '://'));
$orig_body = $s;
$new_body = '';
$img_start = strpos($orig_body, '[img');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
$img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false);
- while ( ($img_st_close !== false) && ($img_len !== false) ) {
+ while (($img_st_close !== false) && ($img_len !== false)) {
$img_st_close++; // make it point to AFTER the closing bracket
$image = substr($orig_body, $img_start + $img_st_close, $img_len);
logger('fix_private_photos: found photo ' . $image, LOGGER_DEBUG);
-
- if (stristr($image , $site . '/photo/')) {
+ if (stristr($image, $site . '/photo/')) {
// Only embed locally hosted photos
$replace = false;
$i = basename($image);
- $i = str_replace(array('.jpg', '.png', '.gif'),array('', '',''), $i);
+ $i = str_replace(array('.jpg', '.png', '.gif'), array('', '', ''), $i);
$x = strpos($i, '-');
if ($x) {
dbesc($i),
intval($res),
intval($uid)
-
);
if (DBM::is_result($r)) {
/*
logger('delete item: ' . $item['id'], LOGGER_DEBUG);
// delete the item
- $r = dba::update('item', array('deleted' => true, 'title' => '', 'body' => '',
+ dba::update('item', array('deleted' => true, 'title' => '', 'body' => '',
'edited' => datetime_convert(), 'changed' => datetime_convert()),
array('id' => $item['id']));
// Now delete them
if ($parentid != "") {
- $r = q("DELETE FROM `sign` WHERE `iid` IN (%s)", dbesc($parentid));
+ q("DELETE FROM `sign` WHERE `iid` IN (%s)", dbesc($parentid));
}
// If it's the parent of a comment thread, kill all the kids
if ($item['uri'] == $item['parent-uri']) {
- $r = dba::update('item', array('deleted' => true, 'title' => '', 'body' => '',
+ dba::update('item', array('deleted' => true, 'title' => '', 'body' => '',
'edited' => datetime_convert(), 'changed' => datetime_convert()),
array('parent-uri' => $item['parent-uri'], 'uid' => $item['uid']));
$uid = local_user();
}
- if (!can_write_wall($a, $uid)) {
+ if (!can_write_wall($uid)) {
logger('like: unable to write on wall ' . $uid);
return false;
}
use Friendica\Core\Worker;
use Friendica\Database\DBM;
-function send_message($recipient=0, $body='', $subject='', $replyto=''){
-
+function send_message($recipient = 0, $body = '', $subject = '', $replyto = '')
+{
$a = get_app();
- if (! $recipient) return -1;
+ if (!$recipient) {
+ return -1;
+ }
- if (! strlen($subject))
+ if (!strlen($subject)) {
$subject = t('[no subject]');
+ }
$me = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
intval(local_user())
);
$contact = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($recipient),
- intval(local_user())
+ intval($recipient),
+ intval(local_user())
);
- if (! (count($me) && (count($contact)))) {
+ if (!(count($me) && (count($contact)))) {
return -2;
}
$guid = get_guid(32);
- $uri = 'urn:X-dfrn:' . System::baseUrl() . ':' . local_user() . ':' . $guid;
+ $uri = 'urn:X-dfrn:' . System::baseUrl() . ':' . local_user() . ':' . $guid;
$convid = 0;
$reply = false;
if (strlen($replyto)) {
$reply = true;
- $r = q("select convid from mail where uid = %d and ( uri = '%s' or `parent-uri` = '%s' ) limit 1",
+ $r = q("SELECT `convid` FROM `mail` WHERE `uid` = %d AND (`uri` = '%s' OR `parent-uri` = '%s') LIMIT 1",
intval(local_user()),
dbesc($replyto),
dbesc($replyto)
);
- if (DBM::is_result($r))
+ if (DBM::is_result($r)) {
$convid = $r[0]['convid'];
+ }
}
- if (! $convid) {
-
+ if (!$convid) {
// create a new conversation
-
- $recip_host = substr($contact[0]['url'],strpos($contact[0]['url'],'://')+3);
- $recip_host = substr($recip_host,0,strpos($recip_host,'/'));
+ $recip_host = substr($contact[0]['url'], strpos($contact[0]['url'], '://') + 3);
+ $recip_host = substr($recip_host, 0, strpos($recip_host, '/'));
$recip_handle = (($contact[0]['addr']) ? $contact[0]['addr'] : $contact[0]['nick'] . '@' . $recip_host);
- $sender_handle = $a->user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(),'://') + 3);
+ $sender_handle = $a->user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3);
$conv_guid = get_guid(32);
- $convuri = $recip_handle.':'.$conv_guid;
+ $convuri = $recip_handle . ':' . $conv_guid;
$handles = $recip_handle . ';' . $sender_handle;
$fields = array('uid' => local_user(), 'guid' => $conv_guid, 'creator' => $sender_handle,
- 'created' => datetime_convert(), 'updated' => datetime_convert(),
- 'subject' => $subject, 'recips' => $handles);
- $r = dba::insert('conv', $fields);
+ 'created' => datetime_convert(), 'updated' => datetime_convert(),
+ 'subject' => $subject, 'recips' => $handles);
+ dba::insert('conv', $fields);
$r = dba::select('conv', array('id'), array('guid' => $conv_guid, 'uid' => local_user()), array('limit' => 1));
- if (DBM::is_result($r))
+ if (DBM::is_result($r)) {
$convid = $r['id'];
+ }
}
- if (! $convid) {
+ if (!$convid) {
logger('send message: conversation not found.');
return -4;
}
- if (! strlen($replyto)) {
+ if (!strlen($replyto)) {
$replyto = $convuri;
}
-
- $r = q("INSERT INTO `mail` ( `uid`, `guid`, `convid`, `from-name`, `from-photo`, `from-url`,
+ q("INSERT INTO `mail` ( `uid`, `guid`, `convid`, `from-name`, `from-photo`, `from-url`,
`contact-id`, `title`, `body`, `seen`, `reply`, `replied`, `uri`, `parent-uri`, `created`)
VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, '%s', '%s', %d, %d, %d, '%s', '%s', '%s' )",
intval(local_user()),
dbesc($uri),
intval(local_user())
);
- if (DBM::is_result($r))
+ if (DBM::is_result($r)) {
$post_id = $r[0]['id'];
+ }
/**
*
* post and set them to the same permissions as the post itself.
*
*/
-
$match = null;
-
- if (preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
+ if (preg_match_all("/\[img\](.*?)\[\/img\]/", $body, $match)) {
$images = $match[1];
if (count($images)) {
foreach ($images as $image) {
- if (! stristr($image,System::baseUrl() . '/photo/')) {
+ if (!stristr($image, System::baseUrl() . '/photo/')) {
continue;
}
- $image_uri = substr($image,strrpos($image,'/') + 1);
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
- $r = q("UPDATE `photo` SET `allow_cid` = '%s'
+ $image_uri = substr($image, strrpos($image, '/') + 1);
+ $image_uri = substr($image_uri, 0, strpos($image_uri, '-'));
+ q("UPDATE `photo` SET `allow_cid` = '%s'
WHERE `resource-id` = '%s' AND `album` = '%s' AND `uid` = %d ",
dbesc('<' . $recipient . '>'),
dbesc($image_uri),
} else {
return -3;
}
-
}
-function send_wallmessage($recipient='', $body='', $subject='', $replyto=''){
-
- if (! $recipient) {
+function send_wallmessage($recipient = '', $body = '', $subject = '', $replyto = '')
+{
+ if (!$recipient) {
return -1;
}
- if (! strlen($subject)) {
+ if (!strlen($subject)) {
$subject = t('[no subject]');
}
$guid = get_guid(32);
- $uri = 'urn:X-dfrn:' . System::baseUrl() . ':' . local_user() . ':' . $guid;
-
- $convid = 0;
- $reply = false;
+ $uri = 'urn:X-dfrn:' . System::baseUrl() . ':' . local_user() . ':' . $guid;
$me = Probe::uri($replyto);
- if (! $me['name']) {
+ if (!$me['name']) {
return -2;
}
$conv_guid = get_guid(32);
- $recip_handle = $recipient['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(),'://') + 3);
+ $recip_handle = $recipient['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3);
$sender_nick = basename($replyto);
- $sender_host = substr($replyto,strpos($replyto,'://')+3);
- $sender_host = substr($sender_host,0,strpos($sender_host,'/'));
+ $sender_host = substr($replyto, strpos($replyto, '://') + 3);
+ $sender_host = substr($sender_host, 0, strpos($sender_host, '/'));
$sender_handle = $sender_nick . '@' . $sender_host;
$handles = $recip_handle . ';' . $sender_handle;
$fields = array('uid' => $recipient['uid'], 'guid' => $conv_guid, 'creator' => $sender_handle,
- 'created' => datetime_convert(), 'updated' => datetime_convert(),
- 'subject' => $subject, 'recips' => $handles);
- $r = dba::insert('conv', $fields);
+ 'created' => datetime_convert(), 'updated' => datetime_convert(),
+ 'subject' => $subject, 'recips' => $handles);
+ dba::insert('conv', $fields);
$r = dba::select('conv', array('id'), array('guid' => $conv_guid, 'uid' => $recipient['uid']), array('limit' => 1));
if (!DBM::is_result($r)) {
$convid = $r['id'];
- $r = q("INSERT INTO `mail` ( `uid`, `guid`, `convid`, `from-name`, `from-photo`, `from-url`,
+ q("INSERT INTO `mail` ( `uid`, `guid`, `convid`, `from-name`, `from-photo`, `from-url`,
`contact-id`, `title`, `body`, `seen`, `reply`, `replied`, `uri`, `parent-uri`, `created`, `unknown`)
VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, '%s', '%s', %d, %d, %d, '%s', '%s', '%s', %d )",
intval($recipient['uid']),
);
return 0;
-
}
$a->set_curl_code($http_code);
$a->set_curl_content_type($curl_info['content_type']);
- $body = substr($s, strlen($header));
-
$rc = intval($http_code);
$ret['return_code'] = $rc;
$ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false);
return false;
}
- $str_allowed = Config::get('system', 'allowed_email');
- if (! $str_allowed) {
- return true;
- }
+ $str_allowed = Config::get('system', 'allowed_email', '');
+ $allowed = explode(',', $str_allowed);
- $found = false;
+ return allowed_domain($domain, $allowed);
+}
- $fnmatch = function_exists('fnmatch');
- $allowed = explode(',', $str_allowed);
+/**
+ * Checks for the existence of a domain in a domain list
+ *
+ * If strict is not set, an empty domain list counts as found
+ *
+ * @brief Checks for the existence of a domain in a domain list
+ * @param string $domain
+ * @param array $domain_list
+ * @param bool $strict
+ * @return boolean
+ */
+function allowed_domain($domain, array $domain_list, $strict = false)
+{
+ $found = false;
- if (count($allowed)) {
- foreach ($allowed as $a) {
- $pat = strtolower(trim($a));
- if (($fnmatch && fnmatch($pat, $domain)) || ($pat == $domain)) {
+ if (count($domain_list)) {
+ foreach ($domain_list as $item) {
+ $pat = strtolower(trim($item));
+ if (fnmatch($pat, $domain) || ($pat == $domain)) {
$found = true;
break;
}
}
+ } elseif(!$strict) {
+ $found = true;
}
return $found;
}
$include_link = false;
}
- $a = get_app();
-
// Picture addresses can contain special characters
$s = htmlspecialchars_decode($srctext);
$stamp1 = microtime(true);
- $siteinfo = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $a->get_useragent());
- $header = curl_exec($ch);
+ curl_exec($ch);
$curl_info = @curl_getinfo($ch);
$http_code = $curl_info['http_code'];
curl_close($ch);
if (@$attr["http-equiv"] == 'refresh') {
$path = $attr["content"];
$pathinfo = explode(";", $path);
- $content = "";
foreach ($pathinfo as $value) {
if (substr(strtolower($value), 0, 4) == "url=") {
return(original_url(substr($value, 4), ++$depth));
}
}
- return($url);
+ return $url;
}
function short_link($url)
* @file include/plaintext.php
*/
use Friendica\App;
-use Friendica\ParseUrl;
use Friendica\Core\PConfig;
use Friendica\Object\Image;
+use Friendica\Util\ParseUrl;
require_once "include/bbcode.php";
require_once "include/html2plain.php";
return $post;
}
-function shortenmsg($msg, $limit, $twitter = false) {
- /// @TODO
- /// For Twitter URLs aren't shortened, but they have to be calculated as if.
-
+/**
+ * Shortens message
+ *
+ * @param type $msg
+ * @param type $limit
+ * @return type
+ *
+ * @todo For Twitter URLs aren't shortened, but they have to be calculated as if.
+ */
+function shortenmsg($msg, $limit)
+{
$lines = explode("\n", $msg);
$msg = "";
$recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8');
$ellipsis = html_entity_decode("…", ENT_QUOTES, 'UTF-8');
- foreach ($lines AS $row=>$line) {
- if (iconv_strlen(trim($msg."\n".$line), "UTF-8") <= $limit)
- $msg = trim($msg."\n".$line);
- // Is the new message empty by now or is it a reshared message?
- elseif (($msg == "") || (($row == 1) && (substr($msg, 0, 4) == $recycle)))
- $msg = iconv_substr(iconv_substr(trim($msg."\n".$line), 0, $limit, "UTF-8"), 0, -3, "UTF-8").$ellipsis;
- else
+ foreach ($lines AS $row => $line) {
+ if (iconv_strlen(trim($msg . "\n" . $line), "UTF-8") <= $limit) {
+ $msg = trim($msg . "\n" . $line);
+ } elseif (($msg == "") || (($row == 1) && (substr($msg, 0, 4) == $recycle))) {
+ // Is the new message empty by now or is it a reshared message?
+ $msg = iconv_substr(iconv_substr(trim($msg . "\n" . $line), 0, $limit, "UTF-8"), 0, -3, "UTF-8") . $ellipsis;
+ } else {
break;
+ }
}
- return($msg);
+
+ return $msg;
}
/**
* @brief Convert a message into plaintext for connectors to other networks
*
- * @param App $a The application class
* @param array $b The message array that is about to be posted
* @param int $limit The maximum number of characters when posting to that network
* @param bool $includedlinks Has an attached link to be included into the message?
*
* @return string The converted message
*/
-function plaintext(App $a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2, $target_network = "") {
+function plaintext($b, $limit = 0, $includedlinks = false, $htmlmode = 2, $target_network = "") {
// Remove the hash tags
$URLSearchString = "^\[\]";
* @param string $name of the hook to call
* @param string|array &$data to transmit to the callback handler
*/
-function call_hooks($name, &$data = null) {
- $stamp1 = microtime(true);
-
+function call_hooks($name, &$data = null)
+{
$a = get_app();
- if (is_array($a->hooks) && array_key_exists($name, $a->hooks))
- foreach ($a->hooks[$name] as $hook)
+ if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
+ foreach ($a->hooks[$name] as $hook) {
call_single_hook($a, $name, $hook, $data);
+ }
+ }
}
/**
logger("Progress: Start: ".$start_id." position: ".$pos_id." end: ".$end_id, LOGGER_DEBUG);
- $r = q("UPDATE `item` ".$query2." SET `item`.`global` = 1 ".$query3,
+ q("UPDATE `item` ".$query2." SET `item`.`global` = 1 ".$query3,
intval($start_id), intval($pos_id),
dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS));
}
$o .= '</select>';
return $o;
-}
+}
function sexpref_selector($current="",$suffix="") {
$o = '';
}
$o .= '</select>';
return $o;
-}
+}
-function marital_selector($current="",$suffix="") {
+function marital_selector($current = "")
+{
$o = '';
- $select = array('', t('Single'), t('Lonely'), t('Available'), t('Unavailable'), t('Has crush'), t('Infatuated'), t('Dating'), t('Unfaithful'), t('Sex Addict'), t('Friends'), t('Friends/Benefits'), t('Casual'), t('Engaged'), t('Married'), t('Imaginarily married'), t('Partners'), t('Cohabiting'), t('Common law'), t('Happy'), t('Not looking'), t('Swinger'), t('Betrayed'), t('Separated'), t('Unstable'), t('Divorced'), t('Imaginarily divorced'), t('Widowed'), t('Uncertain'), t('It\'s complicated'), t('Don\'t care'), t('Ask me') );
+ $select = array('', t('Single'), t('Lonely'), t('Available'), t('Unavailable'), t('Has crush'), t('Infatuated'), t('Dating'), t('Unfaithful'), t('Sex Addict'), t('Friends'), t('Friends/Benefits'), t('Casual'), t('Engaged'), t('Married'), t('Imaginarily married'), t('Partners'), t('Cohabiting'), t('Common law'), t('Happy'), t('Not looking'), t('Swinger'), t('Betrayed'), t('Separated'), t('Unstable'), t('Divorced'), t('Imaginarily divorced'), t('Widowed'), t('Uncertain'), t('It\'s complicated'), t('Don\'t care'), t('Ask me'));
call_hooks('marital_selector', $select);
- $o .= "<select name=\"marital\" id=\"marital-select\" size=\"1\" >";
+ $o .= '<select name="marital" id="marital-select" size="1" >';
foreach ($select as $selection) {
if ($selection !== 'NOTRANSLATION') {
$selected = (($selection == $current) ? ' selected="selected" ' : '');
}
$o .= '</select>';
return $o;
-}
+}
* @return bool The communication with this contact has currently problems
*/
function was_recently_delayed($cid) {
- $was_delayed = false;
-
// Are there queue entries that were recently added?
$r = q("SELECT `id` FROM `queue` WHERE `cid` = %d
AND `last` > UTC_TIMESTAMP() - INTERVAL 15 MINUTE LIMIT 1",
$batch_queue = 1000;
}
- $r = q("SELECT COUNT(*) AS `total` FROM `queue` INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
+ $r = q("SELECT COUNT(*) AS `total` FROM `queue` INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
WHERE `queue`.`cid` = %d AND `contact`.`self` = 0 ",
intval($cid)
);
use Friendica\Core\System;
use Friendica\Database\DBM;
-function auto_redir(App $a, $contact_nick) {
-
+function auto_redir(App $a, $contact_nick)
+{
// prevent looping
-
- if (x($_REQUEST,'redir') && intval($_REQUEST['redir']))
+ if (x($_REQUEST,'redir') && intval($_REQUEST['redir'])) {
return;
+ }
- if ((! $contact_nick) || ($contact_nick === $a->user['nickname']))
+ if ((! $contact_nick) || ($contact_nick === $a->user['nickname'])) {
return;
+ }
if (local_user()) {
-
// We need to find out if $contact_nick is a user on this hub, and if so, if I
// am a contact of that user. However, that user may have other contacts with the
// same nickname as me on other hubs or other networks. Exclude these by requiring
$baseurl = System::baseUrl();
$domain_st = strpos($baseurl, "://");
- if ($domain_st === false)
+ if ($domain_st === false) {
return;
+ }
$baseurl = substr($baseurl, $domain_st + 3);
$nurl = normalise_link($baseurl);
dbesc($baseurl),
dbesc($nurl)
);
-
if ((! DBM::is_result($r)) || $r[0]['id'] == remote_user()) {
return;
}
intval(local_user()),
dbesc($baseurl)
);
-
if (! DBM::is_result($r)) {
return;
}
$cid = $r[0]['id'];
- $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
+ $dfrn_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
if ($r[0]['duplex'] && $r[0]['issued-id']) {
$orig_id = $r[0]['issued-id'];
// ensure that we've got a valid ID. There may be some edge cases with forums and non-duplex mode
// that may have triggered some of the "went to {profile/intro} and got an RSS feed" issues
- if (strlen($dfrn_id) < 3)
+ if (strlen($dfrn_id) < 3) {
return;
+ }
$sec = random_string();
}
}
-function can_write_wall(App $a, $owner)
+function can_write_wall($owner)
{
static $verified = 0;
}
$uid = local_user();
-
- if (($uid) && ($uid == $owner)) {
+ if ($uid == $owner) {
return true;
}
$session_exists = 0;
$session_expire = 180000;
-function ref_session_open($s, $n)
+function ref_session_open()
{
return true;
}
return true;
}
-function ref_session_gc($expire)
+function ref_session_gc()
{
dba::delete('session', array("`expire` < ?", time()));
return true;
$global = (count($isglobal) > 0);
}
- $r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `guid`, `created`, `received`, `global`)
+ 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));
$redir = false;
if ($redirect) {
- $a = get_app();
$redirect_url = 'redir/' . $contact['id'];
if (local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === NETWORK_DFRN)) {
$redir = true;
* @param boolean $savedsearch show save search button
*/
function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = true) {
- $a = get_app();
-
$values = array(
'$s' => htmlspecialchars($s),
'$id' => $id,
* ]
* ]
*/
-function get_cats_and_terms($item) {
-
- $a = get_app();
+function get_cats_and_terms($item)
+{
$categories = array();
$folders = array();
function file_tag_save_file($uid, $item, $file) {
require_once "include/files.php";
- $result = false;
- if (! intval($uid))
+ if (! intval($uid)) {
return false;
+ }
+
$r = q("SELECT `file` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($item),
intval($uid)
function file_tag_unsave_file($uid, $item, $file, $cat = false) {
require_once "include/files.php";
- $result = false;
- if (! intval($uid))
+ if (! intval($uid)) {
return false;
+ }
if ($cat == true) {
$pattern = '<' . file_tag_encode($file) . '>' ;
$termtype = TERM_FILE;
}
-
$r = q("SELECT `file` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($item),
intval($uid)
dbesc($file),
intval(TERM_OBJ_POST),
intval($termtype),
- intval($uid));
-
+ intval($uid)
+ );
if (!DBM::is_result($r)) {
$saved = PConfig::get($uid, 'system', 'filetags');
PConfig::set($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
$allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
$allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
+ $no_oembed_rich_content = x($_POST,'no_oembed_rich_content');
+ $allowed_oembed = ((x($_POST,'allowed_embed')) ? notags(trim($_POST['allowed_embed'])) : '');
$block_public = ((x($_POST,'block_public')) ? True : False);
$force_publish = ((x($_POST,'publish_all')) ? True : False);
$global_directory = ((x($_POST,'directory')) ? notags(trim($_POST['directory'])) : '');
Config::set('config', 'register_text', $register_text);
Config::set('system', 'allowed_sites', $allowed_sites);
Config::set('system', 'allowed_email', $allowed_email);
+ Config::set('system', 'no_oembed_rich_content', $no_oembed_rich_content);
+ Config::set('system', 'allowed_oembed', $allowed_oembed);
Config::set('system', 'block_public', $block_public);
Config::set('system', 'publish_all', $force_publish);
Config::set('system', 'newuser_private', $newuser_private);
'$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), Config::get('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
'$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), Config::get('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),
'$allowed_email' => array('allowed_email', t("Allowed email domains"), Config::get('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
+ '$no_oembed_rich_content' => array('no_oembed_rich_content', t("No OEmbed rich content"), Config::get('system','no_oembed_rich_content'), t("Don't show the rich content (e.g. embedded PDF), except from the domains listed below.")),
+ '$allowed_oembed' => array('allowed_oembed', t("Allowed OEmbed domains"), Config::get('system','allowed_oembed'), t("Comma separated list of domains which oembed content is allowed to be displayed. Wildcards are accepted.")),
'$block_public' => array('block_public', t("Block public"), Config::get('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently logged in.")),
'$force_publish' => array('publish_all', t("Force publish"), Config::get('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
'$global_directory' => array('directory', t("Global directory URL"), Config::get('system','directory'), t("URL to the global directory. If this is not set, the global directory is completely unavailable to the application.")),
'bang' => '',
'visitor' => 'block',
'profile_uid' => local_user(),
- 'acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
'title' => trim($_REQUEST["title"], "*"),
'content' => $content
);
'bang' => '',
'visitor' => 'block',
'profile_uid' => local_user(),
- 'acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
);
- $o .= status_editor($a,$x,0,true);
+ $o .= status_editor($a, $x, 0, true);
}
$sql_extra = item_permissions_sql($a->profile['uid'], $remote_contact, $groups);
$fhour = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'H') : 0);
$fminute = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'i') : 0);
- $f = Config::get('system','event_input_format');
- if (! $f) {
- $f = 'ymd';
- }
-
require_once 'include/acl_selectors.php' ;
$perms = get_acl_permissions($orig_event);
'$title' => t('Event details'),
'$desc' => t('Starting date and Title are required.'),
'$s_text' => t('Event Starts:') . ' <span class="required" title="' . t('Required') . '">*</span>',
- '$s_dsel' => datetimesel($f, new DateTime(), DateTime::createFromFormat('Y', $syear+5), DateTime::createFromFormat('Y-m-d H:i', "$syear-$smonth-$sday $shour:$sminute"), t('Event Starts:'), 'start_text', true, true, '', '', true),
+ '$s_dsel' => datetimesel(new DateTime(), DateTime::createFromFormat('Y', $syear+5), DateTime::createFromFormat('Y-m-d H:i', "$syear-$smonth-$sday $shour:$sminute"), t('Event Starts:'), 'start_text', true, true, '', '', true),
'$n_text' => t('Finish date/time is not known or not relevant'),
'$n_checked' => $n_checked,
'$f_text' => t('Event Finishes:'),
- '$f_dsel' => datetimesel($f, new DateTime(), DateTime::createFromFormat('Y', $fyear+5), DateTime::createFromFormat('Y-m-d H:i', "$fyear-$fmonth-$fday $fhour:$fminute"), t('Event Finishes:'), 'finish_text', true, true, 'start_text'),
+ '$f_dsel' => datetimesel(new DateTime(), DateTime::createFromFormat('Y', $fyear+5), DateTime::createFromFormat('Y-m-d H:i', "$fyear-$fmonth-$fday $fhour:$fminute"), t('Event Finishes:'), 'finish_text', true, true, 'start_text'),
'$a_text' => t('Adjust for viewer timezone'),
'$a_checked' => $a_checked,
'$d_text' => t('Description:'),
* Now check that it is a page_type of PAGE_BLOG, and that valid personal details
* have been provided, and run any anti-spam plugins
*/
- if (!(can_write_wall($a, $profile_uid) || $allow_comment) && !$allow_moderated) {
+ if (!(can_write_wall($profile_uid) || $allow_comment) && !$allow_moderated) {
notice(t('Permission denied.') . EOL) ;
if (x($_REQUEST, 'return')) {
goaway($return_path);
'bang' => '',
'visitor' => 'block',
'profile_uid' => local_user(),
- 'acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
'content' => '',
);
- $o .= status_editor($a,$x);
+ $o .= status_editor($a, $x);
if (!Config::get('theme','hide_eventlist')) {
$o .= get_birthdays();
'bang' => (($group || $cid || $nets) ? '!' : ''),
'visitor' => 'block',
'profile_uid' => local_user(),
- 'acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
'content' => $content,
);
- $o .= status_editor($a,$x);
-
+ $o .= status_editor($a, $x);
}
// We don't have to deal with ACLs on this page. You're looking at everything
*/
use Friendica\App;
-use Friendica\ParseUrl;
+use Friendica\Util\ParseUrl;
require_once("include/items.php");
'$uploadurl' => $ret['post_url'],
// ACL permissions box
- '$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'),
'$return_path' => $a->query_string,
'$delete' => t('Delete Photo'),
// ACL permissions box
- '$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'),
'$return_path' => $a->query_string,
$tpl = get_markup_template('photo_item.tpl');
$return_url = $a->cmd;
- if ($can_post || can_write_wall($a, $owner_uid)) {
+ if ($can_post || can_write_wall($owner_uid)) {
$like_tpl = get_markup_template('like_noshare.tpl');
$likebuttons = replace_macros($like_tpl, array(
'$id' => $link_item['id'],
}
if (!DBM::is_result($r)) {
- if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) {
+ if (($can_post || can_write_wall($owner_uid)) && $link_item['last-child']) {
$comments .= replace_macros($cmnt_tpl, array(
'$return_path' => '',
'$jsreload' => $return_url,
$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']) {
+ if (($can_post || can_write_wall($owner_uid)) && $link_item['last-child']) {
$comments .= replace_macros($cmnt_tpl,array(
'$return_path' => '',
'$jsreload' => $return_url,
'$comment' => $comment
));
- if (($can_post || can_write_wall($a, $owner_uid)) && $item['last-child']) {
+ if (($can_post || can_write_wall($owner_uid)) && $item['last-child']) {
$comments .= replace_macros($cmnt_tpl, array(
'$return_path' => '',
'$jsreload' => $return_url,
$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->profile['profile_uid'])) {
$x = array(
'is_owner' => $is_owner,
'allow_location' => ($is_owner || $commvisitor) && $a->profile['allow_location'],
'bang' => '',
'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
);
$o .= status_editor($a, $x);
$detailled_profile = (PConfig::get(local_user(), 'system', 'detailled_profile') AND $personal_account);
- $f = Config::get('system', 'birthday_input_format');
- if (! $f) {
- $f = 'ymd';
- }
-
$is_default = (($r[0]['is-default']) ? 1 : 0);
$tpl = get_markup_template("profile_edit.tpl");
$o .= replace_macros($tpl, array(
'$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
// ACL permissions box
- '$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('Default Private Post'),
$owner_uid = $item['uid'];
- if(! can_write_wall($a,$owner_uid)) {
+ if(! can_write_wall($owner_uid)) {
return;
}
\r
use Friendica\Core\Cache;\r
use Friendica\Core\System;\r
-use Friendica\ParseUrl;\r
use Friendica\Core\Config;\r
use Friendica\Database\DBM;\r
+use Friendica\Util\ParseUrl;\r
use dba;\r
use DOMDocument;\r
use DOMXPath;\r
break;\r
case "rich":\r
// not so safe..\r
- if (!Config::get("system", "no_oembed_rich_content")) {\r
- $ret.= proxy_parse_html($jhtml);\r
+ if (self::isAllowedURL($embedurl)) {\r
+ $ret .= proxy_parse_html($jhtml);\r
}\r
break;\r
}\r
}\r
$width = '100%';\r
\r
- $s = System::baseUrl() . '/oembed/' . base64url_encode($src);\r
+ // Only proxy OEmbed URLs to avoid mixed-content errors\r
+ if (Config::get('system', 'ssl_policy') == SSL_POLICY_FULL && parse_url($src, PHP_URL_SCHEME) !== 'https') {\r
+ $src = System::baseUrl() . '/oembed/' . base64url_encode($src);\r
+ }\r
return '<iframe onload="resizeIframe(this);" class="embed_rich" height="' . $height . '" width="' . $width . '" src="' . $s . '" allowfullscreen scrolling="no" frameborder="no">' . t('Embedded content') . '</iframe>';\r
}\r
\r
}\r
return $innerHTML;\r
}\r
+\r
+ /**\r
+ * Determines if rich content OEmbed is allowed for the provided URL\r
+ *\r
+ * @brief Determines if rich content OEmbed is allowed for the provided URL\r
+ * @param string $url\r
+ * @return boolean\r
+ */\r
+ private static function isAllowedURL($url)\r
+ {\r
+ if (!Config::get('system', 'no_oembed_rich_content')) {\r
+ return true;\r
+ }\r
+\r
+ $domain = parse_url($url, PHP_URL_HOST);\r
+\r
+ $str_allowed = Config::get('system', 'allowed_oembed', '');\r
+ $allowed = explode(',', $str_allowed);\r
+\r
+ return allowed_domain($domain, $allowed, true);\r
+ }\r
}\r
break;
case 'profile':
$this->profile_owner = $a->profile['profile_uid'];
- $this->writable = can_write_wall($a, $this->profile_owner);
+ $this->writable = can_write_wall($this->profile_owner);
break;
case 'display':
$this->profile_owner = $a->profile['uid'];
- $this->writable = can_write_wall($a, $this->profile_owner) || $writable;
+ $this->writable = can_write_wall($this->profile_owner) || $writable;
break;
case 'community':
$this->profile_owner = local_user();
+++ /dev/null
-<?php
-/**
- * @file include/ParseUrl.php
- * @brief Get informations about a given URL
- */
-namespace Friendica;
-
-use Friendica\Content\OEmbed;
-use Friendica\Object\Image;
-use Friendica\Util\XML;
-
-use dba;
-use DOMXPath;
-use DOMDocument;
-
-require_once 'include/dba.php';
-require_once "include/network.php";
-
-/**
- * @brief Class with methods for extracting certain content from an url
- */
-class ParseUrl
-{
- /**
- * @brief Search for chached embeddable data of an url otherwise fetch it
- *
- * @param string $url The url of the page which should be scraped
- * @param bool $no_guessing If true the parse doens't search for
- * preview pictures
- * @param bool $do_oembed The false option is used by the function fetch_oembed()
- * to avoid endless loops
- *
- * @return array which contains needed data for embedding
- * string 'url' => The url of the parsed page
- * string 'type' => Content type
- * string 'title' => The title of the content
- * string 'text' => The description for the content
- * string 'image' => A preview image of the content (only available
- * if $no_geuessing = false
- * array'images' = Array of preview pictures
- * string 'keywords' => The tags which belong to the content
- *
- * @see ParseUrl::getSiteinfo() for more information about scraping
- * embeddable content
- */
- public static function getSiteinfoCached($url, $no_guessing = false, $do_oembed = true)
- {
- if ($url == "") {
- return false;
- }
-
- $r = q(
- "SELECT * FROM `parsed_url` WHERE `url` = '%s' AND `guessing` = %d AND `oembed` = %d",
- dbesc(normalise_link($url)),
- intval(!$no_guessing),
- intval($do_oembed)
- );
-
- if ($r) {
- $data = $r[0]["content"];
- }
-
- if (!is_null($data)) {
- $data = unserialize($data);
- return $data;
- }
-
- $data = self::getSiteinfo($url, $no_guessing, $do_oembed);
-
- dba::insert(
- 'parsed_url',
- array(
- 'url' => normalise_link($url), 'guessing' => !$no_guessing,
- 'oembed' => $do_oembed, 'content' => serialize($data),
- 'created' => datetime_convert()),
- true
- );
-
- return $data;
- }
- /**
- * @brief Parse a page for embeddable content information
- *
- * This method parses to url for meta data which can be used to embed
- * the content. If available it prioritizes Open Graph meta tags.
- * If this is not available it uses the twitter cards meta tags.
- * As fallback it uses standard html elements with meta informations
- * like \<title\>Awesome Title\</title\> or
- * \<meta name="description" content="An awesome description"\>
- *
- * @param string $url The url of the page which should be scraped
- * @param bool $no_guessing If true the parse doens't search for
- * preview pictures
- * @param bool $do_oembed The false option is used by the function fetch_oembed()
- * to avoid endless loops
- * @param int $count Internal counter to avoid endless loops
- *
- * @return array which contains needed data for embedding
- * string 'url' => The url of the parsed page
- * string 'type' => Content type
- * string 'title' => The title of the content
- * string 'text' => The description for the content
- * string 'image' => A preview image of the content (only available
- * if $no_geuessing = false
- * array'images' = Array of preview pictures
- * string 'keywords' => The tags which belong to the content
- *
- * @todo https://developers.google.com/+/plugins/snippet/
- * @verbatim
- * <meta itemprop="name" content="Awesome title">
- * <meta itemprop="description" content="An awesome description">
- * <meta itemprop="image" content="http://maple.libertreeproject.org/images/tree-icon.png">
- *
- * <body itemscope itemtype="http://schema.org/Product">
- * <h1 itemprop="name">Shiny Trinket</h1>
- * <img itemprop="image" src="{image-url}" />
- * <p itemprop="description">Shiny trinkets are shiny.</p>
- * </body>
- * @endverbatim
- */
- public static function getSiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1)
- {
- $a = get_app();
-
- $siteinfo = array();
-
- // Check if the URL does contain a scheme
- $scheme = parse_url($url, PHP_URL_SCHEME);
-
- if ($scheme == "") {
- $url = "http://".trim($url, "/");
- }
-
- if ($count > 10) {
- logger("parseurl_getsiteinfo: Endless loop detected for ".$url, LOGGER_DEBUG);
- return($siteinfo);
- }
-
- $url = trim($url, "'");
- $url = trim($url, '"');
-
- $url = strip_tracking_query_params($url);
-
- $siteinfo["url"] = $url;
- $siteinfo["type"] = "link";
-
- $data = z_fetch_url($url);
- if (!$data['success']) {
- return($siteinfo);
- }
-
- // If the file is too large then exit
- if ($data["info"]["download_content_length"] > 1000000) {
- return($siteinfo);
- }
-
- // If it isn't a HTML file then exit
- if (($data["info"]["content_type"] != "") && !strstr(strtolower($data["info"]["content_type"]), "html")) {
- return($siteinfo);
- }
-
- $header = $data["header"];
- $body = $data["body"];
-
- if ($do_oembed) {
- $oembed_data = OEmbed::fetchURL($url);
-
- if (!in_array($oembed_data->type, array("error", "rich", ""))) {
- $siteinfo["type"] = $oembed_data->type;
- }
-
- if (($oembed_data->type == "link") && ($siteinfo["type"] != "photo")) {
- if (isset($oembed_data->title)) {
- $siteinfo["title"] = trim($oembed_data->title);
- }
- if (isset($oembed_data->description)) {
- $siteinfo["text"] = trim($oembed_data->description);
- }
- if (isset($oembed_data->thumbnail_url)) {
- $siteinfo["image"] = $oembed_data->thumbnail_url;
- }
- }
- }
-
- // Fetch the first mentioned charset. Can be in body or header
- $charset = "";
- if (preg_match('/charset=(.*?)['."'".'"\s\n]/', $header, $matches)) {
- $charset = trim(trim(trim(array_pop($matches)), ';,'));
- }
-
- if ($charset == "") {
- $charset = "utf-8";
- }
-
- if (($charset != "") && (strtoupper($charset) != "UTF-8")) {
- logger("parseurl_getsiteinfo: detected charset ".$charset, LOGGER_DEBUG);
- //$body = mb_convert_encoding($body, "UTF-8", $charset);
- $body = iconv($charset, "UTF-8//TRANSLIT", $body);
- }
-
- $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
-
- $doc = new DOMDocument();
- @$doc->loadHTML($body);
-
- XML::deleteNode($doc, "style");
- XML::deleteNode($doc, "script");
- XML::deleteNode($doc, "option");
- XML::deleteNode($doc, "h1");
- XML::deleteNode($doc, "h2");
- XML::deleteNode($doc, "h3");
- XML::deleteNode($doc, "h4");
- XML::deleteNode($doc, "h5");
- XML::deleteNode($doc, "h6");
- XML::deleteNode($doc, "ol");
- XML::deleteNode($doc, "ul");
-
- $xpath = new DOMXPath($doc);
-
- $list = $xpath->query("//meta[@content]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length) {
- foreach ($node->attributes as $attribute) {
- $attr[$attribute->name] = $attribute->value;
- }
- }
-
- if (@$attr["http-equiv"] == "refresh") {
- $path = $attr["content"];
- $pathinfo = explode(";", $path);
- $content = "";
- foreach ($pathinfo as $value) {
- if (substr(strtolower($value), 0, 4) == "url=") {
- $content = substr($value, 4);
- }
- }
- if ($content != "") {
- $siteinfo = self::getSiteinfo($content, $no_guessing, $do_oembed, ++$count);
- return($siteinfo);
- }
- }
- }
-
- $list = $xpath->query("//title");
- if ($list->length > 0) {
- $siteinfo["title"] = trim($list->item(0)->nodeValue);
- }
-
- //$list = $xpath->query("head/meta[@name]");
- $list = $xpath->query("//meta[@name]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length) {
- foreach ($node->attributes as $attribute) {
- $attr[$attribute->name] = $attribute->value;
- }
- }
-
- $attr["content"] = trim(html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8"));
-
- if ($attr["content"] != "") {
- switch (strtolower($attr["name"])) {
- case "fulltitle":
- $siteinfo["title"] = trim($attr["content"]);
- break;
- case "description":
- $siteinfo["text"] = trim($attr["content"]);
- break;
- case "thumbnail":
- $siteinfo["image"] = $attr["content"];
- break;
- case "twitter:image":
- $siteinfo["image"] = $attr["content"];
- break;
- case "twitter:image:src":
- $siteinfo["image"] = $attr["content"];
- break;
- case "twitter:card":
- if (($siteinfo["type"] == "") || ($attr["content"] == "photo")) {
- $siteinfo["type"] = $attr["content"];
- }
- break;
- case "twitter:description":
- $siteinfo["text"] = trim($attr["content"]);
- break;
- case "twitter:title":
- $siteinfo["title"] = trim($attr["content"]);
- break;
- case "dc.title":
- $siteinfo["title"] = trim($attr["content"]);
- break;
- case "dc.description":
- $siteinfo["text"] = trim($attr["content"]);
- break;
- case "keywords":
- $keywords = explode(",", $attr["content"]);
- break;
- case "news_keywords":
- $keywords = explode(",", $attr["content"]);
- break;
- }
- }
- if ($siteinfo["type"] == "summary") {
- $siteinfo["type"] = "link";
- }
- }
-
- if (isset($keywords)) {
- $siteinfo["keywords"] = array();
- foreach ($keywords as $keyword) {
- if (!in_array(trim($keyword), $siteinfo["keywords"])) {
- $siteinfo["keywords"][] = trim($keyword);
- }
- }
- }
-
- //$list = $xpath->query("head/meta[@property]");
- $list = $xpath->query("//meta[@property]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length) {
- foreach ($node->attributes as $attribute) {
- $attr[$attribute->name] = $attribute->value;
- }
- }
-
- $attr["content"] = trim(html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8"));
-
- if ($attr["content"] != "") {
- switch (strtolower($attr["property"])) {
- case "og:image":
- $siteinfo["image"] = $attr["content"];
- break;
- case "og:title":
- $siteinfo["title"] = trim($attr["content"]);
- break;
- case "og:description":
- $siteinfo["text"] = trim($attr["content"]);
- break;
- }
- }
- }
-
- if ((@$siteinfo["image"] == "") && !$no_guessing) {
- $list = $xpath->query("//img[@src]");
- foreach ($list as $node) {
- $attr = array();
- if ($node->attributes->length) {
- foreach ($node->attributes as $attribute) {
- $attr[$attribute->name] = $attribute->value;
- }
- }
-
- $src = self::completeUrl($attr["src"], $url);
- $photodata = Image::getInfoFromURL($src);
-
- if (($photodata) && ($photodata[0] > 150) && ($photodata[1] > 150)) {
- if ($photodata[0] > 300) {
- $photodata[1] = round($photodata[1] * (300 / $photodata[0]));
- $photodata[0] = 300;
- }
- if ($photodata[1] > 300) {
- $photodata[0] = round($photodata[0] * (300 / $photodata[1]));
- $photodata[1] = 300;
- }
- $siteinfo["images"][] = array("src" => $src,
- "width" => $photodata[0],
- "height" => $photodata[1]);
- }
- }
- } elseif ($siteinfo["image"] != "") {
- $src = self::completeUrl($siteinfo["image"], $url);
-
- unset($siteinfo["image"]);
-
- $photodata = Image::getInfoFromURL($src);
-
- if (($photodata) && ($photodata[0] > 10) && ($photodata[1] > 10)) {
- $siteinfo["images"][] = array("src" => $src,
- "width" => $photodata[0],
- "height" => $photodata[1]);
- }
- }
-
- if ((@$siteinfo["text"] == "") && (@$siteinfo["title"] != "") && !$no_guessing) {
- $text = "";
-
- $list = $xpath->query("//div[@class='article']");
- foreach ($list as $node) {
- if (strlen($node->nodeValue) > 40) {
- $text .= " ".trim($node->nodeValue);
- }
- }
-
- if ($text == "") {
- $list = $xpath->query("//div[@class='content']");
- foreach ($list as $node) {
- if (strlen($node->nodeValue) > 40) {
- $text .= " ".trim($node->nodeValue);
- }
- }
- }
-
- // If none text was found then take the paragraph content
- if ($text == "") {
- $list = $xpath->query("//p");
- foreach ($list as $node) {
- if (strlen($node->nodeValue) > 40) {
- $text .= " ".trim($node->nodeValue);
- }
- }
- }
-
- if ($text != "") {
- $text = trim(str_replace(array("\n", "\r"), array(" ", " "), $text));
-
- while (strpos($text, " ")) {
- $text = trim(str_replace(" ", " ", $text));
- }
-
- $siteinfo["text"] = trim(html_entity_decode(substr($text, 0, 350), ENT_QUOTES, "UTF-8").'...');
- }
- }
-
- logger("parseurl_getsiteinfo: Siteinfo for ".$url." ".print_r($siteinfo, true), LOGGER_DEBUG);
-
- call_hooks("getsiteinfo", $siteinfo);
-
- return($siteinfo);
- }
-
- /**
- * @brief Convert tags from CSV to an array
- *
- * @param string $string Tags
- * @return array with formatted Hashtags
- */
- public static function convertTagsToArray($string)
- {
- $arr_tags = str_getcsv($string);
- if (count($arr_tags)) {
- // add the # sign to every tag
- array_walk($arr_tags, array("self", "arrAddHashes"));
-
- return $arr_tags;
- }
- }
-
- /**
- * @brief Add a hasht sign to a string
- *
- * This method is used as callback function
- *
- * @param string $tag The pure tag name
- * @param int $k Counter for internal use
- * @return void
- */
- private static function arrAddHashes(&$tag, $k)
- {
- $tag = "#" . $tag;
- }
-
- /**
- * @brief Add a scheme to an url
- *
- * The src attribute of some html elements (e.g. images)
- * can miss the scheme so we need to add the correct
- * scheme
- *
- * @param string $url The url which possibly does have
- * a missing scheme (a link to an image)
- * @param string $scheme The url with a correct scheme
- * (e.g. the url from the webpage which does contain the image)
- *
- * @return string The url with a scheme
- */
- private static function completeUrl($url, $scheme)
- {
- $urlarr = parse_url($url);
-
- // If the url does allready have an scheme
- // we can stop the process here
- if (isset($urlarr["scheme"])) {
- return($url);
- }
-
- $schemearr = parse_url($scheme);
-
- $complete = $schemearr["scheme"]."://".$schemearr["host"];
-
- if (@$schemearr["port"] != "") {
- $complete .= ":".$schemearr["port"];
- }
-
- if (strpos($urlarr["path"], "/") !== 0) {
- $complete .= "/";
- }
-
- $complete .= $urlarr["path"];
-
- if (@$urlarr["query"] != "") {
- $complete .= "?".$urlarr["query"];
- }
-
- if (@$urlarr["fragment"] != "") {
- $complete .= "#".$urlarr["fragment"];
- }
-
- return($complete);
- }
-}
--- /dev/null
+<?php
+/**
+ * @file src/Util/ParseUrl.php
+ * @brief Get informations about a given URL
+ */
+namespace Friendica\Util;
+
+use Friendica\Content\OEmbed;
+use Friendica\Object\Image;
+use Friendica\Util\XML;
+
+use dba;
+use DOMXPath;
+use DOMDocument;
+
+require_once 'include/dba.php';
+require_once "include/network.php";
+
+/**
+ * @brief Class with methods for extracting certain content from an url
+ */
+class ParseUrl
+{
+ /**
+ * @brief Search for chached embeddable data of an url otherwise fetch it
+ *
+ * @param string $url The url of the page which should be scraped
+ * @param bool $no_guessing If true the parse doens't search for
+ * preview pictures
+ * @param bool $do_oembed The false option is used by the function fetch_oembed()
+ * to avoid endless loops
+ *
+ * @return array which contains needed data for embedding
+ * string 'url' => The url of the parsed page
+ * string 'type' => Content type
+ * string 'title' => The title of the content
+ * string 'text' => The description for the content
+ * string 'image' => A preview image of the content (only available
+ * if $no_geuessing = false
+ * array'images' = Array of preview pictures
+ * string 'keywords' => The tags which belong to the content
+ *
+ * @see ParseUrl::getSiteinfo() for more information about scraping
+ * embeddable content
+ */
+ public static function getSiteinfoCached($url, $no_guessing = false, $do_oembed = true)
+ {
+ if ($url == "") {
+ return false;
+ }
+
+ $r = q(
+ "SELECT * FROM `parsed_url` WHERE `url` = '%s' AND `guessing` = %d AND `oembed` = %d",
+ dbesc(normalise_link($url)),
+ intval(!$no_guessing),
+ intval($do_oembed)
+ );
+
+ if ($r) {
+ $data = $r[0]["content"];
+ }
+
+ if (!is_null($data)) {
+ $data = unserialize($data);
+ return $data;
+ }
+
+ $data = self::getSiteinfo($url, $no_guessing, $do_oembed);
+
+ dba::insert(
+ 'parsed_url',
+ array(
+ 'url' => normalise_link($url), 'guessing' => !$no_guessing,
+ 'oembed' => $do_oembed, 'content' => serialize($data),
+ 'created' => datetime_convert()),
+ true
+ );
+
+ return $data;
+ }
+ /**
+ * @brief Parse a page for embeddable content information
+ *
+ * This method parses to url for meta data which can be used to embed
+ * the content. If available it prioritizes Open Graph meta tags.
+ * If this is not available it uses the twitter cards meta tags.
+ * As fallback it uses standard html elements with meta informations
+ * like \<title\>Awesome Title\</title\> or
+ * \<meta name="description" content="An awesome description"\>
+ *
+ * @param string $url The url of the page which should be scraped
+ * @param bool $no_guessing If true the parse doens't search for
+ * preview pictures
+ * @param bool $do_oembed The false option is used by the function fetch_oembed()
+ * to avoid endless loops
+ * @param int $count Internal counter to avoid endless loops
+ *
+ * @return array which contains needed data for embedding
+ * string 'url' => The url of the parsed page
+ * string 'type' => Content type
+ * string 'title' => The title of the content
+ * string 'text' => The description for the content
+ * string 'image' => A preview image of the content (only available
+ * if $no_geuessing = false
+ * array'images' = Array of preview pictures
+ * string 'keywords' => The tags which belong to the content
+ *
+ * @todo https://developers.google.com/+/plugins/snippet/
+ * @verbatim
+ * <meta itemprop="name" content="Awesome title">
+ * <meta itemprop="description" content="An awesome description">
+ * <meta itemprop="image" content="http://maple.libertreeproject.org/images/tree-icon.png">
+ *
+ * <body itemscope itemtype="http://schema.org/Product">
+ * <h1 itemprop="name">Shiny Trinket</h1>
+ * <img itemprop="image" src="{image-url}" />
+ * <p itemprop="description">Shiny trinkets are shiny.</p>
+ * </body>
+ * @endverbatim
+ */
+ public static function getSiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1)
+ {
+ $a = get_app();
+
+ $siteinfo = array();
+
+ // Check if the URL does contain a scheme
+ $scheme = parse_url($url, PHP_URL_SCHEME);
+
+ if ($scheme == "") {
+ $url = "http://".trim($url, "/");
+ }
+
+ if ($count > 10) {
+ logger("parseurl_getsiteinfo: Endless loop detected for ".$url, LOGGER_DEBUG);
+ return($siteinfo);
+ }
+
+ $url = trim($url, "'");
+ $url = trim($url, '"');
+
+ $url = strip_tracking_query_params($url);
+
+ $siteinfo["url"] = $url;
+ $siteinfo["type"] = "link";
+
+ $data = z_fetch_url($url);
+ if (!$data['success']) {
+ return($siteinfo);
+ }
+
+ // If the file is too large then exit
+ if ($data["info"]["download_content_length"] > 1000000) {
+ return($siteinfo);
+ }
+
+ // If it isn't a HTML file then exit
+ if (($data["info"]["content_type"] != "") && !strstr(strtolower($data["info"]["content_type"]), "html")) {
+ return($siteinfo);
+ }
+
+ $header = $data["header"];
+ $body = $data["body"];
+
+ if ($do_oembed) {
+ $oembed_data = OEmbed::fetchURL($url);
+
+ if (!in_array($oembed_data->type, array("error", "rich", ""))) {
+ $siteinfo["type"] = $oembed_data->type;
+ }
+
+ if (($oembed_data->type == "link") && ($siteinfo["type"] != "photo")) {
+ if (isset($oembed_data->title)) {
+ $siteinfo["title"] = trim($oembed_data->title);
+ }
+ if (isset($oembed_data->description)) {
+ $siteinfo["text"] = trim($oembed_data->description);
+ }
+ if (isset($oembed_data->thumbnail_url)) {
+ $siteinfo["image"] = $oembed_data->thumbnail_url;
+ }
+ }
+ }
+
+ // Fetch the first mentioned charset. Can be in body or header
+ $charset = "";
+ if (preg_match('/charset=(.*?)['."'".'"\s\n]/', $header, $matches)) {
+ $charset = trim(trim(trim(array_pop($matches)), ';,'));
+ }
+
+ if ($charset == "") {
+ $charset = "utf-8";
+ }
+
+ if (($charset != "") && (strtoupper($charset) != "UTF-8")) {
+ logger("parseurl_getsiteinfo: detected charset ".$charset, LOGGER_DEBUG);
+ //$body = mb_convert_encoding($body, "UTF-8", $charset);
+ $body = iconv($charset, "UTF-8//TRANSLIT", $body);
+ }
+
+ $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
+
+ $doc = new DOMDocument();
+ @$doc->loadHTML($body);
+
+ XML::deleteNode($doc, "style");
+ XML::deleteNode($doc, "script");
+ XML::deleteNode($doc, "option");
+ XML::deleteNode($doc, "h1");
+ XML::deleteNode($doc, "h2");
+ XML::deleteNode($doc, "h3");
+ XML::deleteNode($doc, "h4");
+ XML::deleteNode($doc, "h5");
+ XML::deleteNode($doc, "h6");
+ XML::deleteNode($doc, "ol");
+ XML::deleteNode($doc, "ul");
+
+ $xpath = new DOMXPath($doc);
+
+ $list = $xpath->query("//meta[@content]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length) {
+ foreach ($node->attributes as $attribute) {
+ $attr[$attribute->name] = $attribute->value;
+ }
+ }
+
+ if (@$attr["http-equiv"] == "refresh") {
+ $path = $attr["content"];
+ $pathinfo = explode(";", $path);
+ $content = "";
+ foreach ($pathinfo as $value) {
+ if (substr(strtolower($value), 0, 4) == "url=") {
+ $content = substr($value, 4);
+ }
+ }
+ if ($content != "") {
+ $siteinfo = self::getSiteinfo($content, $no_guessing, $do_oembed, ++$count);
+ return($siteinfo);
+ }
+ }
+ }
+
+ $list = $xpath->query("//title");
+ if ($list->length > 0) {
+ $siteinfo["title"] = trim($list->item(0)->nodeValue);
+ }
+
+ //$list = $xpath->query("head/meta[@name]");
+ $list = $xpath->query("//meta[@name]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length) {
+ foreach ($node->attributes as $attribute) {
+ $attr[$attribute->name] = $attribute->value;
+ }
+ }
+
+ $attr["content"] = trim(html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8"));
+
+ if ($attr["content"] != "") {
+ switch (strtolower($attr["name"])) {
+ case "fulltitle":
+ $siteinfo["title"] = trim($attr["content"]);
+ break;
+ case "description":
+ $siteinfo["text"] = trim($attr["content"]);
+ break;
+ case "thumbnail":
+ $siteinfo["image"] = $attr["content"];
+ break;
+ case "twitter:image":
+ $siteinfo["image"] = $attr["content"];
+ break;
+ case "twitter:image:src":
+ $siteinfo["image"] = $attr["content"];
+ break;
+ case "twitter:card":
+ if (($siteinfo["type"] == "") || ($attr["content"] == "photo")) {
+ $siteinfo["type"] = $attr["content"];
+ }
+ break;
+ case "twitter:description":
+ $siteinfo["text"] = trim($attr["content"]);
+ break;
+ case "twitter:title":
+ $siteinfo["title"] = trim($attr["content"]);
+ break;
+ case "dc.title":
+ $siteinfo["title"] = trim($attr["content"]);
+ break;
+ case "dc.description":
+ $siteinfo["text"] = trim($attr["content"]);
+ break;
+ case "keywords":
+ $keywords = explode(",", $attr["content"]);
+ break;
+ case "news_keywords":
+ $keywords = explode(",", $attr["content"]);
+ break;
+ }
+ }
+ if ($siteinfo["type"] == "summary") {
+ $siteinfo["type"] = "link";
+ }
+ }
+
+ if (isset($keywords)) {
+ $siteinfo["keywords"] = array();
+ foreach ($keywords as $keyword) {
+ if (!in_array(trim($keyword), $siteinfo["keywords"])) {
+ $siteinfo["keywords"][] = trim($keyword);
+ }
+ }
+ }
+
+ //$list = $xpath->query("head/meta[@property]");
+ $list = $xpath->query("//meta[@property]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length) {
+ foreach ($node->attributes as $attribute) {
+ $attr[$attribute->name] = $attribute->value;
+ }
+ }
+
+ $attr["content"] = trim(html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8"));
+
+ if ($attr["content"] != "") {
+ switch (strtolower($attr["property"])) {
+ case "og:image":
+ $siteinfo["image"] = $attr["content"];
+ break;
+ case "og:title":
+ $siteinfo["title"] = trim($attr["content"]);
+ break;
+ case "og:description":
+ $siteinfo["text"] = trim($attr["content"]);
+ break;
+ }
+ }
+ }
+
+ if ((@$siteinfo["image"] == "") && !$no_guessing) {
+ $list = $xpath->query("//img[@src]");
+ foreach ($list as $node) {
+ $attr = array();
+ if ($node->attributes->length) {
+ foreach ($node->attributes as $attribute) {
+ $attr[$attribute->name] = $attribute->value;
+ }
+ }
+
+ $src = self::completeUrl($attr["src"], $url);
+ $photodata = Image::getInfoFromURL($src);
+
+ if (($photodata) && ($photodata[0] > 150) && ($photodata[1] > 150)) {
+ if ($photodata[0] > 300) {
+ $photodata[1] = round($photodata[1] * (300 / $photodata[0]));
+ $photodata[0] = 300;
+ }
+ if ($photodata[1] > 300) {
+ $photodata[0] = round($photodata[0] * (300 / $photodata[1]));
+ $photodata[1] = 300;
+ }
+ $siteinfo["images"][] = array("src" => $src,
+ "width" => $photodata[0],
+ "height" => $photodata[1]);
+ }
+ }
+ } elseif ($siteinfo["image"] != "") {
+ $src = self::completeUrl($siteinfo["image"], $url);
+
+ unset($siteinfo["image"]);
+
+ $photodata = Image::getInfoFromURL($src);
+
+ if (($photodata) && ($photodata[0] > 10) && ($photodata[1] > 10)) {
+ $siteinfo["images"][] = array("src" => $src,
+ "width" => $photodata[0],
+ "height" => $photodata[1]);
+ }
+ }
+
+ if ((@$siteinfo["text"] == "") && (@$siteinfo["title"] != "") && !$no_guessing) {
+ $text = "";
+
+ $list = $xpath->query("//div[@class='article']");
+ foreach ($list as $node) {
+ if (strlen($node->nodeValue) > 40) {
+ $text .= " ".trim($node->nodeValue);
+ }
+ }
+
+ if ($text == "") {
+ $list = $xpath->query("//div[@class='content']");
+ foreach ($list as $node) {
+ if (strlen($node->nodeValue) > 40) {
+ $text .= " ".trim($node->nodeValue);
+ }
+ }
+ }
+
+ // If none text was found then take the paragraph content
+ if ($text == "") {
+ $list = $xpath->query("//p");
+ foreach ($list as $node) {
+ if (strlen($node->nodeValue) > 40) {
+ $text .= " ".trim($node->nodeValue);
+ }
+ }
+ }
+
+ if ($text != "") {
+ $text = trim(str_replace(array("\n", "\r"), array(" ", " "), $text));
+
+ while (strpos($text, " ")) {
+ $text = trim(str_replace(" ", " ", $text));
+ }
+
+ $siteinfo["text"] = trim(html_entity_decode(substr($text, 0, 350), ENT_QUOTES, "UTF-8").'...');
+ }
+ }
+
+ logger("parseurl_getsiteinfo: Siteinfo for ".$url." ".print_r($siteinfo, true), LOGGER_DEBUG);
+
+ call_hooks("getsiteinfo", $siteinfo);
+
+ return($siteinfo);
+ }
+
+ /**
+ * @brief Convert tags from CSV to an array
+ *
+ * @param string $string Tags
+ * @return array with formatted Hashtags
+ */
+ public static function convertTagsToArray($string)
+ {
+ $arr_tags = str_getcsv($string);
+ if (count($arr_tags)) {
+ // add the # sign to every tag
+ array_walk($arr_tags, array("self", "arrAddHashes"));
+
+ return $arr_tags;
+ }
+ }
+
+ /**
+ * @brief Add a hasht sign to a string
+ *
+ * This method is used as callback function
+ *
+ * @param string $tag The pure tag name
+ * @param int $k Counter for internal use
+ * @return void
+ */
+ private static function arrAddHashes(&$tag, $k)
+ {
+ $tag = "#" . $tag;
+ }
+
+ /**
+ * @brief Add a scheme to an url
+ *
+ * The src attribute of some html elements (e.g. images)
+ * can miss the scheme so we need to add the correct
+ * scheme
+ *
+ * @param string $url The url which possibly does have
+ * a missing scheme (a link to an image)
+ * @param string $scheme The url with a correct scheme
+ * (e.g. the url from the webpage which does contain the image)
+ *
+ * @return string The url with a scheme
+ */
+ private static function completeUrl($url, $scheme)
+ {
+ $urlarr = parse_url($url);
+
+ // If the url does allready have an scheme
+ // we can stop the process here
+ if (isset($urlarr["scheme"])) {
+ return($url);
+ }
+
+ $schemearr = parse_url($scheme);
+
+ $complete = $schemearr["scheme"]."://".$schemearr["host"];
+
+ if (@$schemearr["port"] != "") {
+ $complete .= ":".$schemearr["port"];
+ }
+
+ if (strpos($urlarr["path"], "/") !== 0) {
+ $complete .= "/";
+ }
+
+ $complete .= $urlarr["path"];
+
+ if (@$urlarr["query"] != "") {
+ $complete .= "?".$urlarr["query"];
+ }
+
+ if (@$urlarr["fragment"] != "") {
+ $complete .= "#".$urlarr["fragment"];
+ }
+
+ return($complete);
+ }
+}
'Friendica\\Model\\Profile' => $baseDir . '/src/Model/Profile.php',
'Friendica\\Model\\User' => $baseDir . '/src/Model/User.php',
'Friendica\\Module\\Feed' => $baseDir . '/src/Module/Feed.php',
- 'Friendica\\Module\\Login' => $baseDir . '/src/Module/Login.php',
- 'Friendica\\Module\\Logout' => $baseDir . '/src/Module/Logout.php',
'Friendica\\Module\\Oembed' => $baseDir . '/src/Module/Oembed.php',
'Friendica\\Network\\FKOAuth1' => $baseDir . '/src/Network/FKOAuth1.php',
'Friendica\\Network\\FKOAuthDataStore' => $baseDir . '/src/Network/FKOAuthDataStore.php',
'Friendica\\Object\\Image' => $baseDir . '/src/Object/Image.php',
'Friendica\\Object\\Post' => $baseDir . '/src/Object/Post.php',
'Friendica\\Object\\Thread' => $baseDir . '/src/Object/Thread.php',
- 'Friendica\\ParseUrl' => $baseDir . '/src/ParseUrl.php',
'Friendica\\Protocol\\DFRN' => $baseDir . '/src/Protocol/DFRN.php',
'Friendica\\Protocol\\Diaspora' => $baseDir . '/src/Protocol/Diaspora.php',
'Friendica\\Protocol\\Email' => $baseDir . '/src/Protocol/Email.php',
'Friendica\\Util\\ExAuth' => $baseDir . '/src/Util/ExAuth.php',
'Friendica\\Util\\Lock' => $baseDir . '/src/Util/Lock.php',
'Friendica\\Util\\Map' => $baseDir . '/src/Util/Map.php',
+ 'Friendica\\Util\\ParseUrl' => $baseDir . '/src/Util/ParseUrl.php',
'Friendica\\Util\\PidFile' => $baseDir . '/src/Util/Pidfile.php',
'Friendica\\Util\\XML' => $baseDir . '/src/Util/XML.php',
'Friendica\\Worker\\CheckVersion' => $baseDir . '/src/Worker/CheckVersion.php',
'Friendica\\Model\\Profile' => __DIR__ . '/../..' . '/src/Model/Profile.php',
'Friendica\\Model\\User' => __DIR__ . '/../..' . '/src/Model/User.php',
'Friendica\\Module\\Feed' => __DIR__ . '/../..' . '/src/Module/Feed.php',
- 'Friendica\\Module\\Login' => __DIR__ . '/../..' . '/src/Module/Login.php',
- 'Friendica\\Module\\Logout' => __DIR__ . '/../..' . '/src/Module/Logout.php',
'Friendica\\Module\\Oembed' => __DIR__ . '/../..' . '/src/Module/Oembed.php',
'Friendica\\Network\\FKOAuth1' => __DIR__ . '/../..' . '/src/Network/FKOAuth1.php',
'Friendica\\Network\\FKOAuthDataStore' => __DIR__ . '/../..' . '/src/Network/FKOAuthDataStore.php',
'Friendica\\Object\\Image' => __DIR__ . '/../..' . '/src/Object/Image.php',
'Friendica\\Object\\Post' => __DIR__ . '/../..' . '/src/Object/Post.php',
'Friendica\\Object\\Thread' => __DIR__ . '/../..' . '/src/Object/Thread.php',
- 'Friendica\\ParseUrl' => __DIR__ . '/../..' . '/src/ParseUrl.php',
'Friendica\\Protocol\\DFRN' => __DIR__ . '/../..' . '/src/Protocol/DFRN.php',
'Friendica\\Protocol\\Diaspora' => __DIR__ . '/../..' . '/src/Protocol/Diaspora.php',
'Friendica\\Protocol\\Email' => __DIR__ . '/../..' . '/src/Protocol/Email.php',
'Friendica\\Util\\ExAuth' => __DIR__ . '/../..' . '/src/Util/ExAuth.php',
'Friendica\\Util\\Lock' => __DIR__ . '/../..' . '/src/Util/Lock.php',
'Friendica\\Util\\Map' => __DIR__ . '/../..' . '/src/Util/Map.php',
+ 'Friendica\\Util\\ParseUrl' => __DIR__ . '/../..' . '/src/Util/ParseUrl.php',
'Friendica\\Util\\PidFile' => __DIR__ . '/../..' . '/src/Util/Pidfile.php',
'Friendica\\Util\\XML' => __DIR__ . '/../..' . '/src/Util/XML.php',
'Friendica\\Worker\\CheckVersion' => __DIR__ . '/../..' . '/src/Worker/CheckVersion.php',
<h3>{{$corporate}}</h3>
{{include file="field_input.tpl" field=$allowed_sites}}
{{include file="field_input.tpl" field=$allowed_email}}
+ {{include file="field_checkbox.tpl" field=$no_oembed_rich_content}}
+ {{include file="field_input.tpl" field=$allowed_oembed}}
{{include file="field_checkbox.tpl" field=$block_public}}
{{include file="field_checkbox.tpl" field=$force_publish}}
{{include file="field_select.tpl" field=$community_page_style}}