Merge remote-tracking branch 'refs/remotes/friendica/develop' into develop

This commit is contained in:
Hypolite Petovan 2017-03-25 16:09:10 -04:00
commit f6ef6f0c7a
28 changed files with 3075 additions and 2534 deletions

View file

@ -152,13 +152,6 @@ Value is in seconds.
Default is 60 seconds. Default is 60 seconds.
Set to 0 for unlimited (not recommended). Set to 0 for unlimited (not recommended).
#### UTF-8 Regular Expressions
During registrations, full names are checked using UTF-8 regular expressions.
This requires PHP to have been compiled with a special setting to allow UTF-8 expressions.
If you are completely unable to register accounts, set no_utf to true.
The default is set to false (meaning UTF8 regular expressions are supported and working).
#### Verify SSL Certitificates #### Verify SSL Certitificates
By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates. By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates.

View file

@ -18,6 +18,8 @@ require_once('include/network.php');
*/ */
class Probe { class Probe {
private static $baseurl;
/** /**
* @brief Rearrange the array so that it always has the same order * @brief Rearrange the array so that it always has the same order
* *
@ -54,6 +56,9 @@ class Probe {
*/ */
private function xrd($host) { private function xrd($host) {
// Reset the static variable
self::$baseurl = '';
$ssl_url = "https://".$host."/.well-known/host-meta"; $ssl_url = "https://".$host."/.well-known/host-meta";
$url = "http://".$host."/.well-known/host-meta"; $url = "http://".$host."/.well-known/host-meta";
@ -102,6 +107,9 @@ class Probe {
elseif ($attributes["rel"] == "lrdd") elseif ($attributes["rel"] == "lrdd")
$xrd_data["lrdd"] = $attributes["template"]; $xrd_data["lrdd"] = $attributes["template"];
} }
self::$baseurl = "http://".$host;
return $xrd_data; return $xrd_data;
} }
@ -258,8 +266,13 @@ class Probe {
$data['nick'] = trim(substr($data['nick'], 0, strpos($data['nick'], ' '))); $data['nick'] = trim(substr($data['nick'], 0, strpos($data['nick'], ' ')));
} }
if (!isset($data["network"])) if (self::$baseurl != "") {
$data["baseurl"] = self::$baseurl;
}
if (!isset($data["network"])) {
$data["network"] = NETWORK_PHANTOM; $data["network"] = NETWORK_PHANTOM;
}
$data = self::rearrange_data($data); $data = self::rearrange_data($data);
@ -286,6 +299,7 @@ class Probe {
dbesc(normalise_link($data['url'])) dbesc(normalise_link($data['url']))
); );
} }
return $data; return $data;
} }

View file

