diff --git a/boot.php b/boot.php
index e1687030d..ca954a90c 100644
--- a/boot.php
+++ b/boot.php
@@ -9,9 +9,9 @@ require_once('include/nav.php');
require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
-define ( 'FRIENDICA_VERSION', '2.3.1329' );
+define ( 'FRIENDICA_VERSION', '2.3.1330' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
-define ( 'DB_UPDATE_VERSION', 1142 );
+define ( 'DB_UPDATE_VERSION', 1143 );
define ( 'EOL', "
\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -1520,9 +1520,12 @@ function get_my_url() {
}
function zrl_init(&$a) {
- proc_run('php','include/gprobe.php',bin2hex(get_my_url()));
- $arr = array('zrl' => get_my_url(), 'url' => $a->cmd);
- call_hooks('zrl_init',$arr);
+ $tmp_str = get_my_url();
+ if(validate_url($tmp_str)) {
+ proc_run('php','include/gprobe.php',bin2hex($tmp_str));
+ $arr = array('zrl' => $tmp_str, 'url' => $a->cmd);
+ call_hooks('zrl_init',$arr);
+ }
}
function zrl($s,$force = false) {
diff --git a/database.sql b/database.sql
index dc586bc2b..cf086796a 100644
--- a/database.sql
+++ b/database.sql
@@ -1027,6 +1027,7 @@ CREATE TABLE IF NOT EXISTS `user` (
`account_expired` tinyint(1) NOT NULL DEFAULT '0',
`account_expires_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`expire_notification_sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `service_class` char(32) NOT NULL,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -1042,7 +1043,8 @@ CREATE TABLE IF NOT EXISTS `user` (
KEY `verified` (`verified`),
KEY `unkmail` (`unkmail`),
KEY `cntunkmail` (`cntunkmail`),
- KEY `account_removed` (`account_removed`)
+ KEY `account_removed` (`account_removed`),
+ KEY `service_class` (`service_class`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
diff --git a/include/cache.php b/include/cache.php
index 3c8a3f713..360c4acbd 100644
--- a/include/cache.php
+++ b/include/cache.php
@@ -14,22 +14,40 @@
}
public static function set($key,$value) {
- $r = q("SELECT * FROM `cache` WHERE `k`='%s' limit 1",
- dbesc($key)
- );
- if(count($r)) {
- q("UPDATE `cache` SET `v` = '%s', `updated = '%s' WHERE `k` = '%s' limit 1",
- dbesc($value),
- dbesc(datetime_convert()),
- dbesc($key));
- }
- else {
- q("INSERT INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')",
+
+ q("REPLACE INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')",
dbesc($key),
dbesc($value),
dbesc(datetime_convert()));
- }
}
+
+
+/*
+ *
+ * Leaving this legacy code temporaily to see how REPLACE fares
+ * as opposed to non-atomic checks when faced with fast moving key duplication.
+ * As a MySQL extension it isn't portable, but we're not yet very portable.
+ */
+
+/*
+ * $r = q("SELECT * FROM `cache` WHERE `k`='%s' limit 1",
+ * dbesc($key)
+ * );
+ * if(count($r)) {
+ * q("UPDATE `cache` SET `v` = '%s', `updated = '%s' WHERE `k` = '%s' limit 1",
+ * dbesc($value),
+ * dbesc(datetime_convert()),
+ * dbesc($key));
+ * }
+ * else {
+ * q("INSERT INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')",
+ * dbesc($key),
+ * dbesc($value),
+ * dbesc(datetime_convert()));
+ * }
+ * }
+ */
+
public static function clear(){
q("DELETE FROM `cache` WHERE `updated` < '%s'",
diff --git a/include/contact_widgets.php b/include/contact_widgets.php
index cfe27c5c9..bf3a86958 100644
--- a/include/contact_widgets.php
+++ b/include/contact_widgets.php
@@ -146,11 +146,19 @@ function common_friends_visitor_widget($profile_uid) {
$cid = local_user();
else {
if(get_my_url()) {
- $r = q("select id from gcontact where nurl = '%s' limit 1",
- dbesc(normalise_link(get_my_url()))
+ $r = q("select id from contact where nurl = '%s' and uid = %d limit 1",
+ dbesc(normalise_link(get_my_url())),
+ intval($profile_uid)
);
if(count($r))
- $zcid = $r[0]['id'];
+ $cid = $r[0]['id'];
+ else {
+ $r = q("select id from gcontact where nurl = '%s' limit 1",
+ dbesc(normalise_link(get_my_url()))
+ );
+ if(count($r))
+ $zcid = $r[0]['id'];
+ }
}
}
@@ -162,14 +170,14 @@ function common_friends_visitor_widget($profile_uid) {
if($cid)
$t = count_common_friends($profile_uid,$cid);
else
- $t = count_common_friends($profile_uid,$cid);
+ $t = count_common_friends_zcid($profile_uid,$zcid);
if(! $t)
return;
if($cid)
- $r = common_friends($profile_uid,$cid,5);
+ $r = common_friends($profile_uid,$cid,5,true);
else
- $r = common_friends_zcid($profile_uid,$zcid);
+ $r = common_friends_zcid($profile_uid,$zcid,5,true);
return replace_macros(get_markup_template('remote_friends_common.tpl'), array(
'$desc' => sprintf( tt("%d friend in common", "%d friends in common", $t), $t),
diff --git a/include/socgraph.php b/include/socgraph.php
index a08d58074..a67b3d9e3 100644
--- a/include/socgraph.php
+++ b/include/socgraph.php
@@ -99,11 +99,12 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) {
$gcid = $x[0]['id'];
if($x[0]['name'] != $name || $x[0]['photo'] != $profile_photo) {
- q("update gcontact set `name` = '%s', `photo` = '%s', `connect` = '%s'
+ q("update gcontact set `name` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s'
where `nurl` = '%s' limit 1",
dbesc($name),
dbesc($profile_photo),
dbesc($connect_url),
+ dbesc($profile_url),
dbesc(normalise_link($profile_url))
);
}
@@ -168,7 +169,7 @@ function count_common_friends($uid,$cid) {
$r = q("SELECT count(*) as `total`
FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
where `glink`.`cid` = %d and `glink`.`uid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and id != %d ) ",
+ and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d ) ",
intval($cid),
intval($uid),
intval($uid),
@@ -182,13 +183,18 @@ function count_common_friends($uid,$cid) {
}
-function common_friends($uid,$cid,$limit=9999) {
+function common_friends($uid,$cid,$limit=9999,$shuffle = false) {
+
+ if($shuffle)
+ $sql_extra = " order by rand() ";
+ else
+ $sql_extra = " order by `gcontact`.`name` asc ";
$r = q("SELECT `gcontact`.*
FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
where `glink`.`cid` = %d and `glink`.`uid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and id != %d )
- order by `gcontact`.`name` asc limit 0, %d",
+ and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d )
+ $sql_extra limit 0, %d",
intval($cid),
intval($uid),
intval($uid),
@@ -206,7 +212,7 @@ function count_common_friends_zcid($uid,$zcid) {
$r = q("SELECT count(*) as `total`
FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
where `glink`.`zcid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 ) ",
+ and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 ) ",
intval($zcid),
intval($uid)
);
@@ -217,13 +223,18 @@ function count_common_friends_zcid($uid,$zcid) {
}
-function common_friends_zcid($uid,$zcid,$limit = 6) {
+function common_friends_zcid($uid,$zcid,$limit = 9999,$shuffle) {
+
+ if($shuffle)
+ $sql_extra = " order by rand() ";
+ else
+ $sql_extra = " order by `gcontact`.`name` asc ";
$r = q("SELECT `gcontact`.*
FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
where `glink`.`zcid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 )
- order by `gcontact`.`name` asc limit 0, %d",
+ and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 )
+ $sql_extra limit 0, %d",
intval($zcid),
intval($uid),
intval($limit)
diff --git a/mod/events.php b/mod/events.php
index e66a2dc44..069046ff9 100644
--- a/mod/events.php
+++ b/mod/events.php
@@ -28,6 +28,9 @@ function events_post(&$a) {
$adjust = intval($_POST['adjust']);
$nofinish = intval($_POST['nofinish']);
+ // The default setting for the `private` field in event_store() is false, so mirror that
+ $private_event = false;
+
$start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
if($nofinish)
@@ -65,14 +68,38 @@ function events_post(&$a) {
$share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);
+ $c = q("select id from contact where uid = %d and self = 1 limit 1",
+ intval(local_user())
+ );
+ if(count($c))
+ $self = $c[0]['id'];
+ else
+ $self = 0;
+
+
if($share) {
$str_group_allow = perms2str($_POST['group_allow']);
$str_contact_allow = perms2str($_POST['contact_allow']);
$str_group_deny = perms2str($_POST['group_deny']);
$str_contact_deny = perms2str($_POST['contact_deny']);
+
+ // Undo the pseudo-contact of self, since there are real contacts now
+ if( strpos($str_contact_allow, '<' . $self . '>') !== false )
+ {
+ $str_contact_allow = str_replace('<' . $self . '>', '', $str_contact_allow);
+ }
+ // Make sure to set the `private` field as true. This is necessary to
+ // have the posts show up correctly in Diaspora if an event is created
+ // as visible only to self at first, but then edited to display to others.
+ if( strlen($str_group_allow) or strlen($str_contact_allow) or strlen($str_group_deny) or strlen($str_contact_deny) )
+ {
+ $private_event = true;
+ }
}
else {
- $str_contact_allow = '<' . local_user() . '>';
+ // Note: do not set `private` field for self-only events. It will
+ // keep even you from seeing them!
+ $str_contact_allow = '<' . $self . '>';
$str_group_allow = $str_contact_deny = $str_group_deny = '';
}
@@ -91,6 +118,7 @@ function events_post(&$a) {
$datarray['allow_gid'] = $str_group_allow;
$datarray['deny_cid'] = $str_contact_deny;
$datarray['deny_gid'] = $str_group_deny;
+ $datarray['private'] = $private_event;
$datarray['id'] = $event_id;
$datarray['created'] = $created;
$datarray['edited'] = $edited;
diff --git a/mod/item.php b/mod/item.php
index 1436f7ffc..639379fe0 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -444,9 +444,28 @@ function item_post(&$a) {
$tags[] = '@' . $parent_contact['nick'];
}
+ $tagged = array();
+
+
if(count($tags)) {
foreach($tags as $tag) {
- handle_tag($a, $body, $inform, $str_tags, (local_user()) ? local_user() : $profile_uid , $tag);
+
+ // If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
+ // Robert Johnson should be first in the $tags array
+
+ $fullnametagged = false;
+ for($x = 0; $x < count($tagged); $x ++) {
+ if(stristr($tagged[$x],$tag . ' ')) {
+ $fullnametagged = true;
+ break;
+ }
+ }
+ if($fullnametagged)
+ continue;
+
+ $success = handle_tag($a, $body, $inform, $str_tags, (local_user()) ? local_user() : $profile_uid , $tag);
+ if($success)
+ $tagged[] = $tag;
}
}
@@ -861,21 +880,27 @@ function item_content(&$a) {
* @param unknown_type $str_tags string to add the tag to
* @param unknown_type $profile_uid
* @param unknown_type $tag the tag to replace
+ *
+ * @return boolean true if replaced, false if not replaced
*/
function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
+
+ $replaced = false;
+
//is it a hash tag?
if(strpos($tag,'#') === 0) {
//if the tag is replaced...
if(strpos($tag,'[url='))
//...do nothing
- return;
+ return $replaced;
//base tag has the tags name only
$basetag = str_replace('_',' ',substr($tag,1));
//create text for link
$newtag = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
//replace tag by the link
$body = str_replace($tag, $newtag, $body);
-
+ $replaced = true;
+
//is the link already in str_tags?
if(! stristr($str_tags,$newtag)) {
//append or set str_tags
@@ -883,13 +908,13 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
$str_tags .= ',';
$str_tags .= $newtag;
}
- return;
+ return $replaced;
}
//is it a person tag?
if(strpos($tag,'@') === 0) {
//is it already replaced?
if(strpos($tag,'[url='))
- return;
+ return $replaced;
$stat = false;
//get the person's name
$name = substr($tag,1);
@@ -965,6 +990,7 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
}
//if there is an url for this persons profile
if(isset($profile)) {
+ $replaced = true;
//create profile link
$profile = str_replace(',','%2c',$profile);
$newtag = '@[url=' . $profile . ']' . $newname . '[/url]';
@@ -989,4 +1015,6 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
}
}
}
+
+ return $replaced;
}
diff --git a/mod/profiles.php b/mod/profiles.php
index 3a52c8fa5..4de9057dc 100644
--- a/mod/profiles.php
+++ b/mod/profiles.php
@@ -328,7 +328,7 @@ function profile_activity($changed, $value) {
$prof = '[url=' . $self[0]['url'] . '?tab=profile' . ']' . t('public profile') . '[/url]';
if($t == 1 && strlen($value)) {
- $message = sprintf( t('%1$s changed %2$s to %3$s'), $A, $changes, $value);
+ $message = sprintf( t('%1$s changed %2$s to "%3$s"'), $A, $changes, $value);
$message .= "\n\n" . sprintf( t(' - Visit %1$s\'s %2$s'), $A, $prof);
}
else
diff --git a/update.php b/update.php
index cce942f27..e363aa942 100644
--- a/update.php
+++ b/update.php
@@ -1,6 +1,6 @@
\n"
"Language-Team: LANGUAGE \n"
@@ -3584,7 +3584,7 @@ msgstr ""
msgid "Access to this profile has been restricted."
msgstr ""
-#: ../../mod/profile.php:147
+#: ../../mod/profile.php:151
msgid "Tips for New Members"
msgstr ""
@@ -3783,7 +3783,7 @@ msgstr ""
#: ../../mod/profiles.php:331
#, php-format
-msgid "%1$s changed %2$s to %3$s"
+msgid "%1$s changed %2$s to \"%3$s\""
msgstr ""
#: ../../mod/profiles.php:332
@@ -6431,6 +6431,13 @@ msgstr ""
msgid "Categories"
msgstr ""
+#: ../../include/contact_widgets.php:183
+#, php-format
+msgid "%d friend in common"
+msgid_plural "%d friends in common"
+msgstr[0] ""
+msgstr[1] ""
+
#: ../../include/auth.php:29
msgid "Logged out."
msgstr ""
diff --git a/view/head.tpl b/view/head.tpl
index 7b1541242..7638e56ca 100644
--- a/view/head.tpl
+++ b/view/head.tpl
@@ -6,7 +6,6 @@
-
+
diff --git a/view/theme/diabook/comment_item.tpl b/view/theme/diabook/comment_item.tpl
index e10b86845..fc3594fdc 100644
--- a/view/theme/diabook/comment_item.tpl
+++ b/view/theme/diabook/comment_item.tpl
@@ -13,13 +13,13 @@
{{ if $qcomment }}