@ -352,6 +352,7 @@ use \Friendica\Core\Config;
} }
} }
} }
logger('API call not implemented: '.$a->query_string);
throw new NotImplementedException(); throw new NotImplementedException();
} catch (HTTPException $e) { } catch (HTTPException $e) {
header("HTTP/1.1 {$e->httpcode} {$e->httpdesc}"); header("HTTP/1.1 {$e->httpcode} {$e->httpdesc}");
@ -2720,6 +2721,7 @@ use \Friendica\Core\Config;
return api_format_data('config', $type, array('config' => $config)); return api_format_data('config', $type, array('config' => $config));
} }
api_register_func('api/gnusocial/config','api_statusnet_config',false);
api_register_func('api/statusnet/config','api_statusnet_config',false); api_register_func('api/statusnet/config','api_statusnet_config',false);
function api_statusnet_version($type) { function api_statusnet_version($type) {
@ -2728,6 +2730,7 @@ use \Friendica\Core\Config;
return api_format_data('version', $type, array('version' => $fake_statusnet_version)); return api_format_data('version', $type, array('version' => $fake_statusnet_version));
} }
api_register_func('api/gnusocial/version','api_statusnet_version',false);
api_register_func('api/statusnet/version','api_statusnet_version',false); api_register_func('api/statusnet/version','api_statusnet_version',false);
/** /**
@ -3963,7 +3966,7 @@ use \Friendica\Core\Config;
$multi_profiles = feature_enabled(api_user(),'multi_profiles'); $multi_profiles = feature_enabled(api_user(),'multi_profiles');
$directory = get_config('system', 'directory'); $directory = get_config('system', 'directory');
// get data of the specified profile id or all profiles of the user if not specified // get data of the specified profile id or all profiles of the user if not specified
if ($profileid != 0) { if ($profileid != 0) {
$r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d", $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d",
intval(api_user()), intval(api_user()),
@ -3971,11 +3974,10 @@ use \Friendica\Core\Config;
// error message if specified gid is not in database // error message if specified gid is not in database
if (!dbm::is_result($r)) if (!dbm::is_result($r))
throw new BadRequestException("profile_id not available"); throw new BadRequestException("profile_id not available");
} } else {
else
$r = q("SELECT * FROM `profile` WHERE `uid` = %d", $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
intval(api_user())); intval(api_user()));
}
// loop through all returned profiles and retrieve data and users // loop through all returned profiles and retrieve data and users
$k = 0; $k = 0;
foreach ($r as $rr) { foreach ($r as $rr) {
@ -4002,9 +4004,11 @@ use \Friendica\Core\Config;
} }
// return settings, authenticated user and profiles data // return settings, authenticated user and profiles data
$self = q("SELECT `nurl` FROM `contact` WHERE `uid`= %d AND `self` LIMIT 1", intval(api_user()));
$result = array('multi_profiles' => $multi_profiles ? true : false, $result = array('multi_profiles' => $multi_profiles ? true : false,
'global_dir' => $directory, 'global_dir' => $directory,
'friendica_owner' => api_get_user($a, intval(api_user())), 'friendica_owner' => api_get_user($a, $self[0]['nurl']),
'profiles' => $profiles); 'profiles' => $profiles);
return api_format_data("friendica_profiles", $type, array('$result' => $result)); return api_format_data("friendica_profiles", $type, array('$result' => $result));
} }

View file

@ -1352,7 +1352,9 @@ class dfrn {
$poco["photo"] = $author["avatar"]; $poco["photo"] = $author["avatar"];
$poco["hide"] = $hide; $poco["hide"] = $hide;
$poco["contact-type"] = $contact["contact-type"]; $poco["contact-type"] = $contact["contact-type"];
update_gcontact($poco); $gcid = update_gcontact($poco);
link_gcontact($gcid, $importer["uid"], $contact["id"]);
} }
return($author); return($author);

View file

@ -1848,18 +1848,15 @@ class Diaspora {
intval($importer["uid"]) intval($importer["uid"])
); );
if ($searchable) {
poco_check($contact["url"], $name, NETWORK_DIASPORA, $image_url, $about, $location, $gender, $keywords, "",
datetime_convert(), 2, $contact["id"], $importer["uid"]);
}
$gcontact = array("url" => $contact["url"], "network" => NETWORK_DIASPORA, "generation" => 2, $gcontact = array("url" => $contact["url"], "network" => NETWORK_DIASPORA, "generation" => 2,
"photo" => $image_url, "name" => $name, "location" => $location, "photo" => $image_url, "name" => $name, "location" => $location,
"about" => $about, "birthday" => $birthday, "gender" => $gender, "about" => $about, "birthday" => $birthday, "gender" => $gender,
"addr" => $author, "nick" => $nick, "keywords" => $keywords, "addr" => $author, "nick" => $nick, "keywords" => $keywords,
"hide" => !$searchable, "nsfw" => $nsfw); "hide" => !$searchable, "nsfw" => $nsfw);
update_gcontact($gcontact); $gcid = update_gcontact($gcontact);
link_gcontact($gcid, $importer["uid"], $contact["id"]);
logger("Profile of contact ".$contact["id"]." stored for user ".$importer["uid"], LOGGER_DEBUG); logger("Profile of contact ".$contact["id"]." stored for user ".$importer["uid"], LOGGER_DEBUG);

View file

@ -165,12 +165,17 @@ function discover_users() {
continue; continue;
} }
if ($user["server_url"] != "") {
$server_url = $user["server_url"];
} else {
$server_url = poco_detect_server($user["url"]); $server_url = poco_detect_server($user["url"]);
$force_update = false;
if ($user["server_url"] != "") {
$force_update = (normalise_link($user["server_url"]) != normalise_link($server_url));
$server_url = $user["server_url"];
} }
if ((($server_url == "") AND ($user["network"] == NETWORK_FEED)) OR poco_check_server($server_url, $user["network"])) {
if ((($server_url == "") AND ($user["network"] == NETWORK_FEED)) OR $force_update OR poco_check_server($server_url, $user["network"])) {
logger('Check profile '.$user["url"]); logger('Check profile '.$user["url"]);
proc_run(PRIORITY_LOW, "include/discover_poco.php", "check_profile", base64_encode($user["url"])); proc_run(PRIORITY_LOW, "include/discover_poco.php", "check_profile", base64_encode($user["url"]));
@ -232,7 +237,14 @@ function discover_directory($search) {
if ($data["network"] == NETWORK_DFRN) { if ($data["network"] == NETWORK_DFRN) {
logger("Profile ".$jj->url." is reachable (".$search.")", LOGGER_DEBUG); logger("Profile ".$jj->url." is reachable (".$search.")", LOGGER_DEBUG);
logger("Add profile ".$jj->url." to local directory (".$search.")", LOGGER_DEBUG); logger("Add profile ".$jj->url." to local directory (".$search.")", LOGGER_DEBUG);
poco_check($data["url"], $data["name"], $data["network"], $data["photo"], "", "", "", $jj->tags, $data["addr"], "", 0);
if ($jj->tags != "") {
$data["keywords"] = $jj->tags;
}
$data["server_url"] = $data["baseurl"];
update_gcontact($data);
} else { } else {
logger("Profile ".$jj->url." is not responding or no Friendica contact - but network ".$data["network"], LOGGER_DEBUG); logger("Profile ".$jj->url." is not responding or no Friendica contact - but network ".$data["network"], LOGGER_DEBUG);
} }

View file

@ -41,8 +41,8 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
// These media files should now be caught in bbcode.php // These media files should now be caught in bbcode.php
// left here as a fallback in case this is called from another source // left here as a fallback in case this is called from another source
$noexts = array("mp3","mp4","ogg","ogv","oga","ogm","webm"); $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm");
$ext = pathinfo(strtolower($embedurl),PATHINFO_EXTENSION); $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION);
if (is_null($txt)) { if (is_null($txt)) {
@ -74,21 +74,10 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
} }
} }
if ($txt==false || $txt=="") { $txt = trim($txt);
$embedly = Config::get("system", "embedly");
if ($embedly != "") {
// try embedly service
$ourl = "https://api.embed.ly/1/oembed?key=".$embedly."&url=".urlencode($embedurl);
$txt = fetch_url($ourl);
logger("oembed_fetch_url: ".$txt, LOGGER_DEBUG); if ($txt[0] != "{") {
} $txt = '{"type":"error"}';
}
$txt=trim($txt);
if ($txt[0]!="{") {
$txt='{"type":"error"}';
} else { //save in cache } else { //save in cache
$j = json_decode($txt); $j = json_decode($txt);
if ($j->type != "error") { if ($j->type != "error") {

View file

@ -132,9 +132,6 @@ class ostatus {
dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["alias"]), dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["alias"]),
dbesc($contact["about"]), dbesc($contact["location"]), dbesc($contact["about"]), dbesc($contact["location"]),
dbesc(datetime_convert()), intval($contact["id"])); dbesc(datetime_convert()), intval($contact["id"]));
poco_check($contact["url"], $contact["name"], $contact["network"], $author["author-avatar"], $contact["about"], $contact["location"],
"", "", "", datetime_convert(), 2, $contact["id"], $contact["uid"]);
} }
if (isset($author["author-avatar"]) AND ($author["author-avatar"] != $r[0]['avatar'])) { if (isset($author["author-avatar"]) AND ($author["author-avatar"] != $r[0]['avatar'])) {
@ -163,7 +160,9 @@ class ostatus {
$contact["generation"] = 2; $contact["generation"] = 2;
$contact["hide"] = false; // OStatus contacts are never hidden $contact["hide"] = false; // OStatus contacts are never hidden
$contact["photo"] = $author["author-avatar"]; $contact["photo"] = $author["author-avatar"];
update_gcontact($contact); $gcid = update_gcontact($contact);
link_gcontact($gcid, $contact["uid"], $contact["id"]);
} }
return($author); return($author);

View file

@ -159,27 +159,27 @@ function poco_load_worker($cid, $uid, $zcid, $url) {
if (isset($entry->contactType) AND ($entry->contactType >= 0)) if (isset($entry->contactType) AND ($entry->contactType >= 0))
$contact_type = $entry->contactType; $contact_type = $entry->contactType;
// If you query a Friendica server for its profiles, the network has to be Friendica $gcontact = array("url" => $profile_url,
/// TODO It could also be a Redmatrix server "name" => $name,
//if ($uid == 0) "network" => $network,
// $network = NETWORK_DFRN; "photo" => $profile_photo,
"about" => $about,
"location" => $location,
"gender" => $gender,
"keywords" => $keywords,
"connect" => $connect_url,
"updated" => $updated,
"contact-type" => $contact_type,
"generation" => $generation);
poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, $cid, $uid, $zcid); try {
$gcontact = sanitize_gcontact($gcontact);
$gcid = update_gcontact($gcontact);
$gcontact = array("url" => $profile_url, "contact-type" => $contact_type, "generation" => $generation); link_gcontact($gcid, $uid, $cid, $zcid);
update_gcontact($gcontact); } catch (Exception $e) {
logger($e->getMessage(), LOGGER_DEBUG);
// Update the Friendica contacts. Diaspora is doing it via a message. (See include/diaspora.php) }
// Deactivated because we now update Friendica contacts in dfrn.php
//if (($location != "") OR ($about != "") OR ($keywords != "") OR ($gender != ""))
// q("UPDATE `contact` SET `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s'
// WHERE `nurl` = '%s' AND NOT `self` AND `network` = '%s'",
// dbesc($location),
// dbesc($about),
// dbesc($keywords),
// dbesc($gender),
// dbesc(normalise_link($profile_url)),
// dbesc(NETWORK_DFRN));
} }
logger("poco_load: loaded $total entries",LOGGER_DEBUG); logger("poco_load: loaded $total entries",LOGGER_DEBUG);
@ -190,172 +190,158 @@ function poco_load_worker($cid, $uid, $zcid, $url) {
); );
} }
/**
* @brief Sanitize the given gcontact data
*
* @param array $gcontact array with gcontact data
* @throw Exception
*
* Generation:
* 0: No definition
* 1: Profiles on this server
* 2: Contacts of profiles on this server
* 3: Contacts of contacts of profiles on this server
* 4: ...
*
*/
function sanitize_gcontact($gcontact) {
function poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, $cid = 0, $uid = 0, $zcid = 0) { if ($gcontact['url'] == "") {
throw new Exception('URL is empty');
}
// Generation: $urlparts = parse_url($gcontact['url']);
// 0: No definition if (!isset($urlparts["scheme"])) {
// 1: Profiles on this server throw new Exception("This (".$gcontact['url'].") doesn't seem to be an url.");
// 2: Contacts of profiles on this server }
// 3: Contacts of contacts of profiles on this server
// 4: ...
$gcid = "";
if ($profile_url == "")
return $gcid;
$urlparts = parse_url($profile_url);
if (!isset($urlparts["scheme"]))
return $gcid;
if (in_array($urlparts["host"], array("www.facebook.com", "facebook.com", "twitter.com", if (in_array($urlparts["host"], array("www.facebook.com", "facebook.com", "twitter.com",
"identi.ca", "alpha.app.net"))) "identi.ca", "alpha.app.net"))) {
return $gcid; throw new Exception('Contact from a non federated network ignored. ('.$gcontact['url'].')');
}
// Don't store the statusnet connector as network // Don't store the statusnet connector as network
// We can't simply set this to NETWORK_OSTATUS since the connector could have fetched posts from friendica as well // We can't simply set this to NETWORK_OSTATUS since the connector could have fetched posts from friendica as well
if ($network == NETWORK_STATUSNET) if ($gcontact['network'] == NETWORK_STATUSNET) {
$network = ""; $gcontact['network'] = "";
}
// Assure that there are no parameter fragments in the profile url // Assure that there are no parameter fragments in the profile url
if (in_array($network, array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) if (in_array($gcontact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
$profile_url = clean_contact_url($profile_url); $gcontact['url'] = clean_contact_url($gcontact['url']);
}
$alternate = poco_alternate_ostatus_url($profile_url); $alternate = poco_alternate_ostatus_url($gcontact['url']);
$orig_updated = $updated;
// The global contacts should contain the original picture, not the cached one // The global contacts should contain the original picture, not the cached one
if (($generation != 1) AND stristr(normalise_link($profile_photo), normalise_link(App::get_baseurl()."/photo/"))) { if (($gcontact['generation'] != 1) AND stristr(normalise_link($gcontact['photo']), normalise_link(App::get_baseurl()."/photo/"))) {
$profile_photo = ""; $gcontact['photo'] = "";
} }
$r = q("SELECT `network` FROM `contact` WHERE `nurl` = '%s' AND `network` != '' AND `network` != '%s' LIMIT 1", if (!isset($gcontact['network'])) {
dbesc(normalise_link($profile_url)), dbesc(NETWORK_STATUSNET) $r = q("SELECT `network` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s' AND `network` != '' AND `network` != '%s' LIMIT 1",
dbesc(normalise_link($gcontact['url'])), dbesc(NETWORK_STATUSNET)
); );
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$network = $r[0]["network"]; $gcontact['network'] = $r[0]["network"];
} }
if (($network == "") OR ($network == NETWORK_OSTATUS)) { if (($gcontact['network'] == "") OR ($gcontact['network'] == NETWORK_OSTATUS)) {
$r = q("SELECT `network`, `url` FROM `contact` WHERE `alias` IN ('%s', '%s') AND `network` != '' AND `network` != '%s' LIMIT 1", $r = q("SELECT `network`, `url` FROM `contact` WHERE `uid` = 0 AND `alias` IN ('%s', '%s') AND `network` != '' AND `network` != '%s' LIMIT 1",
dbesc($profile_url), dbesc(normalise_link($profile_url)), dbesc(NETWORK_STATUSNET) dbesc($gcontact['url']), dbesc(normalise_link($gcontact['url'])), dbesc(NETWORK_STATUSNET)
); );
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$network = $r[0]["network"]; $gcontact['network'] = $r[0]["network"];
//$profile_url = $r[0]["url"];
} }
} }
}
$gcontact['server_url'] = '';
$gcontact['network'] = '';
$x = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", $x = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($profile_url)) dbesc(normalise_link($gcontact['url']))
); );
if (count($x)) { if (count($x)) {
if (($network == "") AND ($x[0]["network"] != NETWORK_STATUSNET)) { if (!isset($gcontact['network']) AND ($x[0]["network"] != NETWORK_STATUSNET)) {
$network = $x[0]["network"]; $gcontact['network'] = $x[0]["network"];
} }
if ($updated <= NULL_DATE) { if ($gcontact['updated'] <= NULL_DATE) {
$updated = $x[0]["updated"]; $gcontact['updated'] = $x[0]["updated"];
}
if (!isset($gcontact['server_url']) AND (normalise_link($x[0]["server_url"]) != normalise_link($x[0]["url"]))) {
$gcontact['server_url'] = $x[0]["server_url"];
}
if (!isset($gcontact['addr'])) {
$gcontact['addr'] = $x[0]["addr"];
} }
$created = $x[0]["created"];
$server_url = $x[0]["server_url"];
$nick = $x[0]["nick"];
$addr = $x[0]["addr"];
$alias = $x[0]["alias"];
$notify = $x[0]["notify"];
} else {
$created = NULL_DATE;
$server_url = "";
$urlparts = parse_url($profile_url);
$nick = end(explode("/", $urlparts["path"]));
$addr = "";
$alias = "";
$notify = "";
} }
if ((($network == "") OR ($name == "") OR ($addr == "") OR ($profile_photo == "") OR ($server_url == "") OR $alternate) if ((!isset($gcontact['network']) OR !isset($gcontact['name']) OR !isset($gcontact['addr']) OR !isset($gcontact['photo']) OR !isset($gcontact['server_url']) OR $alternate)
AND poco_reachable($profile_url, $server_url, $network, false)) { AND poco_reachable($gcontact['url'], $gcontact['server_url'], $gcontact['network'], false)) {
$data = probe_url($profile_url); $data = Probe::uri($gcontact['url']);
$orig_profile = $profile_url; if ($data["network"] == NETWORK_PHANTOM) {
throw new Exception('Probing for URL '.$gcontact['url'].' failed');
}
$network = $data["network"]; $orig_profile = $gcontact['url'];
$name = $data["name"];
$nick = $data["nick"];
$addr = $data["addr"];
$alias = $data["alias"];
$notify = $data["notify"];
$profile_url = $data["url"];
$profile_photo = $data["photo"];
$server_url = $data["baseurl"];
if ($alternate AND ($network == NETWORK_OSTATUS)) { $gcontact["server_url"] = $data["baseurl"];
$gcontact = array_merge($gcontact, $data);
if ($alternate AND ($gcontact['network'] == NETWORK_OSTATUS)) {
// Delete the old entry - if it exists // Delete the old entry - if it exists
$r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile))); $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
if ($r) { if ($r) {
q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile))); q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
q("DELETE FROM `glink` WHERE `gcid` = %d", intval($r[0]["id"])); q("DELETE FROM `glink` WHERE `gcid` = %d", intval($r[0]["id"]));
} }
// possibly create a new entry
poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, $cid, $uid, $zcid);
} }
} }
if ($alternate AND ($network == NETWORK_OSTATUS)) if (!isset($gcontact['name']) OR !isset($gcontact['photo'])) {
return $gcid; throw new Exception('No name and photo for URL '.$gcontact['url']);
if (count($x) AND ($x[0]["network"] == "") AND ($network != "")) {
q("UPDATE `gcontact` SET `network` = '%s' WHERE `nurl` = '%s'",
dbesc($network),
dbesc(normalise_link($profile_url))
);
} }
if (($name == "") OR ($profile_photo == "")) if (!in_array($gcontact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
return $gcid; throw new Exception('No federated network ('.$gcontact['network'].') detected for URL '.$gcontact['url']);
}
if (!in_array($network, array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)))
return $gcid;
logger("profile-check generation: ".$generation." Network: ".$network." URL: ".$profile_url." name: ".$name." avatar: ".$profile_photo, LOGGER_DEBUG);
if (!isset($gcontact['server_url'])) {
// We check the server url to be sure that it is a real one // We check the server url to be sure that it is a real one
$server_url2 = poco_detect_server($profile_url); $server_url = poco_detect_server($gcontact['url']);
// We are no sure that it is a correct URL. So we use it in the future // We are now sure that it is a correct URL. So we use it in the future
if ($server_url2 != "") { if ($server_url != "") {
$server_url = $server_url2; $gcontact['server_url'] = $server_url;
}
} }
// The server URL doesn't seem to be valid, so we don't store it. // The server URL doesn't seem to be valid, so we don't store it.
if (!poco_check_server($server_url, $network)) { if (!poco_check_server($gcontact['server_url'], $gcontact['network'])) {
$server_url = ""; $gcontact['server_url'] = "";
} }
$gcontact = array("url" => $profile_url, return $gcontact;
"addr" => $addr, }
"alias" => $alias,
"name" => $name,
"network" => $network,
"photo" => $profile_photo,
"about" => $about,
"location" => $location,
"gender" => $gender,
"keywords" => $keywords,
"server_url" => $server_url,
"connect" => $connect_url,
"notify" => $notify,
"updated" => $updated,
"generation" => $generation);
$gcid = update_gcontact($gcontact); /**
* @brief Link the gcontact entry with user, contact and global contact
*
* @param integer $gcid Global contact ID
* @param integer $cid Contact ID
* @param integer $uid User ID
* @param integer $zcid Global Contact ID
* *
*/
function link_gcontact($gcid, $uid = 0, $cid = 0, $zcid = 0) {
if(!$gcid) if ($gcid <= 0) {
return $gcid; return;
}
$r = q("SELECT * FROM `glink` WHERE `cid` = %d AND `uid` = %d AND `gcid` = %d AND `zcid` = %d LIMIT 1", $r = q("SELECT * FROM `glink` WHERE `cid` = %d AND `uid` = %d AND `gcid` = %d AND `zcid` = %d LIMIT 1",
intval($cid), intval($cid),
@ -363,8 +349,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
intval($gcid), intval($gcid),
intval($zcid) intval($zcid)
); );
if (! dbm::is_result($r)) { if (!dbm::is_result($r)) {
q("INSERT INTO `glink` (`cid`,`uid`,`gcid`,`zcid`, `updated`) VALUES (%d,%d,%d,%d, '%s') ", q("INSERT INTO `glink` (`cid`, `uid`, `gcid`, `zcid`, `updated`) VALUES (%d, %d, %d, %d, '%s') ",
intval($cid), intval($cid),
intval($uid), intval($uid),
intval($gcid), intval($gcid),
@ -380,8 +366,6 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
intval($zcid) intval($zcid)
); );
} }
return $gcid;
} }
function poco_reachable($profile, $server = "", $network = "", $force = false) { function poco_reachable($profile, $server = "", $network = "", $force = false) {
@ -479,15 +463,26 @@ function poco_last_updated($profile, $force = false) {
$gcontacts = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", $gcontacts = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'",
dbesc(normalise_link($profile))); dbesc(normalise_link($profile)));
if ($gcontacts[0]["created"] <= NULL_DATE) { if (!dbm::is_result($gcontacts)) {
q("UPDATE `gcontact` SET `created` = '%s' WHERE `nurl` = '%s'", return false;
dbesc(datetime_convert()), dbesc(normalise_link($profile)));
} }
if ($gcontacts[0]["server_url"] != "") {
$contact = array("url" => $profile);
if ($gcontacts[0]["created"] <= NULL_DATE) {
$contact['created'] = datetime_convert();
}
if ($force) {
$server_url = normalise_link(poco_detect_server($profile));
}
if (($server_url == '') AND ($gcontacts[0]["server_url"] != "")) {
$server_url = $gcontacts[0]["server_url"]; $server_url = $gcontacts[0]["server_url"];
} }
if (($server_url == '') OR ($gcontacts[0]["server_url"] == $gcontacts[0]["nurl"])) {
$server_url = poco_detect_server($profile); if (!$force AND (($server_url == '') OR ($gcontacts[0]["server_url"] == $gcontacts[0]["nurl"]))) {
$server_url = normalise_link(poco_detect_server($profile));
} }
if (!in_array($gcontacts[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_FEED, NETWORK_OSTATUS, ""))) { if (!in_array($gcontacts[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_FEED, NETWORK_OSTATUS, ""))) {
@ -497,35 +492,33 @@ function poco_last_updated($profile, $force = false) {
if ($server_url != "") { if ($server_url != "") {
if (!poco_check_server($server_url, $gcontacts[0]["network"], $force)) { if (!poco_check_server($server_url, $gcontacts[0]["network"], $force)) {
if ($force) {
if ($force)
q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `nurl` = '%s'", q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `nurl` = '%s'",
dbesc(datetime_convert()), dbesc(normalise_link($profile))); dbesc(datetime_convert()), dbesc(normalise_link($profile)));
}
logger("Profile ".$profile.": Server ".$server_url." wasn't reachable.", LOGGER_DEBUG); logger("Profile ".$profile.": Server ".$server_url." wasn't reachable.", LOGGER_DEBUG);
return false; return false;
} }
$contact['server_url'] = $server_url;
q("UPDATE `gcontact` SET `server_url` = '%s' WHERE `nurl` = '%s'",
dbesc($server_url), dbesc(normalise_link($profile)));
} }
if (in_array($gcontacts[0]["network"], array("", NETWORK_FEED))) { if (in_array($gcontacts[0]["network"], array("", NETWORK_FEED))) {
$server = q("SELECT `network` FROM `gserver` WHERE `nurl` = '%s' AND `network` != ''", $server = q("SELECT `network` FROM `gserver` WHERE `nurl` = '%s' AND `network` != ''",
dbesc(normalise_link($server_url))); dbesc(normalise_link($server_url)));
if ($server) if ($server) {
q("UPDATE `gcontact` SET `network` = '%s' WHERE `nurl` = '%s'", $contact['network'] = $server[0]["network"];
dbesc($server[0]["network"]), dbesc(normalise_link($profile))); } else {
else
return false; return false;
} }
}
// noscrape is really fast so we don't cache the call. // noscrape is really fast so we don't cache the call.
if (($gcontacts[0]["server_url"] != "") AND ($gcontacts[0]["nick"] != "")) { if (($server_url != "") AND ($gcontacts[0]["nick"] != "")) {
// Use noscrape if possible // Use noscrape if possible
$server = q("SELECT `noscrape`, `network` FROM `gserver` WHERE `nurl` = '%s' AND `noscrape` != ''", dbesc(normalise_link($gcontacts[0]["server_url"]))); $server = q("SELECT `noscrape`, `network` FROM `gserver` WHERE `nurl` = '%s' AND `noscrape` != ''", dbesc(normalise_link($server_url)));
if ($server) { if ($server) {
$noscraperet = z_fetch_url($server[0]["noscrape"]."/".$gcontacts[0]["nick"]); $noscraperet = z_fetch_url($server[0]["noscrape"]."/".$gcontacts[0]["nick"]);
@ -535,29 +528,28 @@ function poco_last_updated($profile, $force = false) {
$noscrape = json_decode($noscraperet["body"], true); $noscrape = json_decode($noscraperet["body"], true);
if (is_array($noscrape)) { if (is_array($noscrape)) {
$contact = array("url" => $profile, $contact["network"] = $server[0]["network"];
"network" => $server[0]["network"],
"generation" => $gcontacts[0]["generation"]);
if (isset($noscrape["fn"])) if (isset($noscrape["fn"])) {
$contact["name"] = $noscrape["fn"]; $contact["name"] = $noscrape["fn"];
}
if (isset($noscrape["comm"])) if (isset($noscrape["comm"])) {
$contact["community"] = $noscrape["comm"]; $contact["community"] = $noscrape["comm"];
}
if (isset($noscrape["tags"])) { if (isset($noscrape["tags"])) {
$keywords = implode(" ", $noscrape["tags"]); $keywords = implode(" ", $noscrape["tags"]);
if ($keywords != "") if ($keywords != "") {
$contact["keywords"] = $keywords; $contact["keywords"] = $keywords;
} }
}
$location = formatted_location($noscrape); $location = formatted_location($noscrape);
if ($location) if ($location) {
$contact["location"] = $location; $contact["location"] = $location;
}
if (isset($noscrape["dfrn-notify"])) if (isset($noscrape["dfrn-notify"])) {
$contact["notify"] = $noscrape["dfrn-notify"]; $contact["notify"] = $noscrape["dfrn-notify"];
}
// Remove all fields that are not present in the gcontact table // Remove all fields that are not present in the gcontact table
unset($noscrape["fn"]); unset($noscrape["fn"]);
unset($noscrape["key"]); unset($noscrape["key"]);
@ -597,10 +589,12 @@ function poco_last_updated($profile, $force = false) {
// If we only can poll the feed, then we only do this once a while // If we only can poll the feed, then we only do this once a while
if (!$force AND !poco_do_update($gcontacts[0]["created"], $gcontacts[0]["updated"], $gcontacts[0]["last_failure"], $gcontacts[0]["last_contact"])) { if (!$force AND !poco_do_update($gcontacts[0]["created"], $gcontacts[0]["updated"], $gcontacts[0]["last_failure"], $gcontacts[0]["last_contact"])) {
logger("Profile ".$profile." was last updated at ".$gcontacts[0]["updated"]." (cached)", LOGGER_DEBUG); logger("Profile ".$profile." was last updated at ".$gcontacts[0]["updated"]." (cached)", LOGGER_DEBUG);
update_gcontact($contact);
return $gcontacts[0]["updated"]; return $gcontacts[0]["updated"];
} }
$data = probe_url($profile); $data = Probe::uri($profile);
// Is the profile link the alternate OStatus link notation? (http://domain.tld/user/4711) // Is the profile link the alternate OStatus link notation? (http://domain.tld/user/4711)
// Then check the other link and delete this one // Then check the other link and delete this one
@ -612,10 +606,18 @@ function poco_last_updated($profile, $force = false) {
q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($profile))); q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($profile)));
q("DELETE FROM `glink` WHERE `gcid` = %d", intval($gcontacts[0]["id"])); q("DELETE FROM `glink` WHERE `gcid` = %d", intval($gcontacts[0]["id"]));
poco_check($data["url"], $data["name"], $data["network"], $data["photo"], $gcontacts[0]["about"], $gcontacts[0]["location"], $gcontact = array_merge($gcontacts[0], $data);
$gcontacts[0]["gender"], $gcontacts[0]["keywords"], $data["addr"], $gcontacts[0]["updated"], $gcontacts[0]["generation"]);
$gcontact["server_url"] = $data["baseurl"];
try {
$gcontact = sanitize_gcontact($gcontact);
update_gcontact($gcontact);
poco_last_updated($data["url"], $force); poco_last_updated($data["url"], $force);
} catch (Exception $e) {
logger($e->getMessage(), LOGGER_DEBUG);
}
logger("Profile ".$profile." was deleted", LOGGER_DEBUG); logger("Profile ".$profile." was deleted", LOGGER_DEBUG);
return false; return false;
@ -629,21 +631,10 @@ function poco_last_updated($profile, $force = false) {
return false; return false;
} }
$contact = array("generation" => $gcontacts[0]["generation"]);
$contact = array_merge($contact, $data); $contact = array_merge($contact, $data);
$contact["server_url"] = $data["baseurl"]; $contact["server_url"] = $data["baseurl"];
unset($contact["batch"]);
unset($contact["poll"]);
unset($contact["request"]);
unset($contact["confirm"]);
unset($contact["poco"]);
unset($contact["priority"]);
unset($contact["pubkey"]);
unset($contact["baseurl"]);
update_gcontact($contact); update_gcontact($contact);
$feedret = z_fetch_url($data["poll"]); $feedret = z_fetch_url($data["poll"]);
@ -686,9 +677,10 @@ function poco_last_updated($profile, $force = false) {
q("UPDATE `gcontact` SET `updated` = '%s', `last_contact` = '%s' WHERE `nurl` = '%s'", q("UPDATE `gcontact` SET `updated` = '%s', `last_contact` = '%s' WHERE `nurl` = '%s'",
dbesc(dbm::date($last_updated)), dbesc(dbm::date()), dbesc(normalise_link($profile))); dbesc(dbm::date($last_updated)), dbesc(dbm::date()), dbesc(normalise_link($profile)));
if (($gcontacts[0]["generation"] == 0)) if (($gcontacts[0]["generation"] == 0)) {
q("UPDATE `gcontact` SET `generation` = 9 WHERE `nurl` = '%s'", q("UPDATE `gcontact` SET `generation` = 9 WHERE `nurl` = '%s'",
dbesc(normalise_link($profile))); dbesc(normalise_link($profile)));
}
logger("Profile ".$profile." was last updated at ".$last_updated, LOGGER_DEBUG); logger("Profile ".$profile." was last updated at ".$last_updated, LOGGER_DEBUG);
@ -1889,10 +1881,26 @@ function poco_discover_server($data, $default_generation = 0) {
$success = true; $success = true;
logger("Store profile ".$profile_url, LOGGER_DEBUG); logger("Store profile ".$profile_url, LOGGER_DEBUG);
poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, 0, 0, 0);
$gcontact = array("url" => $profile_url, "contact-type" => $contact_type, "generation" => $generation); $gcontact = array("url" => $profile_url,
"name" => $name,
"network" => $network,
"photo" => $profile_photo,
"about" => $about,
"location" => $location,
"gender" => $gender,
"keywords" => $keywords,
"connect" => $connect_url,
"updated" => $updated,
"contact-type" => $contact_type,
"generation" => $generation);
try {
$gcontact = sanitize_gcontact($gcontact);
update_gcontact($gcontact); update_gcontact($gcontact);
} catch (Exception $e) {
logger($e->getMessage(), LOGGER_DEBUG);
}
logger("Done for profile ".$profile_url, LOGGER_DEBUG); logger("Done for profile ".$profile_url, LOGGER_DEBUG);
} }
@ -2187,6 +2195,8 @@ function update_gcontact_from_probe($url) {
return; return;
} }
$data["server_url"] = $data["baseurl"];
update_gcontact($data); update_gcontact($data);
} }

View file

@ -97,13 +97,6 @@ function create_user($arr) {
if(mb_strlen($username) < 3) if(mb_strlen($username) < 3)
$result['message'] .= t('Name too short.') . EOL; $result['message'] .= t('Name too short.') . EOL;
// I don't really like having this rule, but it cuts down
// on the number of auto-registrations by Russian spammers
// Using preg_match was completely unreliable, due to mixed UTF-8 regex support
// $no_utf = get_config('system','no_utf');
// $pat = (($no_utf) ? '/^[a-zA-Z]* [a-zA-Z]*$/' : '/^\p{L}* \p{L}*$/u' );
// So now we are just looking for a space in the full name. // So now we are just looking for a space in the full name.
$loose_reg = get_config('system','no_regfullname'); $loose_reg = get_config('system','no_regfullname');

View file

@ -1,24 +1,17 @@
<?php <?php
//# Install PSR-0-compatible class autoloader require_once "library/php-markdown/Michelf/MarkdownExtra.inc.php";
//spl_autoload_register(function($class){
// require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
//});
require_once("library/php-markdown/Michelf/MarkdownExtra.inc.php");
# Get Markdown class
use \Michelf\MarkdownExtra; use \Michelf\MarkdownExtra;
function Markdown($text) { function Markdown($text) {
$a = get_app(); $a = get_app();
$stamp1 = microtime(true); $stamp1 = microtime(true);
# Read file and pass content through the Markdown parser $MarkdownParser = new MarkdownExtra();
$html = MarkdownExtra::defaultTransform($text); $MarkdownParser->hard_wrap = true;
$html = $MarkdownParser->transform($text);
$a->save_timestamp($stamp1, "parser"); $a->save_timestamp($stamp1, "parser");
return $html; return $html;
} }
?>

View file

@ -1,11 +1,11 @@
PHP Markdown Lib PHP Markdown Lib
Copyright (c) 2004-2014 Michel Fortin Copyright (c) 2004-2016 Michel Fortin
<http://michelf.ca/> <https://michelf.ca/>
All rights reserved. All rights reserved.
Based on Markdown Based on Markdown
Copyright (c) 2003-2006 John Gruber Copyright (c) 2003-2006 John Gruber
<http://daringfireball.net/> <https://daringfireball.net/>
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View file

@ -1,10 +1,10 @@
<?php <?php
# Use this file if you cannot use class autoloading. It will include all the // Use this file if you cannot use class autoloading. It will include all the
# files needed for the Markdown parser. // files needed for the Markdown parser.
# //
# Take a look at the PSR-0-compatible class autoloading implementation // Take a look at the PSR-0-compatible class autoloading implementation
# in the Readme.php file if you want a simple autoloader setup. // in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php'; require_once dirname(__FILE__) . '/MarkdownInterface.php';
require_once dirname(__FILE__) . '/Markdown.php'; require_once dirname(__FILE__) . '/Markdown.php';

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
<?php <?php
# Use this file if you cannot use class autoloading. It will include all the // Use this file if you cannot use class autoloading. It will include all the
# files needed for the MarkdownExtra parser. // files needed for the MarkdownExtra parser.
# //
# Take a look at the PSR-0-compatible class autoloading implementation // Take a look at the PSR-0-compatible class autoloading implementation
# in the Readme.php file if you want a simple autoloader setup. // in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php'; require_once dirname(__FILE__) . '/MarkdownInterface.php';
require_once dirname(__FILE__) . '/Markdown.php'; require_once dirname(__FILE__) . '/Markdown.php';

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,9 @@
<?php <?php
# Use this file if you cannot use class autoloading. It will include all the // Use this file if you cannot use class autoloading. It will include all the
# files needed for the MarkdownInterface interface. // files needed for the MarkdownInterface interface.
# //
# Take a look at the PSR-0-compatible class autoloading implementation // Take a look at the PSR-0-compatible class autoloading implementation
# in the Readme.php file if you want a simple autoloader setup. // in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php'; require_once dirname(__FILE__) . '/MarkdownInterface.php';

View file

@ -1,34 +1,38 @@
<?php <?php
# /**
# Markdown - A text-to-HTML conversion tool for web writers * Markdown - A text-to-HTML conversion tool for web writers
# *
# PHP Markdown * @package php-markdown
# Copyright (c) 2004-2014 Michel Fortin * @author Michel Fortin <michel.fortin@michelf.com>
# <http://michelf.com/projects/php-markdown/> * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
# * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
# Original Markdown */
# Copyright (c) 2004-2006 John Gruber
# <http://daringfireball.net/projects/markdown/>
#
namespace Michelf; namespace Michelf;
/**
# * Markdown Parser Interface
# Markdown Parser Interface */
#
interface MarkdownInterface { interface MarkdownInterface {
/**
# * Initialize the parser and return the result of its transform method.
# Initialize the parser and return the result of its transform method. * This will work fine for derived classes too.
# This will work fine for derived classes too. *
# * @api
*
* @param string $text
* @return string
*/
public static function defaultTransform($text); public static function defaultTransform($text);
# /**
# Main function. Performs some preprocessing on the input text * Main function. Performs some preprocessing on the input text
# and pass it through the document gamut. * and pass it through the document gamut.
# *
* @api
*
* @param string $text
* @return string
*/
public function transform($text); public function transform($text);
} }

View file

@ -1,13 +1,13 @@
PHP Markdown PHP Markdown
============ ============
PHP Markdown Lib 1.4.1 - 4 May 2013 PHP Markdown Lib 1.7.0 - 29 Oct 2016
by Michel Fortin by Michel Fortin
<http://michelf.ca/> <https://michelf.ca/>
based on Markdown by John Gruber based on Markdown by John Gruber
<http://daringfireball.net/> <https://daringfireball.net/>
Introduction Introduction
@ -25,10 +25,10 @@ software tool, originally written in Perl, that converts the plain text
markup to HTML. PHP Markdown is a port to PHP of the original Markdown markup to HTML. PHP Markdown is a port to PHP of the original Markdown
program by John Gruber. program by John Gruber.
* [Full documentation of the Markdown syntax](<http://daringfireball.net/projects/markdown/>) * [Full documentation of the Markdown syntax](<https://daringfireball.net/projects/markdown/>)
- Daring Fireball (John Gruber) Daring Fireball (John Gruber)
* [Markdown Extra syntax additions](<http://michelf.ca/projects/php-markdown/extra/>) * [Markdown Extra syntax additions](<https://michelf.ca/projects/php-markdown/extra/>)
- Michel Fortin Michel Fortin
Requirement Requirement
@ -83,7 +83,7 @@ configuration variables:
To learn more, see the full list of [configuration variables]. To learn more, see the full list of [configuration variables].
[configuration variables]: http://michelf.ca/projects/php-markdown/configuration/ [configuration variables]: https://michelf.ca/projects/php-markdown/configuration/
### Usage without an autoloader ### Usage without an autoloader
@ -149,7 +149,7 @@ Development and Testing
----------------------- -----------------------
Pull requests for fixing bugs are welcome. Proposed new features are Pull requests for fixing bugs are welcome. Proposed new features are
going meticulously reviewed -- taking into account backward compatibility, going to be meticulously reviewed -- taking into account backward compatibility,
potential side effects, and future extensibility -- before deciding on potential side effects, and future extensibility -- before deciding on
acceptance or rejection. acceptance or rejection.
@ -174,11 +174,80 @@ PHP Markdown, please visit [michelf.ca/donate] or send Bitcoin to
Version History Version History
--------------- ---------------
Unreleased PHP Markdown Lib 1.7.0 (29 Oct 2016)
* Added the ability to insert custom HTML attributes everywhere an extra * Added a `hard_wrap` configuration variable to make all newline characters
attribute block is allowed (links, images, headers). Credits to in the text become `<br>` tags in the HTML output. By default, according
Peter Droogmans for providing the implementation. to the standard Markdown syntax these newlines are ignored unless they a
preceded by two spaces. Thanks to Jonathan Cohlmeyer for the implementation.
* Improved the parsing of list items to fix problematic cases that came to
light with the addition of `hard_wrap`. This should have no effect on the
output except span-level list items that ended with two spaces (and thus
ended with a line break).
* Added a `code_span_content_func` configuration variable which takes a
function that will convert the content of the code span to HTML. This can
be useful to implement syntax highlighting. Although contrary to its
code block equivalent, there is no syntax for specifying a language.
Credits to styxit for the implementation.
* Fixed a Markdown Extra issue where two-space-at-end-of-line hard breaks
wouldn't work inside of HTML block elements such as `<p markdown="1">`
where the element expects only span-level content.
* In the parser code, switched to PHPDoc comment format. Thanks to
Robbie Averill for the help.
PHP Markdown Lib 1.6.0 (23 Dec 2015)
Note: this version was incorrectly released as 1.5.1 on Dec 22, a number
that contradicted the versioning policy.
* For fenced code blocks in Markdown Extra, can now set a class name for the
code block's language before the special attribute block. Previously, this
class name was only allowed in the absence of the special attribute block.
* Added a `code_block_content_func` configuration variable which takes a
function that will convert the content of the code block to HTML. This is
most useful for syntax highlighting. For fenced code blocks in Markdown
Extra, the function has access to the language class name (the one outside
of the special attribute block). Credits to Mario Konrad for providing the
implementation.
* The curled arrow character for the backlink in footnotes is now followed
by a Unicode variant selector to prevent it from being displayed in emoji
form on iOS.
Note that in older browsers the variant selector is often interpreted as a
separate character, making it visible after the arrow. So there is now a
also a `fn_backlink_html` configuration variable that can be used to set
the link text to something else. Credits to Dana for providing the
implementation.
* Fixed an issue in MarkdownExtra where long header lines followed by a
special attribute block would hit the backtrack limit an cause an empty
string to be returned.
PHP Markdown Lib 1.5.0 (1 Mar 2015)
* Added the ability start ordered lists with a number different from 1 and
and have that reflected in the HTML output. This can be enabled with
the `enhanced_ordered_lists` configuration variable for the Markdown
parser; it is enabled by default for Markdown Extra.
Credits to Matt Gorle for providing the implementation.
* Added the ability to insert custom HTML attributes with simple values
everywhere an extra attribute block is allowed (links, images, headers).
The value must be unquoted, cannot contains spaces and is limited to
alphanumeric ASCII characters.
Credits to Peter Droogmans for providing the implementation.
* Added a `header_id_func` configuration variable which takes a function
that can generate an `id` attribute value from the header text.
Credits to Evert Pot for providing the implementation.
* Added a `url_filter_func` configuration variable which takes a function * Added a `url_filter_func` configuration variable which takes a function
that can rewrite any link or image URL to something different. that can rewrite any link or image URL to something different.
@ -239,7 +308,7 @@ PHP Markdown Extra 1.2.6:
* Plugin interface for WordPress and other systems is no longer present in * Plugin interface for WordPress and other systems is no longer present in
the Lib package. The classic package is still available if you need it: the Lib package. The classic package is still available if you need it:
<http://michelf.ca/projects/php-markdown/classic/> <https://michelf.ca/projects/php-markdown/classic/>
* Added `public` and `protected` protection attributes, plus a section about * Added `public` and `protected` protection attributes, plus a section about
what is "public API" and what isn't in the Readme file. what is "public API" and what isn't in the Readme file.
@ -277,13 +346,13 @@ Copyright and License
--------------------- ---------------------
PHP Markdown Lib PHP Markdown Lib
Copyright (c) 2004-2014 Michel Fortin Copyright (c) 2004-2016 Michel Fortin
<http://michelf.ca/> <https://michelf.ca/>
All rights reserved. All rights reserved.
Based on Markdown Based on Markdown
Copyright (c) 2003-2005 John Gruber Copyright (c) 2003-2005 John Gruber
<http://daringfireball.net/> <https://daringfireball.net/>
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View file

@ -1,18 +1,18 @@
<?php <?php
# This file passes the content of the Readme.md file in the same directory // This file passes the content of the Readme.md file in the same directory
# through the Markdown filter. You can adapt this sample code in any way // through the Markdown filter. You can adapt this sample code in any way
# you like. // you like.
# Install PSR-0-compatible class autoloader // Install PSR-0-compatible class autoloader
spl_autoload_register(function($class){ spl_autoload_register(function($class){
require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php'; require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
}); });
# Get Markdown class // Get Markdown class
use \Michelf\Markdown; use \Michelf\Markdown;
# Read file and pass content through the Markdown parser // Read file and pass content through the Markdown parser
$text = file_get_contents('Readme.md'); $text = file_get_contents('Readme.md');
$html = Markdown::defaultTransform($text); $html = Markdown::defaultTransform($text);
@ -24,7 +24,7 @@ $html = Markdown::defaultTransform($text);
</head> </head>
<body> <body>
<?php <?php
# Put HTML content in the document // Put HTML content in the document
echo $html; echo $html;
?> ?>
</body> </body>

View file

@ -2,19 +2,19 @@
"name": "michelf/php-markdown", "name": "michelf/php-markdown",
"type": "library", "type": "library",
"description": "PHP Markdown", "description": "PHP Markdown",
"homepage": "http://michelf.ca/projects/php-markdown/", "homepage": "https://michelf.ca/projects/php-markdown/",
"keywords": ["markdown"], "keywords": ["markdown"],
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"authors": [ "authors": [
{ {
"name": "Michel Fortin", "name": "Michel Fortin",
"email": "michel.fortin@michelf.ca", "email": "michel.fortin@michelf.ca",
"homepage": "http://michelf.ca/", "homepage": "https://michelf.ca/",
"role": "Developer" "role": "Developer"
}, },
{ {
"name": "John Gruber", "name": "John Gruber",
"homepage": "http://daringfireball.net/" "homepage": "https://daringfireball.net/"
} }
], ],
"require": { "require": {
@ -22,10 +22,5 @@
}, },
"autoload": { "autoload": {
"psr-0": { "Michelf": "" } "psr-0": { "Michelf": "" }
},
"extra": {
"branch-alias": {
"dev-lib": "1.4.x-dev"
}
} }
} }

View file

@ -629,7 +629,6 @@ function admin_page_site_post(App $a) {
$no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False); $no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
$no_openid = !((x($_POST,'no_openid')) ? True : False); $no_openid = !((x($_POST,'no_openid')) ? True : False);
$no_regfullname = !((x($_POST,'no_regfullname')) ? True : False); $no_regfullname = !((x($_POST,'no_regfullname')) ? True : False);
$no_utf = !((x($_POST,'no_utf')) ? True : False);
$community_page_style = ((x($_POST,'community_page_style')) ? intval(trim($_POST['community_page_style'])) : 0); $community_page_style = ((x($_POST,'community_page_style')) ? intval(trim($_POST['community_page_style'])) : 0);
$max_author_posts_community_page = ((x($_POST,'max_author_posts_community_page')) ? intval(trim($_POST['max_author_posts_community_page'])) : 0); $max_author_posts_community_page = ((x($_POST,'max_author_posts_community_page')) ? intval(trim($_POST['max_author_posts_community_page'])) : 0);
@ -666,7 +665,6 @@ function admin_page_site_post(App $a) {
$proxy_disabled = ((x($_POST,'proxy_disabled')) ? True : False); $proxy_disabled = ((x($_POST,'proxy_disabled')) ? True : False);
$only_tag_search = ((x($_POST,'only_tag_search')) ? True : False); $only_tag_search = ((x($_POST,'only_tag_search')) ? True : False);
$rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0); $rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0);
$embedly = ((x($_POST,'embedly')) ? notags(trim($_POST['embedly'])) : '');
$worker_queues = ((x($_POST,'worker_queues')) ? intval($_POST['worker_queues']) : 4); $worker_queues = ((x($_POST,'worker_queues')) ? intval($_POST['worker_queues']) : 4);
$worker_dont_fork = ((x($_POST,'worker_dont_fork')) ? True : False); $worker_dont_fork = ((x($_POST,'worker_dont_fork')) ? True : False);
$worker_fastlane = ((x($_POST,'worker_fastlane')) ? True : False); $worker_fastlane = ((x($_POST,'worker_fastlane')) ? True : False);
@ -787,7 +785,6 @@ function admin_page_site_post(App $a) {
set_config('system','no_regfullname', $no_regfullname); set_config('system','no_regfullname', $no_regfullname);
set_config('system','community_page_style', $community_page_style); set_config('system','community_page_style', $community_page_style);
set_config('system','max_author_posts_community_page', $max_author_posts_community_page); set_config('system','max_author_posts_community_page', $max_author_posts_community_page);
set_config('system','no_utf', $no_utf);
set_config('system','verifyssl', $verifyssl); set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser); set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy); set_config('system','proxy', $proxy);
@ -821,9 +818,6 @@ function admin_page_site_post(App $a) {
set_config('system','rino_encrypt', $rino); set_config('system','rino_encrypt', $rino);
} }
set_config('system','embedly', $embedly);
info(t('Site settings updated.').EOL); info(t('Site settings updated.').EOL);
goaway('admin/site'); goaway('admin/site');
return; // NOTREACHED return; // NOTREACHED
@ -1012,7 +1006,6 @@ function admin_page_site(App $a) {
'$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")), '$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")),
'$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")), '$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
'$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")), '$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")),
'$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
'$community_page_style' => array('community_page_style', t("Community Page Style"), get_config('system','community_page_style'), t("Type of community page to show. 'Global community' shows every public posting from an open distributed network that arrived on this server."), $community_page_style_choices), '$community_page_style' => array('community_page_style', t("Community Page Style"), get_config('system','community_page_style'), t("Type of community page to show. 'Global community' shows every public posting from an open distributed network that arrived on this server."), $community_page_style_choices),
'$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")), '$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")),
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")), '$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
@ -1053,7 +1046,6 @@ function admin_page_site(App $a) {
'$relocate_url' => array('relocate_url', t("New base url"), App::get_baseurl(), t("Change base url for this server. Sends relocate message to all DFRN contacts of all users.")), '$relocate_url' => array('relocate_url', t("New base url"), App::get_baseurl(), t("Change base url for this server. Sends relocate message to all DFRN contacts of all users.")),
'$rino' => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")), '$rino' => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")),
'$embedly' => array('embedly', t("Embedly API key"), get_config('system','embedly'), t("<a href='http://embed.ly'>Embedly</a> is used to fetch additional data for web pages. This is an optional parameter.")),
'$worker_queues' => array('worker_queues', t("Maximum number of parallel workers"), get_config('system','worker_queues'), t("On shared hosters set this to 2. On larger systems, values of 10 are great. Default value is 4.")), '$worker_queues' => array('worker_queues', t("Maximum number of parallel workers"), get_config('system','worker_queues'), t("On shared hosters set this to 2. On larger systems, values of 10 are great. Default value is 4.")),
'$worker_dont_fork' => array('worker_dont_fork', t("Don't use 'proc_open' with the worker"), get_config('system','worker_dont_fork'), t("Enable this if your system doesn't allow the use of 'proc_open'. This can happen on shared hosters. If this is enabled you should increase the frequency of poller calls in your crontab.")), '$worker_dont_fork' => array('worker_dont_fork', t("Don't use 'proc_open' with the worker"), get_config('system','worker_dont_fork'), t("Enable this if your system doesn't allow the use of 'proc_open'. This can happen on shared hosters. If this is enabled you should increase the frequency of poller calls in your crontab.")),

View file

@ -73,9 +73,9 @@ function dirfind_content(App $a, $prefix = "") {
$j->results[] = $objresult; $j->results[] = $objresult;
// Add the contact to the global contacts if it isn't already in our system // Add the contact to the global contacts if it isn't already in our system
if (($contact["cid"] == 0) AND ($contact["zid"] == 0) AND ($contact["gid"] == 0)) if (($contact["cid"] == 0) AND ($contact["zid"] == 0) AND ($contact["gid"] == 0)) {
poco_check($user_data["url"], $user_data["name"], $user_data["network"], $user_data["photo"], update_gcontact($user_data);
"", "", "", "", "", datetime_convert(), 0); }
} elseif ($local) { } elseif ($local) {
if ($community) if ($community)

View file

@ -114,7 +114,6 @@
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>
{{include file="field_select.tpl" field=$rino}} {{include file="field_select.tpl" field=$rino}}
{{include file="field_checkbox.tpl" field=$no_utf}}
{{include file="field_checkbox.tpl" field=$verifyssl}} {{include file="field_checkbox.tpl" field=$verifyssl}}
{{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxy}}
{{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$proxyuser}}
@ -128,7 +127,6 @@
{{include file="field_input.tpl" field=$basepath}} {{include file="field_input.tpl" field=$basepath}}
{{include file="field_checkbox.tpl" field=$suppress_tags}} {{include file="field_checkbox.tpl" field=$suppress_tags}}
{{include file="field_checkbox.tpl" field=$nodeinfo}} {{include file="field_checkbox.tpl" field=$nodeinfo}}
{{include file="field_input.tpl" field=$embedly}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$portable_contacts}}</h3> <h3>{{$portable_contacts}}</h3>

View file

@ -4,20 +4,17 @@
* @brief The default site template * @brief The default site template
*/ */
?> ?>
<!DOCTYPE html > <!DOCTYPE html >
<?php <?php
require_once('view/theme/frio/php/frio_boot.php'); require_once('view/theme/frio/php/frio_boot.php');
// $minimal = is_modal(); // $minimal = is_modal();
?> ?>
<html> <html>
<head> <head>
<title><?php if(x($page,'title')) echo $page['title'] ?></title> <title><?php if(x($page,'title')) echo $page['title'] ?></title>
<meta request="<?php echo htmlspecialchars($_REQUEST['pagename']) ?> "> <meta request="<?php echo htmlspecialchars($_REQUEST['pagename']) ?>">
<script>var baseurl="<?php echo App::get_baseurl() ?>";</script> <script>var baseurl="<?php echo App::get_baseurl() ?>";</script>
<script>var frio="<?php echo "view/theme/frio"; ?>";</script> <script>var frio="<?php echo "view/theme/frio"; ?>";</script>
<?php $baseurl = App::get_baseurl(); ?> <?php $baseurl = App::get_baseurl(); ?>
@ -31,8 +28,6 @@
if(x($page,'htmlhead')) echo $page['htmlhead']; if(x($page,'htmlhead')) echo $page['htmlhead'];
} }
?> ?>
</head> </head>
<?php <?php
if(($_SERVER['REQUEST_URI'] != "/register") && ($_SERVER['REQUEST_URI'] != "/lostpass") && ($_SERVER['REQUEST_URI'] != "/login")) if(($_SERVER['REQUEST_URI'] != "/register") && ($_SERVER['REQUEST_URI'] != "/lostpass") && ($_SERVER['REQUEST_URI'] != "/login"))
@ -90,7 +85,6 @@ else
"; ";
} }
?> ?>
</div><!--row--> </div><!--row-->
</div><!-- container --> </div><!-- container -->

View file

@ -4,21 +4,17 @@
* @brief The default site template * @brief The default site template
*/ */
?> ?>
<!DOCTYPE html > <!DOCTYPE html >
<html> <html>
<head> <head>
<title><?php if(x($page,'title')) echo $page['title'] ?></title> <title><?php if(x($page,'title')) echo $page['title'] ?></title>
<meta name="viewport" content="initial-scale=1.0"> <meta name="viewport" content="initial-scale=1.0">
<meta request="<?php echo htmlspecialchars($_REQUEST['pagename']) ?> "> <meta request="<?php echo htmlspecialchars($_REQUEST['pagename']) ?>">
<script>var baseurl="<?php echo App::get_baseurl() ?>";</script> <script>var baseurl="<?php echo App::get_baseurl() ?>";</script>
<script>var frio="<?php echo "view/theme/frio"; ?>";</script> <script>var frio="<?php echo "view/theme/frio"; ?>";</script>
<?php $baseurl = App::get_baseurl(); ?> <?php $baseurl = App::get_baseurl(); ?>
<?php $frio = "view/theme/frio"; ?> <?php $frio = "view/theme/frio"; ?>
<?php if(x($page,'htmlhead')) echo $page['htmlhead']; ?> <?php if(x($page,'htmlhead')) echo $page['htmlhead']; ?>
</head> </head>
<body id=\"top\">"; <body id=\"top\">";
<?php if($_SERVER['REQUEST_URI'] == "/"){header('Location: /login');} ?> <?php if($_SERVER['REQUEST_URI'] == "/"){header('Location: /login');} ?>
@ -54,7 +50,6 @@
</div> </div>
"; ";
?> ?>
</div><!--row--> </div><!--row-->
</div><!-- container --> </div><!-- container -->
@ -126,7 +121,5 @@ $("nav").bind('nav-update', function(e,data)
</div> </div>
</div> </div>
</div> </div>
</footer> </footer>
</body> </body>

View file

@ -52,7 +52,6 @@
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>
{{include file="field_checkbox.tpl" field=$no_utf}}
{{include file="field_checkbox.tpl" field=$verifyssl}} {{include file="field_checkbox.tpl" field=$verifyssl}}
{{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxy}}
{{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$proxyuser}}

View file

@ -52,7 +52,6 @@
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>
{{include file="field_checkbox.tpl" field=$no_utf}}
{{include file="field_checkbox.tpl" field=$verifyssl}} {{include file="field_checkbox.tpl" field=$verifyssl}}
{{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxy}}
{{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$proxyuser}}