Merge remote-tracking branch 'upstream/develop' into 1601-dfrn

This commit is contained in:
Michael Vogel 2016-01-21 23:05:02 +01:00
commit fe5705e547
79 changed files with 6196 additions and 5286 deletions

View File

@ -36,7 +36,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus');
define ( 'FRIENDICA_VERSION', '3.5-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1191 );
define ( 'DB_UPDATE_VERSION', 1193 );
/**
* @brief Constant with a HTML line break.
@ -467,6 +467,7 @@ class App {
public $is_tablet;
public $is_friendica_app;
public $performance = array();
public $callstack = array();
public $nav_sel;
@ -554,6 +555,12 @@ class App {
$this->performance["marktime"] = 0;
$this->performance["markstart"] = microtime(true);
$this->callstack["database"] = array();
$this->callstack["network"] = array();
$this->callstack["file"] = array();
$this->callstack["rendering"] = array();
$this->callstack["parser"] = array();
$this->config = array();
$this->page = array();
$this->pager= array();
@ -903,6 +910,10 @@ class App {
}
function get_cached_avatar_image($avatar_image){
return $avatar_image;
// The following code is deactivated. It doesn't seem to make any sense and it slows down the system.
/*
if($this->cached_profile_image[$avatar_image])
return $this->cached_profile_image[$avatar_image];
@ -922,6 +933,7 @@ class App {
}
}
return $this->cached_profile_image[$avatar_image];
*/
}
@ -1016,6 +1028,20 @@ class App {
$this->performance[$value] += (float)$duration;
$this->performance["marktime"] += (float)$duration;
// Trace the different functions with their timestamps
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5);
array_shift($trace);
$function = array();
foreach ($trace AS $func)
$function[] = $func["function"];
$function = implode(", ", $function);
$this->callstack[$value][$function] += (float)$duration;
}
function mark_timestamp($mark) {

View File

@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 3.4.2 (Lily of the valley)
-- DB_UPDATE_VERSION 1190
-- Friendica 3.5-dev (Asparagus)
-- DB_UPDATE_VERSION 1193
-- ------------------------------------------
@ -8,20 +8,21 @@
-- TABLE addon
--
CREATE TABLE IF NOT EXISTS `addon` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL DEFAULT '',
`version` varchar(255) NOT NULL DEFAULT '',
`installed` tinyint(1) NOT NULL DEFAULT 0,
`hidden` tinyint(1) NOT NULL DEFAULT 0,
`timestamp` bigint(20) NOT NULL DEFAULT 0,
`plugin_admin` tinyint(1) NOT NULL DEFAULT 0
`plugin_admin` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE attach
--
CREATE TABLE IF NOT EXISTS `attach` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`hash` varchar(64) NOT NULL DEFAULT '',
`filename` varchar(255) NOT NULL DEFAULT '',
@ -33,28 +34,31 @@ CREATE TABLE IF NOT EXISTS `attach` (
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL
`deny_gid` mediumtext NOT NULL,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE auth_codes
--
CREATE TABLE IF NOT EXISTS `auth_codes` (
`id` varchar(40) NOT NULL PRIMARY KEY,
`id` varchar(40) NOT NULL,
`client_id` varchar(20) NOT NULL DEFAULT '',
`redirect_uri` varchar(200) NOT NULL DEFAULT '',
`expires` int(11) NOT NULL DEFAULT 0,
`scope` varchar(250) NOT NULL DEFAULT ''
`scope` varchar(250) NOT NULL DEFAULT '',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE cache
--
CREATE TABLE IF NOT EXISTS `cache` (
`k` varchar(255) NOT NULL PRIMARY KEY,
`k` varchar(255) NOT NULL,
`v` text NOT NULL,
`expire_mode` int(11) NOT NULL DEFAULT 0,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`k`),
INDEX `updated` (`updated`)
) DEFAULT CHARSET=utf8;
@ -62,34 +66,37 @@ CREATE TABLE IF NOT EXISTS `cache` (
-- TABLE challenge
--
CREATE TABLE IF NOT EXISTS `challenge` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`challenge` varchar(255) NOT NULL DEFAULT '',
`dfrn-id` varchar(255) NOT NULL DEFAULT '',
`expire` int(11) NOT NULL DEFAULT 0,
`type` varchar(255) NOT NULL DEFAULT '',
`last_update` varchar(255) NOT NULL DEFAULT ''
`last_update` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE clients
--
CREATE TABLE IF NOT EXISTS `clients` (
`client_id` varchar(20) NOT NULL PRIMARY KEY,
`client_id` varchar(20) NOT NULL,
`pw` varchar(20) NOT NULL DEFAULT '',
`redirect_uri` varchar(200) NOT NULL DEFAULT '',
`name` text,
`icon` text,
`uid` int(11) NOT NULL DEFAULT 0
`uid` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`client_id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE config
--
CREATE TABLE IF NOT EXISTS `config` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`cat` varchar(255) NOT NULL DEFAULT '',
`k` varchar(255) NOT NULL DEFAULT '',
`v` text NOT NULL,
PRIMARY KEY(`id`),
INDEX `cat_k` (`cat`(30),`k`(30))
) DEFAULT CHARSET=utf8;
@ -97,7 +104,7 @@ CREATE TABLE IF NOT EXISTS `config` (
-- TABLE contact
--
CREATE TABLE IF NOT EXISTS `contact` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`self` tinyint(1) NOT NULL DEFAULT 0,
@ -162,6 +169,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`notify_new_posts` tinyint(1) NOT NULL DEFAULT 0,
`fetch_further_information` tinyint(1) NOT NULL DEFAULT 0,
`ffi_keyword_blacklist` mediumtext NOT NULL,
PRIMARY KEY(`id`),
INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8;
@ -169,7 +177,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
-- TABLE conv
--
CREATE TABLE IF NOT EXISTS `conv` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`guid` varchar(64) NOT NULL DEFAULT '',
`recips` mediumtext NOT NULL,
`uid` int(11) NOT NULL DEFAULT 0,
@ -177,6 +185,7 @@ CREATE TABLE IF NOT EXISTS `conv` (
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`subject` mediumtext NOT NULL,
PRIMARY KEY(`id`),
INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8;
@ -184,27 +193,29 @@ CREATE TABLE IF NOT EXISTS `conv` (
-- TABLE deliverq
--
CREATE TABLE IF NOT EXISTS `deliverq` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`cmd` varchar(32) NOT NULL DEFAULT '',
`item` int(11) NOT NULL DEFAULT 0,
`contact` int(11) NOT NULL DEFAULT 0
`contact` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE dsprphotoq
--
CREATE TABLE IF NOT EXISTS `dsprphotoq` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`msg` mediumtext NOT NULL,
`attempt` tinyint(4) NOT NULL DEFAULT 0
`attempt` tinyint(4) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE event
--
CREATE TABLE IF NOT EXISTS `event` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`cid` int(11) NOT NULL DEFAULT 0,
`uri` varchar(255) NOT NULL DEFAULT '',
@ -223,6 +234,7 @@ CREATE TABLE IF NOT EXISTS `event` (
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
PRIMARY KEY(`id`),
INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8;
@ -230,7 +242,7 @@ CREATE TABLE IF NOT EXISTS `event` (
-- TABLE fcontact
--
CREATE TABLE IF NOT EXISTS `fcontact` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`url` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '',
`photo` varchar(255) NOT NULL DEFAULT '',
@ -246,6 +258,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`alias` varchar(255) NOT NULL DEFAULT '',
`pubkey` text NOT NULL,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`),
INDEX `addr` (`addr`)
) DEFAULT CHARSET=utf8;
@ -253,20 +266,22 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
-- TABLE ffinder
--
CREATE TABLE IF NOT EXISTS `ffinder` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`cid` int(10) unsigned NOT NULL DEFAULT 0,
`fid` int(10) unsigned NOT NULL DEFAULT 0
`fid` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE fserver
--
CREATE TABLE IF NOT EXISTS `fserver` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`server` varchar(255) NOT NULL DEFAULT '',
`posturl` varchar(255) NOT NULL DEFAULT '',
`key` text NOT NULL,
PRIMARY KEY(`id`),
INDEX `server` (`server`)
) DEFAULT CHARSET=utf8;
@ -274,7 +289,7 @@ CREATE TABLE IF NOT EXISTS `fserver` (
-- TABLE fsuggest
--
CREATE TABLE IF NOT EXISTS `fsuggest` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`cid` int(11) NOT NULL DEFAULT 0,
`name` varchar(255) NOT NULL DEFAULT '',
@ -282,16 +297,18 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
`request` varchar(255) NOT NULL DEFAULT '',
`photo` varchar(255) NOT NULL DEFAULT '',
`note` text NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE gcign
--
CREATE TABLE IF NOT EXISTS `gcign` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`gcid` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `gcid` (`gcid`)
) DEFAULT CHARSET=utf8;
@ -300,7 +317,7 @@ CREATE TABLE IF NOT EXISTS `gcign` (
-- TABLE gcontact
--
CREATE TABLE IF NOT EXISTS `gcontact` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL DEFAULT '',
`nick` varchar(255) NOT NULL DEFAULT '',
`url` varchar(255) NOT NULL DEFAULT '',
@ -315,11 +332,17 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
`about` text NOT NULL,
`keywords` text NOT NULL,
`gender` varchar(32) NOT NULL DEFAULT '',
`birthday` varchar(32) NOT NULL DEFAULT '0000-00-00',
`community` tinyint(1) NOT NULL DEFAULT 0,
`hide` tinyint(1) NOT NULL DEFAULT 0,
`nsfw` tinyint(1) NOT NULL DEFAULT 0,
`network` varchar(255) NOT NULL DEFAULT '',
`addr` varchar(255) NOT NULL DEFAULT '',
`notify` text NOT NULL,
`alias` varchar(255) NOT NULL DEFAULT '',
`generation` tinyint(3) NOT NULL DEFAULT 0,
`server_url` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `nurl` (`nurl`),
INDEX `updated` (`updated`)
) DEFAULT CHARSET=utf8;
@ -328,12 +351,13 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
-- TABLE glink
--
CREATE TABLE IF NOT EXISTS `glink` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`cid` int(11) NOT NULL DEFAULT 0,
`uid` int(11) NOT NULL DEFAULT 0,
`gcid` int(11) NOT NULL DEFAULT 0,
`zcid` int(11) NOT NULL DEFAULT 0,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`),
INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`),
INDEX `gcid` (`gcid`),
INDEX `zcid` (`zcid`)
@ -343,11 +367,12 @@ CREATE TABLE IF NOT EXISTS `glink` (
-- TABLE group
--
CREATE TABLE IF NOT EXISTS `group` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`visible` tinyint(1) NOT NULL DEFAULT 0,
`deleted` tinyint(1) NOT NULL DEFAULT 0,
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8;
@ -355,10 +380,11 @@ CREATE TABLE IF NOT EXISTS `group` (
-- TABLE group_member
--
CREATE TABLE IF NOT EXISTS `group_member` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`gid` int(10) unsigned NOT NULL DEFAULT 0,
`contact-id` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `uid_gid_contactid` (`uid`,`gid`,`contact-id`)
) DEFAULT CHARSET=utf8;
@ -366,7 +392,7 @@ CREATE TABLE IF NOT EXISTS `group_member` (
-- TABLE gserver
--
CREATE TABLE IF NOT EXISTS `gserver` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`url` varchar(255) NOT NULL DEFAULT '',
`nurl` varchar(255) NOT NULL DEFAULT '',
`version` varchar(255) NOT NULL DEFAULT '',
@ -381,6 +407,7 @@ CREATE TABLE IF NOT EXISTS `gserver` (
`last_poco_query` datetime DEFAULT '0000-00-00 00:00:00',
`last_contact` datetime DEFAULT '0000-00-00 00:00:00',
`last_failure` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`),
INDEX `nurl` (`nurl`)
) DEFAULT CHARSET=utf8;
@ -388,11 +415,12 @@ CREATE TABLE IF NOT EXISTS `gserver` (
-- TABLE guid
--
CREATE TABLE IF NOT EXISTS `guid` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`guid` varchar(255) NOT NULL DEFAULT '',
`plink` varchar(255) NOT NULL DEFAULT '',
`uri` varchar(255) NOT NULL DEFAULT '',
`network` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `guid` (`guid`),
INDEX `plink` (`plink`),
INDEX `uri` (`uri`)
@ -402,11 +430,12 @@ CREATE TABLE IF NOT EXISTS `guid` (
-- TABLE hook
--
CREATE TABLE IF NOT EXISTS `hook` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`hook` varchar(255) NOT NULL DEFAULT '',
`file` varchar(255) NOT NULL DEFAULT '',
`function` varchar(255) NOT NULL DEFAULT '',
`priority` int(11) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `hook_file_function` (`hook`(30),`file`(60),`function`(30))
) DEFAULT CHARSET=utf8;
@ -414,7 +443,7 @@ CREATE TABLE IF NOT EXISTS `hook` (
-- TABLE intro
--
CREATE TABLE IF NOT EXISTS `intro` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`fid` int(11) NOT NULL DEFAULT 0,
`contact-id` int(11) NOT NULL DEFAULT 0,
@ -424,18 +453,20 @@ CREATE TABLE IF NOT EXISTS `intro` (
`hash` varchar(255) NOT NULL DEFAULT '',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`blocked` tinyint(1) NOT NULL DEFAULT 1,
`ignore` tinyint(1) NOT NULL DEFAULT 0
`ignore` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE item
--
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`guid` varchar(255) NOT NULL DEFAULT '',
`uri` varchar(255) NOT NULL DEFAULT '',
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`contact-id` int(11) NOT NULL DEFAULT 0,
`gcontact-id` int(11) unsigned NOT NULL DEFAULT 0,
`type` varchar(255) NOT NULL DEFAULT '',
`wall` tinyint(1) NOT NULL DEFAULT 0,
`gravity` tinyint(1) NOT NULL DEFAULT 0,
@ -493,6 +524,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`rendered-hash` varchar(32) NOT NULL DEFAULT '',
`rendered-html` mediumtext NOT NULL,
`global` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `guid` (`guid`),
INDEX `uri` (`uri`),
INDEX `parent` (`parent`),
@ -509,6 +541,7 @@ CREATE TABLE IF NOT EXISTS `item` (
INDEX `uid_thrparent` (`uid`,`thr-parent`),
INDEX `uid_parenturi` (`uid`,`parent-uri`),
INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
INDEX `gcontactid_uid_created` (`gcontact-id`,`uid`,`created`),
INDEX `wall_body` (`wall`,`body`(6)),
INDEX `uid_visible_moderated_created` (`uid`,`visible`,`moderated`,`created`),
INDEX `uid_uri` (`uid`,`uri`),
@ -531,11 +564,12 @@ CREATE TABLE IF NOT EXISTS `item` (
-- TABLE item_id
--
CREATE TABLE IF NOT EXISTS `item_id` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`iid` int(11) NOT NULL DEFAULT 0,
`uid` int(11) NOT NULL DEFAULT 0,
`sid` varchar(255) NOT NULL DEFAULT '',
`service` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `sid` (`sid`),
INDEX `service` (`service`),
@ -546,17 +580,18 @@ CREATE TABLE IF NOT EXISTS `item_id` (
-- TABLE locks
--
CREATE TABLE IF NOT EXISTS `locks` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`name` varchar(128) NOT NULL DEFAULT '',
`locked` tinyint(1) NOT NULL DEFAULT 0,
`created` datetime DEFAULT '0000-00-00 00:00:00'
`created` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE mail
--
CREATE TABLE IF NOT EXISTS `mail` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`guid` varchar(64) NOT NULL DEFAULT '',
`from-name` varchar(255) NOT NULL DEFAULT '',
@ -573,6 +608,7 @@ CREATE TABLE IF NOT EXISTS `mail` (
`uri` varchar(255) NOT NULL DEFAULT '',
`parent-uri` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `guid` (`guid`),
INDEX `convid` (`convid`),
@ -585,7 +621,7 @@ CREATE TABLE IF NOT EXISTS `mail` (
-- TABLE mailacct
--
CREATE TABLE IF NOT EXISTS `mailacct` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`server` varchar(255) NOT NULL DEFAULT '',
`port` int(11) NOT NULL DEFAULT 0,
@ -597,16 +633,18 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
`action` int(11) NOT NULL DEFAULT 0,
`movetofolder` varchar(255) NOT NULL DEFAULT '',
`pubmail` tinyint(1) NOT NULL DEFAULT 0,
`last_check` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
`last_check` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE manage
--
CREATE TABLE IF NOT EXISTS `manage` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`mid` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `uid_mid` (`uid`,`mid`)
) DEFAULT CHARSET=utf8;
@ -614,7 +652,7 @@ CREATE TABLE IF NOT EXISTS `manage` (
-- TABLE notify
--
CREATE TABLE IF NOT EXISTS `notify` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`hash` varchar(64) NOT NULL DEFAULT '',
`type` int(11) NOT NULL DEFAULT 0,
`name` varchar(255) NOT NULL DEFAULT '',
@ -629,6 +667,7 @@ CREATE TABLE IF NOT EXISTS `notify` (
`seen` tinyint(1) NOT NULL DEFAULT 0,
`verb` varchar(255) NOT NULL DEFAULT '',
`otype` varchar(16) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8;
@ -636,24 +675,50 @@ CREATE TABLE IF NOT EXISTS `notify` (
-- TABLE notify-threads
--
CREATE TABLE IF NOT EXISTS `notify-threads` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`notify-id` int(11) NOT NULL DEFAULT 0,
`master-parent-item` int(10) unsigned NOT NULL DEFAULT 0,
`parent-item` int(10) unsigned NOT NULL DEFAULT 0,
`receiver-uid` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `master-parent-item` (`master-parent-item`),
INDEX `receiver-uid` (`receiver-uid`)
) DEFAULT CHARSET=utf8;
--
-- TABLE oembed
--
CREATE TABLE IF NOT EXISTS `oembed` (
`url` varchar(255) NOT NULL,
`content` text NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`url`),
INDEX `created` (`created`)
) DEFAULT CHARSET=utf8;
--
-- TABLE parsed_url
--
CREATE TABLE IF NOT EXISTS `parsed_url` (
`url` varchar(255) NOT NULL,
`guessing` tinyint(1) NOT NULL DEFAULT 0,
`oembed` tinyint(1) NOT NULL DEFAULT 0,
`content` text NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`url`,`guessing`,`oembed`),
INDEX `created` (`created`)
) DEFAULT CHARSET=utf8;
--
-- TABLE pconfig
--
CREATE TABLE IF NOT EXISTS `pconfig` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`cat` varchar(255) NOT NULL DEFAULT '',
`k` varchar(255) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
PRIMARY KEY(`id`),
INDEX `uid_cat_k` (`uid`,`cat`(30),`k`(30))
) DEFAULT CHARSET=utf8;
@ -661,7 +726,7 @@ CREATE TABLE IF NOT EXISTS `pconfig` (
-- TABLE photo
--
CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`contact-id` int(10) unsigned NOT NULL DEFAULT 0,
`guid` varchar(64) NOT NULL DEFAULT '',
@ -683,6 +748,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `resource-id` (`resource-id`),
INDEX `guid` (`guid`)
@ -692,7 +758,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
-- TABLE poll
--
CREATE TABLE IF NOT EXISTS `poll` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`q0` mediumtext NOT NULL,
`q1` mediumtext NOT NULL,
@ -704,6 +770,7 @@ CREATE TABLE IF NOT EXISTS `poll` (
`q7` mediumtext NOT NULL,
`q8` mediumtext NOT NULL,
`q9` mediumtext NOT NULL,
PRIMARY KEY(`id`),
INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8;
@ -711,9 +778,10 @@ CREATE TABLE IF NOT EXISTS `poll` (
-- TABLE poll_result
--
CREATE TABLE IF NOT EXISTS `poll_result` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`poll_id` int(11) NOT NULL DEFAULT 0,
`choice` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `poll_id` (`poll_id`),
INDEX `choice` (`choice`)
) DEFAULT CHARSET=utf8;
@ -722,7 +790,7 @@ CREATE TABLE IF NOT EXISTS `poll_result` (
-- TABLE profile
--
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`profile-name` varchar(255) NOT NULL DEFAULT '',
`is-default` tinyint(1) NOT NULL DEFAULT 0,
@ -763,6 +831,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`thumb` varchar(255) NOT NULL DEFAULT '',
`publish` tinyint(1) NOT NULL DEFAULT 0,
`net-publish` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `hometown` (`hometown`)
) DEFAULT CHARSET=utf8;
@ -770,39 +839,42 @@ CREATE TABLE IF NOT EXISTS `profile` (
-- TABLE profile_check
--
CREATE TABLE IF NOT EXISTS `profile_check` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`cid` int(10) unsigned NOT NULL DEFAULT 0,
`dfrn_id` varchar(255) NOT NULL DEFAULT '',
`sec` varchar(255) NOT NULL DEFAULT '',
`expire` int(11) NOT NULL DEFAULT 0
`expire` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE push_subscriber
--
CREATE TABLE IF NOT EXISTS `push_subscriber` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`callback_url` varchar(255) NOT NULL DEFAULT '',
`topic` varchar(255) NOT NULL DEFAULT '',
`nickname` varchar(255) NOT NULL DEFAULT '',
`push` int(11) NOT NULL DEFAULT 0,
`last_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`secret` varchar(255) NOT NULL DEFAULT ''
`secret` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE queue
--
CREATE TABLE IF NOT EXISTS `queue` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`cid` int(11) NOT NULL DEFAULT 0,
`network` varchar(32) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`content` mediumtext NOT NULL,
`batch` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `cid` (`cid`),
INDEX `created` (`created`),
INDEX `last` (`last`),
@ -814,21 +886,23 @@ CREATE TABLE IF NOT EXISTS `queue` (
-- TABLE register
--
CREATE TABLE IF NOT EXISTS `register` (
`id` int(11) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(11) unsigned NOT NULL auto_increment,
`hash` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`uid` int(11) unsigned NOT NULL DEFAULT 0,
`password` varchar(255) NOT NULL DEFAULT '',
`language` varchar(16) NOT NULL DEFAULT ''
`language` varchar(16) NOT NULL DEFAULT '',
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE search
--
CREATE TABLE IF NOT EXISTS `search` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`term` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `term` (`term`)
) DEFAULT CHARSET=utf8;
@ -837,10 +911,11 @@ CREATE TABLE IF NOT EXISTS `search` (
-- TABLE session
--
CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` bigint(20) unsigned NOT NULL auto_increment,
`sid` varchar(255) NOT NULL DEFAULT '',
`data` text NOT NULL,
`expire` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
INDEX `sid` (`sid`),
INDEX `expire` (`expire`)
) DEFAULT CHARSET=utf8;
@ -849,12 +924,13 @@ CREATE TABLE IF NOT EXISTS `session` (
-- TABLE sign
--
CREATE TABLE IF NOT EXISTS `sign` (
`id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`id` int(10) unsigned NOT NULL auto_increment,
`iid` int(10) unsigned NOT NULL DEFAULT 0,
`retract_iid` int(10) unsigned NOT NULL DEFAULT 0,
`signed_text` mediumtext NOT NULL,
`signature` text NOT NULL,
`signer` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
INDEX `iid` (`iid`),
INDEX `retract_iid` (`retract_iid`)
) DEFAULT CHARSET=utf8;
@ -863,12 +939,13 @@ CREATE TABLE IF NOT EXISTS `sign` (
-- TABLE spam
--
CREATE TABLE IF NOT EXISTS `spam` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0,
`spam` int(11) NOT NULL DEFAULT 0,
`ham` int(11) NOT NULL DEFAULT 0,
`term` varchar(255) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`),
INDEX `uid` (`uid`),
INDEX `spam` (`spam`),
INDEX `ham` (`ham`),
@ -879,7 +956,7 @@ CREATE TABLE IF NOT EXISTS `spam` (
-- TABLE term
--
CREATE TABLE IF NOT EXISTS `term` (
`tid` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
`tid` int(10) unsigned NOT NULL auto_increment,
`oid` int(10) unsigned NOT NULL DEFAULT 0,
`otype` tinyint(3) unsigned NOT NULL DEFAULT 0,
`type` tinyint(3) unsigned NOT NULL DEFAULT 0,
@ -891,6 +968,7 @@ CREATE TABLE IF NOT EXISTS `term` (
`global` tinyint(1) NOT NULL DEFAULT 0,
`aid` int(10) unsigned NOT NULL DEFAULT 0,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY(`tid`),
INDEX `oid_otype_type_term` (`oid`,`otype`,`type`,`term`),
INDEX `uid_term_tid` (`uid`,`term`,`tid`),
INDEX `type_term` (`type`,`term`),
@ -903,9 +981,10 @@ CREATE TABLE IF NOT EXISTS `term` (
-- TABLE thread
--
CREATE TABLE IF NOT EXISTS `thread` (
`iid` int(10) unsigned NOT NULL DEFAULT 0 PRIMARY KEY,
`iid` int(10) unsigned NOT NULL DEFAULT 0,
`uid` int(10) unsigned NOT NULL DEFAULT 0,
`contact-id` int(11) unsigned NOT NULL DEFAULT 0,
`gcontact-id` int(11) unsigned NOT NULL DEFAULT 0,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@ -926,12 +1005,15 @@ CREATE TABLE IF NOT EXISTS `thread` (
`forum_mode` tinyint(1) NOT NULL DEFAULT 0,
`mention` tinyint(1) NOT NULL DEFAULT 0,
`network` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY(`iid`),
INDEX `created` (`created`),
INDEX `commented` (`commented`),
INDEX `uid_network_commented` (`uid`,`network`,`commented`),
INDEX `uid_network_created` (`uid`,`network`,`created`),
INDEX `uid_contactid_commented` (`uid`,`contact-id`,`commented`),
INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
INDEX `uid_gcontactid_commented` (`uid`,`gcontact-id`,`commented`),
INDEX `uid_gcontactid_created` (`uid`,`gcontact-id`,`created`),
INDEX `wall_private_received` (`wall`,`private`,`received`),
INDEX `uid_created` (`uid`,`created`),
INDEX `uid_commented` (`uid`,`commented`)
@ -941,33 +1023,20 @@ CREATE TABLE IF NOT EXISTS `thread` (
-- TABLE tokens
--
CREATE TABLE IF NOT EXISTS `tokens` (
`id` varchar(40) NOT NULL PRIMARY KEY,
`id` varchar(40) NOT NULL,
`secret` text NOT NULL,
`client_id` varchar(20) NOT NULL DEFAULT '',
`expires` int(11) NOT NULL DEFAULT 0,
`scope` varchar(200) NOT NULL DEFAULT '',
`uid` int(11) NOT NULL DEFAULT 0
) DEFAULT CHARSET=utf8;
--
-- TABLE unique_contacts
--
CREATE TABLE IF NOT EXISTS `unique_contacts` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`url` varchar(255) NOT NULL DEFAULT '',
`nick` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '',
`avatar` varchar(255) NOT NULL DEFAULT '',
`location` varchar(255) NOT NULL DEFAULT '',
`about` text NOT NULL,
INDEX `url` (`url`)
`uid` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8;
--
-- TABLE user
--
CREATE TABLE IF NOT EXISTS `user` (
`uid` int(11) NOT NULL auto_increment PRIMARY KEY,
`uid` int(11) NOT NULL auto_increment,
`guid` varchar(64) NOT NULL DEFAULT '',
`username` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
@ -1009,6 +1078,7 @@ CREATE TABLE IF NOT EXISTS `user` (
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
`openidserver` text NOT NULL,
PRIMARY KEY(`uid`),
INDEX `nickname` (`nickname`)
) DEFAULT CHARSET=utf8;
@ -1016,8 +1086,9 @@ CREATE TABLE IF NOT EXISTS `user` (
-- TABLE userd
--
CREATE TABLE IF NOT EXISTS `userd` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`username` varchar(255) NOT NULL,
PRIMARY KEY(`id`),
INDEX `username` (`username`)
) DEFAULT CHARSET=utf8;
@ -1025,12 +1096,13 @@ CREATE TABLE IF NOT EXISTS `userd` (
-- TABLE workerqueue
--
CREATE TABLE IF NOT EXISTS `workerqueue` (
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
`id` int(11) NOT NULL auto_increment,
`parameter` text NOT NULL,
`priority` tinyint(3) unsigned NOT NULL DEFAULT 0,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`pid` int(11) NOT NULL DEFAULT 0,
`executed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(`id`),
INDEX `created` (`created`)
) DEFAULT CHARSET=utf8;

View File

@ -24,6 +24,9 @@ You are not required to provide the year.
System settings
---
**Settings should be done in the admin panel** (/admin).
Those settings found in the database, will always override the settings added to the ``.htconfig.php`` file.
###Language
Please see util/README for information on creating language translations.
@ -219,6 +222,8 @@ LOGGER_DEBUG will show a good deal of information about system activity but will
You may also select LOGGER_ALL but due to the volume of information we recommend only enabling this when you are tracking down a specific problem.
Other log levels are possible but are not being used at the present time.
Please be aware that turning on the logging can fill up the disk space on your server relatively quick.
You should take preventions with e.g. [logrotate](https://en.wikipedia.org/wiki/Log_rotation) or similar tools.
###PHP error logging
@ -237,4 +242,6 @@ The vast majority of issues reported at these levels are completely harmless.
Please report to the developers any errors you encounter in the logs using the recommended settings above.
They generally indicate issues which need to be resolved.
If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred.
If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred.
*Note*: PHP logging cannot be activated from the admin panel but has to be configured from the ``.htconfig.php`` file.

View File

@ -38,6 +38,8 @@ Database Tables
| [manage](help/database/db_manage) | table of accounts that can "su" each other |
| [notify](help/database/db_notify) | notifications |
| [notify-threads](help/database/db_notify-threads) | |
| [oembed](help/database/db_oembed) | cache for OEmbed queries |
| [parsed_url](help/database/db_parsed_url) | cache for "parse_url" queries |
| [pconfig](help/database/db_pconfig) | personal (per user) configuration storage |
| [photo](help/database/db_photo) | photo storage |
| [poll](help/database/db_poll) | data for polls |
@ -54,7 +56,6 @@ Database Tables
| [term](help/database/db_term) | item taxonomy (categories, tags, etc.) table |
| [thread](help/database/db_thread) | |
| [tokens](help/database/db_tokens) | OAuth usage |
| [unique_contacts](help/database/db_unique_contacts) | |
| [user](help/database/db_user) | local user table |
| [userd](help/database/db_userd) | |
| [workerqueue](help/database/db_workerqueue) | |

View File

@ -18,9 +18,14 @@ Table gcontact
| about | | text | NO | | NULL | |
| keywords | puplic keywords (interests) | text | NO | | NULL | |
| gender | | varchar(32) | NO | | | |
| birthday | | varchar(32) | NO | | 0000-00-00 | |
| community | 1 if contact is forum account | tinyint(1) | NO | | 0 | |
| hide | 1 = should be hidden from search | tinyint(1) | NO | | 0 | |
| nsfw | 1 = contact posts nsfw content | tinyint(1) | NO | | 0 | |
| network | social network protocol | varchar(255) | NO | | | |
| addr | | varchar(255) | NO | | | |
| notify | | text | NO | | | |
| alias | | varchar(255) | NO | | | |
| generation | | tinyint(3) | NO | | 0 | |
| server_url | baseurl of the contacts server | varchar(255) | NO | | | |

View File

@ -8,6 +8,7 @@ Table item
| uri | | varchar(255) | NO | MUL | | |
| uid | user.id which owns this copy of the item | int(10) unsigned | NO | MUL | 0 | |
| contact-id | contact.id | int(11) | NO | MUL | 0 | |
| gcontact-id | ID of the global contact | int(11) | NO | MUL | 0 | |
| type | | varchar(255) | NO | | | |
| wall | This item was posted to the wall of uid | tinyint(1) | NO | MUL | 0 | |
| gravity | | tinyint(1) | NO | | 0 | |

10
doc/database/db_oembed.md Normal file
View File

@ -0,0 +1,10 @@
Table oembed
============
| Field | Description | Type | Null | Key | Default | Extra |
| ------------ | ---------------------------------- | ------------ | ---- | --- | ------------------- | ----- |
| url | page url | varchar(255) | NO | PRI | NULL | |
| content | OEmbed data of the page | text | NO | | NULL | |
| created | datetime of creation | datetime | NO | MUL | 0000-00-00 00:00:00 | |
Return to [database documentation](help/database)

View File

@ -0,0 +1,12 @@
Table parsed_url
================
| Field | Description | Type | Null | Key | Default | Extra |
| ------------ | ---------------------------------- | ------------ | ---- | --- | ------------------- | ----- |
| url | page url | varchar(255) | NO | PRI | NULL | |
| guessing | is the "guessing" mode active? | tinyint(1) | NO | PRI | 0 | |
| oembed | is the data the result of oembed? | tinyint(1) | NO | PRI | 0 | |
| content | page data | text | NO | | NULL | |
| created | datetime of creation | datetime | NO | MUL | 0000-00-00 00:00:00 | |
Return to [database documentation](help/database)

View File

@ -1,30 +1,31 @@
Table thread
============
| Field | Description | Type | Null | Key | Default | Extra |
|------------|------------------|------------------|------|-----|---------------------|-------|
| iid | sequential ID | int(10) unsigned | NO | PRI | 0 | |
| uid | | int(10) unsigned | NO | MUL | 0 | |
| contact-id | | int(11) unsigned | NO | | 0 | |
| created | | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| edited | | datetime | NO | | 0000-00-00 00:00:00 | |
| commented | | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| received | | datetime | NO | | 0000-00-00 00:00:00 | |
| changed | | datetime | NO | | 0000-00-00 00:00:00 | |
| wall | | tinyint(1) | NO | MUL | 0 | |
| private | | tinyint(1) | NO | | 0 | |
| pubmail | | tinyint(1) | NO | | 0 | |
| moderated | | tinyint(1) | NO | | 0 | |
| visible | | tinyint(1) | NO | | 0 | |
| spam | | tinyint(1) | NO | | 0 | |
| starred | | tinyint(1) | NO | | 0 | |
| ignored | | tinyint(1) | NO | | 0 | |
| bookmark | | tinyint(1) | NO | | 0 | |
| unseen | | tinyint(1) | NO | | 1 | |
| deleted | | tinyint(1) | NO | | 0 | |
| origin | | tinyint(1) | NO | | 0 | |
| forum_mode | | tinyint(1) | NO | | 0 | |
| mention | | tinyint(1) | NO | | 0 | |
| network | | varchar(32) | NO | | | |
| Field | Description | Type | Null | Key | Default | Extra |
|-------------|------------------|------------------|------|-----|---------------------|-------|
| iid | sequential ID | int(10) unsigned | NO | PRI | 0 | |
| uid | | int(10) unsigned | NO | MUL | 0 | |
| contact-id | | int(11) unsigned | NO | | 0 | |
| gcontact-id | Global Contact | int(11) unsigned | NO | | 0 | |
| created | | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| edited | | datetime | NO | | 0000-00-00 00:00:00 | |
| commented | | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| received | | datetime | NO | | 0000-00-00 00:00:00 | |
| changed | | datetime | NO | | 0000-00-00 00:00:00 | |
| wall | | tinyint(1) | NO | MUL | 0 | |
| private | | tinyint(1) | NO | | 0 | |
| pubmail | | tinyint(1) | NO | | 0 | |
| moderated | | tinyint(1) | NO | | 0 | |
| visible | | tinyint(1) | NO | | 0 | |
| spam | | tinyint(1) | NO | | 0 | |
| starred | | tinyint(1) | NO | | 0 | |
| ignored | | tinyint(1) | NO | | 0 | |
| bookmark | | tinyint(1) | NO | | 0 | |
| unseen | | tinyint(1) | NO | | 1 | |
| deleted | | tinyint(1) | NO | | 0 | |
| origin | | tinyint(1) | NO | | 0 | |
| forum_mode | | tinyint(1) | NO | | 0 | |
| mention | | tinyint(1) | NO | | 0 | |
| network | | varchar(32) | NO | | | |
Return to [database documentation](help/database)

View File

@ -1,14 +0,0 @@
Table unique_contacts
=====================
| Field | Description | Type | Null | Key | Default | Extra |
|----------|------------------|--------------|------|-----|---------|----------------|
| id | sequential ID | int(11) | NO | PRI | NULL | auto_increment |
| url | | varchar(255) | NO | MUL | | |
| nick | | varchar(255) | NO | | | |
| name | | varchar(255) | NO | | | |
| avatar | | varchar(255) | NO | | | |
| location | | varchar(255) | NO | | | |
| about | | text | NO | | NULL | |
Return to [database documentation](help/database)

View File

@ -1657,35 +1657,6 @@ LOCK TABLES `tokens` WRITE;
/*!40000 ALTER TABLE `tokens` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `unique_contacts`
--
DROP TABLE IF EXISTS `unique_contacts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `unique_contacts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL DEFAULT '',
`nick` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '',
`avatar` varchar(255) NOT NULL DEFAULT '',
`location` varchar(255) NOT NULL DEFAULT '',
`about` text NOT NULL,
PRIMARY KEY (`id`),
KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `unique_contacts`
--
LOCK TABLES `unique_contacts` WRITE;
/*!40000 ALTER TABLE `unique_contacts` DISABLE KEYS */;
/*!40000 ALTER TABLE `unique_contacts` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `user`
--

View File

@ -57,7 +57,7 @@ $a->config['system']['huburl'] = '[internal]';
// allowed themes (change this from admin panel after installation)
$a->config['system']['allowed_themes'] = 'dispy,quattro,vier,darkzero,duepuntozero,greenzero,purplezero,slackr,diabook';
$a->config['system']['allowed_themes'] = 'quattro,vier,duepuntozero';
// default system theme

View File

@ -205,59 +205,46 @@ function get_contact_details_by_url($url, $uid = -1) {
if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND
in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)))
proc_run('php',"include/update_gcontact.php", $profile["gid"]);
} else {
$r = q("SELECT `url`, `name`, `nick`, `avatar` AS `photo`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'",
dbesc(normalise_link($url)));
if (count($r)) {
$profile = $r[0];
$profile["keywords"] = "";
$profile["gender"] = "";
$profile["community"] = false;
$profile["network"] = "";
$profile["addr"] = "";
}
}
// Fetching further contact data from the contact table
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` = '%s'",
dbesc(normalise_link($url)), intval($uid), dbesc($profile["network"]));
if (!count($r))
if (!count($r) AND !isset($profile))
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
dbesc(normalise_link($url)), intval($uid));
if (!count($r))
if (!count($r) AND !isset($profile))
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
dbesc(normalise_link($url)));
if ($r) {
if (isset($r[0]["url"]) AND $r[0]["url"])
if (!isset($profile["url"]) AND $r[0]["url"])
$profile["url"] = $r[0]["url"];
if (isset($r[0]["name"]) AND $r[0]["name"])
if (!isset($profile["name"]) AND $r[0]["name"])
$profile["name"] = $r[0]["name"];
if (isset($r[0]["nick"]) AND $r[0]["nick"] AND ($profile["nick"] == ""))
if (!isset($profile["nick"]) AND $r[0]["nick"])
$profile["nick"] = $r[0]["nick"];
if (isset($r[0]["addr"]) AND $r[0]["addr"] AND ($profile["addr"] == ""))
if (!isset($profile["addr"]) AND $r[0]["addr"])
$profile["addr"] = $r[0]["addr"];
if (isset($r[0]["photo"]) AND $r[0]["photo"])
if (!isset($profile["photo"]) AND $r[0]["photo"])
$profile["photo"] = $r[0]["photo"];
if (isset($r[0]["location"]) AND $r[0]["location"])
if (!isset($profile["location"]) AND $r[0]["location"])
$profile["location"] = $r[0]["location"];
if (isset($r[0]["about"]) AND $r[0]["about"])
if (!isset($profile["about"]) AND $r[0]["about"])
$profile["about"] = $r[0]["about"];
if (isset($r[0]["keywords"]) AND $r[0]["keywords"])
if (!isset($profile["keywords"]) AND $r[0]["keywords"])
$profile["keywords"] = $r[0]["keywords"];
if (isset($r[0]["gender"]) AND $r[0]["gender"])
if (!isset($profile["gender"]) AND $r[0]["gender"])
$profile["gender"] = $r[0]["gender"];
if (isset($r[0]["forum"]) OR isset($r[0]["prv"]))
$profile["community"] = ($r[0]["forum"] OR $r[0]["prv"]);
if (isset($r[0]["network"]) AND $r[0]["network"])
if (!isset($profile["network"]) AND $r[0]["network"])
$profile["network"] = $r[0]["network"];
if (isset($r[0]["addr"]) AND $r[0]["addr"])
if (!isset($profile["addr"]) AND $r[0]["addr"])
$profile["addr"] = $r[0]["addr"];
if (isset($r[0]["bd"]) AND $r[0]["bd"])
if (!isset($profile["bd"]) AND $r[0]["bd"])
$profile["bd"] = $r[0]["bd"];
if ($r[0]["uid"] == 0)
$profile["cid"] = 0;
@ -415,6 +402,7 @@ function get_contact($url, $uid = 0) {
$contactid = 0;
// is it an address in the format user@server.tld?
/// @todo use gcontact and/or the addr field for a lookup
if (!strstr($url, "http") OR strstr($url, "@")) {
$data = probe_url($url);
$url = $data["url"];
@ -513,3 +501,165 @@ function get_contact($url, $uid = 0) {
return $contactid;
}
/**
* @brief Returns posts from a given gcontact
*
* @param App $a argv application class
* @param int $gcontact_id Global contact
*
* @return string posts in HTML
*/
function posts_from_gcontact($a, $gcontact_id) {
require_once('include/conversation.php');
// There are no posts with "uid = 0" with connector networks
// This speeds up the query a lot
$r = q("SELECT `network` FROM `gcontact` WHERE `id` = %d", dbesc($gcontact_id));
if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, "")))
$sql = "(`item`.`uid` = 0 OR (`item`.`uid` = %d AND `item`.`private`))";
else
$sql = "`item`.`uid` = %d";
if(get_config('system', 'old_pager')) {
$r = q("SELECT COUNT(*) AS `total` FROM `item`
WHERE `gcontact-id` = %d and $sql",
intval($gcontact_id),
intval(local_user()));
$a->set_pager_total($r[0]['total']);
}
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
`author-name` AS `name`, `owner-avatar` AS `photo`,
`owner-link` AS `url`, `owner-avatar` AS `thumb`
FROM `item` FORCE INDEX (`gcontactid_uid_created`)
WHERE `gcontact-id` = %d AND $sql AND
NOT `deleted` AND NOT `moderated` AND `visible`
ORDER BY `item`.`created` DESC LIMIT %d, %d",
intval($gcontact_id),
intval(local_user()),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
$o = conversation($a,$r,'community',false);
if(!get_config('system', 'old_pager')) {
$o .= alt_pager($a,count($r));
} else {
$o .= paginate($a);
}
return $o;
}
/**
* @brief set the gcontact-id in all item entries
*
* This job has to be started multiple times until all entries are set.
* It isn't started in the update function since it would consume too much time and can be done in the background.
*/
function item_set_gcontact() {
define ('POST_UPDATE_VERSION', 1192);
// Was the script completed?
if (get_config("system", "post_update_version") >= POST_UPDATE_VERSION)
return;
// Check if the first step is done (Setting "gcontact-id" in the item table)
$r = q("SELECT `author-link`, `author-name`, `author-avatar`, `uid`, `network` FROM `item` WHERE `gcontact-id` = 0 LIMIT 1000");
if (!$r) {
// Are there unfinished entries in the thread table?
$r = q("SELECT COUNT(*) AS `total` FROM `thread`
INNER JOIN `item` ON `item`.`id` =`thread`.`iid`
WHERE `thread`.`gcontact-id` = 0 AND
(`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)");
if ($r AND ($r[0]["total"] == 0)) {
set_config("system", "post_update_version", POST_UPDATE_VERSION);
return false;
}
// Update the thread table from the item table
q("UPDATE `thread` INNER JOIN `item` ON `item`.`id`=`thread`.`iid`
SET `thread`.`gcontact-id` = `item`.`gcontact-id`
WHERE `thread`.`gcontact-id` = 0 AND
(`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)");
return false;
}
$item_arr = array();
foreach ($r AS $item) {
$index = $item["author-link"]."-".$item["uid"];
$item_arr[$index] = array("author-link" => $item["author-link"],
"uid" => $item["uid"],
"network" => $item["network"]);
}
// Set the "gcontact-id" in the item table and add a new gcontact entry if needed
foreach($item_arr AS $item) {
$gcontact_id = get_gcontact_id(array("url" => $item['author-link'], "network" => $item['network'],
"photo" => $item['author-avatar'], "name" => $item['author-name']));
q("UPDATE `item` SET `gcontact-id` = %d WHERE `uid` = %d AND `author-link` = '%s' AND `gcontact-id` = 0",
intval($gcontact_id), intval($item["uid"]), dbesc($item["author-link"]));
}
return true;
}
/**
* @brief Returns posts from a given contact
*
* @param App $a argv application class
* @param int $contact_id contact
*
* @return string posts in HTML
*/
function posts_from_contact($a, $contact_id) {
require_once('include/conversation.php');
$r = q("SELECT `url` FROM `contact` WHERE `id` = %d", intval($contact_id));
if (!$r)
return false;
$contact = $r[0];
if(get_config('system', 'old_pager')) {
$r = q("SELECT COUNT(*) AS `total` FROM `item`
WHERE `item`.`uid` = %d AND `author-link` IN ('%s', '%s')",
intval(local_user()),
dbesc(str_replace("https://", "http://", $contact["url"])),
dbesc(str_replace("http://", "https://", $contact["url"])));
$a->set_pager_total($r[0]['total']);
}
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
`author-name` AS `name`, `owner-avatar` AS `photo`,
`owner-link` AS `url`, `owner-avatar` AS `thumb`
FROM `item` FORCE INDEX (`uid_contactid_created`)
WHERE `item`.`uid` = %d AND `contact-id` = %d
AND `author-link` IN ('%s', '%s')
AND NOT `deleted` AND NOT `moderated` AND `visible`
ORDER BY `item`.`created` DESC LIMIT %d, %d",
intval(local_user()),
intval($contact_id),
dbesc(str_replace("https://", "http://", $contact["url"])),
dbesc(str_replace("http://", "https://", $contact["url"])),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
$o .= conversation($a,$r,'community',false);
if(!get_config('system', 'old_pager'))
$o .= alt_pager($a,count($r));
else
$o .= paginate($a);
return $o;
}
?>

View File

@ -792,15 +792,19 @@ function get_photo_info($url) {
$filesize = strlen($img_str);
$tempfile = tempnam(get_temppath(), "cache");
if (function_exists("getimagesizefromstring"))
$data = getimagesizefromstring($img_str);
else {
$tempfile = tempnam(get_temppath(), "cache");
$a = get_app();
$stamp1 = microtime(true);
file_put_contents($tempfile, $img_str);
$a->save_timestamp($stamp1, "file");
$a = get_app();
$stamp1 = microtime(true);
file_put_contents($tempfile, $img_str);
$a->save_timestamp($stamp1, "file");
$data = getimagesize($tempfile);
unlink($tempfile);
$data = getimagesize($tempfile);
unlink($tempfile);
}
if ($data)
$data["size"] = $filesize;

View File

@ -559,10 +559,11 @@ function probe_url($url, $mode = PROBE_NORMAL, $level = 1) {
$pubkey = $hcard_key;
}
}
if($diaspora && $diaspora_base && $diaspora_guid) {
if($mode == PROBE_DIASPORA || ! $notify) {
$notify = $diaspora_base . 'receive/users/' . $diaspora_guid;
$diaspora_notify = $diaspora_base.'receive/users/'.$diaspora_guid;
if($mode == PROBE_DIASPORA || ! $notify || ($notify == $diaspora_notify)) {
$notify = $diaspora_notify;
$batch = $diaspora_base . 'receive/public' ;
}
if(strpos($url,'@'))

View File

@ -20,7 +20,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" >\r\n";
$r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
$r = q("SELECT `id`, `name` FROM `group` WHERE NOT `deleted` AND `uid` = %d ORDER BY `name` ASC",
intval(local_user())
);
@ -309,7 +309,7 @@ function populate_acl($user = null, $show_jotnets = false) {
$pubmail_enabled = false;
if(! $mail_disabled) {
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
$r = q("SELECT `pubmail` FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
intval(local_user())
);
if(count($r)) {
@ -407,7 +407,7 @@ function acl_lookup(&$a, $out_type = 'json') {
$search = $_REQUEST['query'];
}
// logger("Searching for ".$search." - type ".$type, LOGGER_DEBUG);
logger("Searching for ".$search." - type ".$type, LOGGER_DEBUG);
if ($search!=""){
$sql_extra = "AND `name` LIKE '%%".dbesc($search)."%%'";
@ -503,7 +503,7 @@ function acl_lookup(&$a, $out_type = 'json') {
}
}
if ($type=='' || $type=='c'){
if ($type==''){
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
@ -514,6 +514,17 @@ function acl_lookup(&$a, $out_type = 'json') {
dbesc(NETWORK_OSTATUS), dbesc(NETWORK_STATUSNET)
);
}
elseif ($type=='c'){
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
AND NOT (`network` IN ('%s'))
$sql_extra2
ORDER BY `name` ASC ",
intval(local_user()),
dbesc(NETWORK_STATUSNET)
);
}
elseif($type == 'm') {
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0

View File

@ -393,7 +393,7 @@
* Contact url or False if contact id is unknown
*/
function api_unique_id_to_url($id){
$r = q("SELECT `url` FROM `unique_contacts` WHERE `id`=%d LIMIT 1",
$r = q("SELECT `url` FROM `gcontact` WHERE `id`=%d LIMIT 1",
intval($id));
if ($r)
return ($r[0]["url"]);
@ -503,9 +503,7 @@
$r = array();
if ($url != "")
$r = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", $url);
elseif ($nick != "")
$r = q("SELECT * FROM `unique_contacts` WHERE `nick`='%s' LIMIT 1", $nick);
$r = q("SELECT * FROM `gcontact` WHERE `nurl`='%s' LIMIT 1", dbesc(normalise_link($url)));
if ($r) {
// If no nick where given, extract it from the address
@ -517,14 +515,14 @@
'id_str' => (string) $r[0]["id"],
'name' => $r[0]["name"],
'screen_name' => (($r[0]['nick']) ? $r[0]['nick'] : $r[0]['name']),
'location' => NULL,
'description' => NULL,
'location' => $r[0]["location"],
'description' => $r[0]["about"],
'url' => $r[0]["url"],
'protected' => false,
'followers_count' => 0,
'friends_count' => 0,
'listed_count' => 0,
'created_at' => api_date(0),
'created_at' => api_date($r[0]["created"]),
'favourites_count' => 0,
'utc_offset' => 0,
'time_zone' => 'UTC',
@ -535,8 +533,8 @@
'contributors_enabled' => false,
'is_translator' => false,
'is_translation_enabled' => false,
'profile_image_url' => $r[0]["avatar"],
'profile_image_url_https' => $r[0]["avatar"],
'profile_image_url' => $r[0]["photo"],
'profile_image_url_https' => $r[0]["photo"],
'following' => false,
'follow_request_sent' => false,
'notifications' => false,
@ -546,7 +544,7 @@
'uid' => 0,
'cid' => 0,
'self' => 0,
'network' => '',
'network' => $r[0]["network"],
);
return $ret;
@ -617,22 +615,14 @@
$uinfo[0]['nick'] = api_get_nick($uinfo[0]["url"]);
}
// Fetching unique id
$r = q("SELECT id FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
// If not there, then add it
if (count($r) == 0) {
q("INSERT INTO `unique_contacts` (`url`, `name`, `nick`, `avatar`) VALUES ('%s', '%s', '%s', '%s')",
dbesc(normalise_link($uinfo[0]['url'])), dbesc($uinfo[0]['name']),dbesc($uinfo[0]['nick']), dbesc($uinfo[0]['micro']));
$r = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
}
$network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']);
$gcontact_id = get_gcontact_id(array("url" => $uinfo[0]['url'], "network" => $uinfo[0]['network'],
"photo" => $uinfo[0]['micro'], "name" => $uinfo[0]['name']));
$ret = Array(
'id' => intval($r[0]['id']),
'id_str' => (string) intval($r[0]['id']),
'id' => intval($gcontact_id),
'id_str' => (string) intval($gcontact_id),
'name' => (($uinfo[0]['name']) ? $uinfo[0]['name'] : $uinfo[0]['nick']),
'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']),
'location' => ($usr) ? $usr[0]['default-location'] : $network_name,
@ -666,45 +656,12 @@
function api_item_get_user(&$a, $item) {
$author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
dbesc(normalise_link($item['author-link'])));
// Make sure that there is an entry in the global contacts for author and owner
get_gcontact_id(array("url" => $item['author-link'], "network" => $item['network'],
"photo" => $item['author-avatar'], "name" => $item['author-name']));
if (count($author) == 0) {
q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')",
dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"]));
$author = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
dbesc(normalise_link($item['author-link'])));
} else if ($item["author-link"].$item["author-name"] != $author[0]["url"].$author[0]["name"]) {
$r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'",
dbesc($item["author-name"]), dbesc($item["author-avatar"]),
dbesc(normalise_link($item["author-link"])));
if (!$r)
q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'",
dbesc($item["author-name"]), dbesc($item["author-avatar"]),
dbesc(normalise_link($item["author-link"])));
}
$owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
dbesc(normalise_link($item['owner-link'])));
if (count($owner) == 0) {
q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')",
dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"]));
$owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
dbesc(normalise_link($item['owner-link'])));
} else if ($item["owner-link"].$item["owner-name"] != $owner[0]["url"].$owner[0]["name"]) {
$r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'",
dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
dbesc(normalise_link($item["owner-link"])));
if (!$r)
q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'",
dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
dbesc(normalise_link($item["owner-link"])));
}
get_gcontact_id(array("url" => $item['owner-link'], "network" => $item['network'],
"photo" => $item['owner-avatar'], "name" => $item['owner-name']));
// Comments in threads may appear as wall-to-wall postings.
// So only take the owner at the top posting.
@ -1073,7 +1030,7 @@
$in_reply_to_status_id= intval($lastwall['parent']);
$in_reply_to_status_id_str = (string) intval($lastwall['parent']);
$r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
$r = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
if ($r) {
if ($r[0]['nick'] == "")
$r[0]['nick'] = api_get_nick($r[0]["url"]);
@ -1195,7 +1152,7 @@
$in_reply_to_status_id = intval($lastwall['parent']);
$in_reply_to_status_id_str = (string) intval($lastwall['parent']);
$r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
$r = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
if ($r) {
if ($r[0]['nick'] == "")
$r[0]['nick'] = api_get_nick($r[0]["url"]);
@ -1256,9 +1213,9 @@
$userlist = array();
if (isset($_GET["q"])) {
$r = q("SELECT id FROM `unique_contacts` WHERE `name`='%s'", dbesc($_GET["q"]));
$r = q("SELECT id FROM `gcontact` WHERE `name`='%s'", dbesc($_GET["q"]));
if (!count($r))
$r = q("SELECT `id` FROM `unique_contacts` WHERE `nick`='%s'", dbesc($_GET["q"]));
$r = q("SELECT `id` FROM `gcontact` WHERE `nick`='%s'", dbesc($_GET["q"]));
if (count($r)) {
foreach ($r AS $user) {
@ -2341,7 +2298,7 @@
intval(api_user()),
intval($in_reply_to_status_id));
if ($r) {
$r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
$r = q("SELECT * FROM `gcontact` WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
if ($r) {
if ($r[0]['nick'] == "")
@ -2596,7 +2553,7 @@
$stringify_ids = (x($_REQUEST,'stringify_ids')?$_REQUEST['stringify_ids']:false);
$r = q("SELECT `unique_contacts`.`id` FROM `contact`, `unique_contacts` WHERE `contact`.`nurl` = `unique_contacts`.`url` AND `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` $sql_extra",
$r = q("SELECT `gcontact`.`id` FROM `contact`, `gcontact` WHERE `contact`.`nurl` = `gcontact`.`nurl` AND `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` $sql_extra",
intval(api_user())
);
@ -3094,11 +3051,8 @@
//}
if ($nick != "") {
q("UPDATE `unique_contacts` SET `nick` = '%s' WHERE `nick` != '%s' AND url = '%s'",
dbesc($nick), dbesc($nick), dbesc(normalise_link($profile)));
if ($nick != "")
return($nick);
}
return(false);
}

View File

@ -3,6 +3,7 @@ require_once("include/oembed.php");
require_once('include/event.php');
require_once('include/map.php');
require_once('mod/proxy.php');
require_once('include/Contact.php');
function bb_PictureCacheExt($matches) {
if (strpos($matches[3], "data:image/") === 0)
@ -541,8 +542,23 @@ function bb_ShareAttributes($share, $simplehtml) {
$reldate = (($posted) ? " " . relative_date($posted) : '');
}
$userid = GetProfileUsername($profile,$author, false);
$userid_compact = GetProfileUsername($profile,$author, true);
$data = get_contact_details_by_url($profile);
if (isset($data["name"]) AND isset($data["addr"]))
$userid_compact = $data["name"]." (".$data["addr"].")";
else
$userid_compact = GetProfileUsername($profile,$author, true);
if (isset($data["addr"]))
$userid = $data["addr"];
else
$userid = GetProfileUsername($profile,$author, false);
if (isset($data["name"]))
$author = $data["name"];
if (isset($data["photo"]))
$avatar = $data["photo"];
$preshare = trim($share[1]);

View File

@ -19,7 +19,7 @@ if(! function_exists('load_config')) {
function load_config($family) {
global $a;
$r = q("SELECT * FROM `config` WHERE `cat` = '%s'", dbesc($family));
$r = q("SELECT `v`, `k` FROM `config` WHERE `cat` = '%s'", dbesc($family));
if(count($r)) {
foreach($r as $rr) {
$k = $rr['k'];
@ -170,7 +170,7 @@ function set_config($family,$key,$value) {
if(! function_exists('load_pconfig')) {
function load_pconfig($uid,$family) {
global $a;
$r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
$r = q("SELECT `v`,`k` FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
dbesc($family),
intval($uid)
);

View File

@ -811,16 +811,16 @@ function best_link_url($item,&$sparkle,$ssl_state = false) {
if((local_user()) && (local_user() == $item['uid'])) {
if(isset($a->contacts) && x($a->contacts,$clean_url)) {
if($a->contacts[$clean_url]['network'] === NETWORK_DFRN) {
$best_url = $a->get_baseurl($ssl_state) . '/redir/' . $a->contacts[$clean_url]['id'];
$best_url = 'redir/'.$a->contacts[$clean_url]['id'];
$sparkle = true;
} else
$best_url = $a->contacts[$clean_url]['url'];
}
} elseif (local_user()) {
$r = q("SELECT `id`, `network` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `nurl` = '%s'",
$r = q("SELECT `id` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `nurl` = '%s' LIMIT 1",
dbesc(NETWORK_DFRN), intval(local_user()), dbesc(normalise_link($clean_url)));
if ($r) {
$best_url = $a->get_baseurl($ssl_state).'/redir/'.$r[0]['id'];
$best_url = 'redir/'.$r[0]['id'];
$sparkle = true;
}
}
@ -876,7 +876,7 @@ function item_photo_menu($item){
if(local_user() && local_user() == $item['uid'] && link_compare($item['url'],$item['author-link'])) {
$cid = $item['contact-id'];
} else {
$r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' ORDER BY `uid` DESC LIMIT 1",
$r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1",
intval(local_user()), dbesc(normalise_link($item['author-link'])));
if ($r) {
$cid = $r[0]["id"];

View File

@ -133,9 +133,8 @@ function cron_run(&$argv, &$argc){
// Check every conversation
check_conversations(false);
// Follow your friends from your legacy OStatus account
// Doesn't work
// ostatus_check_follow_friends();
// Set the gcontact-id in the item table if missing
item_set_gcontact();
// update nodeinfo data
nodeinfo_cron();
@ -159,75 +158,11 @@ function cron_run(&$argv, &$argc){
proc_run('php','include/expire.php');
}
$last = get_config('system','cache_last_cleared');
// Clear cache entries
cron_clear_cache($a);
if($last) {
$next = $last + (3600); // Once per hour
$clear_cache = ($next <= time());
} else
$clear_cache = true;
if ($clear_cache) {
// clear old cache
Cache::clear();
// clear old item cache files
clear_cache();
// clear cache for photos
clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
// clear smarty cache
clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
// clear cache for image proxy
if (!get_config("system", "proxy_disabled")) {
clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
$cachetime = get_config('system','proxy_cache_time');
if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
}
// Maximum table size in megabyte
$max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000;
if ($max_tablesize == 0)
$max_tablesize = 100 * 1000000; // Default are 100 MB
// Minimum fragmentation level in percent
$fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100;
if ($fragmentation_level == 0)
$fragmentation_level = 0.3; // Default value is 30%
// Optimize some tables that need to be optimized
$r = q("SHOW TABLE STATUS");
foreach($r as $table) {
// Don't optimize tables that are too large
if ($table["Data_length"] > $max_tablesize)
continue;
// Don't optimize empty tables
if ($table["Data_length"] == 0)
continue;
// Calculate fragmentation
$fragmentation = $table["Data_free"] / $table["Data_length"];
logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG);
// Don't optimize tables that needn't to be optimized
if ($fragmentation < $fragmentation_level)
continue;
// So optimize it
logger("Optimize Table ".$table["Name"], LOGGER_DEBUG);
q("OPTIMIZE TABLE `%s`", dbesc($table["Name"]));
}
set_config('system','cache_last_cleared', time());
}
// Repair missing Diaspora values in contacts
cron_repair_diaspora($a);
$manual_id = 0;
$generation = 0;
@ -373,6 +308,115 @@ function cron_run(&$argv, &$argc){
return;
}
/**
* @brief Clear cache entries
*
* @param App $a
*/
function cron_clear_cache(&$a) {
$last = get_config('system','cache_last_cleared');
if($last) {
$next = $last + (3600); // Once per hour
$clear_cache = ($next <= time());
} else
$clear_cache = true;
if (!$clear_cache)
return;
// clear old cache
Cache::clear();
// clear old item cache files
clear_cache();
// clear cache for photos
clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
// clear smarty cache
clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
// clear cache for image proxy
if (!get_config("system", "proxy_disabled")) {
clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
$cachetime = get_config('system','proxy_cache_time');
if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
}
// Delete the cached OEmbed entries that are older than one year
q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 1 YEAR");
// Delete the cached "parse_url" entries that are older than one year
q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 1 YEAR");
// Maximum table size in megabyte
$max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000;
if ($max_tablesize == 0)
$max_tablesize = 100 * 1000000; // Default are 100 MB
// Minimum fragmentation level in percent
$fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100;
if ($fragmentation_level == 0)
$fragmentation_level = 0.3; // Default value is 30%
// Optimize some tables that need to be optimized
$r = q("SHOW TABLE STATUS");
foreach($r as $table) {
// Don't optimize tables that are too large
if ($table["Data_length"] > $max_tablesize)
continue;
// Don't optimize empty tables
if ($table["Data_length"] == 0)
continue;
// Calculate fragmentation
$fragmentation = $table["Data_free"] / $table["Data_length"];
logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG);
// Don't optimize tables that needn't to be optimized
if ($fragmentation < $fragmentation_level)
continue;
// So optimize it
logger("Optimize Table ".$table["Name"], LOGGER_DEBUG);
q("OPTIMIZE TABLE `%s`", dbesc($table["Name"]));
}
set_config('system','cache_last_cleared', time());
}
/**
* @brief Repair missing values in Diaspora contacts
*
* @param App $a
*/
function cron_repair_diaspora(&$a) {
$r = q("SELECT `id`, `url` FROM `contact`
WHERE `network` = '%s' AND (`batch` = '' OR `notify` = '' OR `poll` = '' OR pubkey = '')
ORDER BY RAND() LIMIT 50", dbesc(NETWORK_DIASPORA));
if ($r) {
foreach ($r AS $contact) {
if (poco_reachable($contact["url"])) {
$data = probe_url($contact["url"]);
if ($data["network"] == NETWORK_DIASPORA) {
logger("Repair contact ".$contact["id"]." ".$contact["url"], LOGGER_DEBUG);
q("UPDATE `contact` SET `batch` = '%s', `notify` = '%s', `poll` = '%s', pubkey = '%s' WHERE `id` = %d",
dbesc($data["batch"]), dbesc($data["notify"]), dbesc($data["poll"]), dbesc($data["pubkey"]),
intval($contact["id"]));
}
}
}
}
}
if (array_search(__file__,get_included_files())===0){
cron_run($_SERVER["argv"],$_SERVER["argc"]);
killme();

View File

@ -666,9 +666,14 @@ function db_definition() {
"about" => array("type" => "text", "not null" => "1"),
"keywords" => array("type" => "text", "not null" => "1"),
"gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"birthday" => array("type" => "varchar(32)", "not null" => "1", "default" => "0000-00-00"),
"community" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"hide" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"nsfw" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"network" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"addr" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"notify" => array("type" => "text", "not null" => "1"),
"alias" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"generation" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"),
"server_url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
),
@ -795,6 +800,7 @@ function db_definition() {
"uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"),
"contact-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"type" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"wall" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"gravity" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
@ -871,6 +877,7 @@ function db_definition() {
"uid_thrparent" => array("uid","thr-parent"),
"uid_parenturi" => array("uid","parent-uri"),
"uid_contactid_created" => array("uid","contact-id","created"),
"gcontactid_uid_created" => array("gcontact-id","uid","created"),
"wall_body" => array("wall","body(6)"),
"uid_visible_moderated_created" => array("uid","visible","moderated","created"),
"uid_uri" => array("uid","uri"),
@ -1014,6 +1021,30 @@ function db_definition() {
"receiver-uid" => array("receiver-uid"),
)
);
$database["oembed"] = array(
"fields" => array(
"url" => array("type" => "varchar(255)", "not null" => "1", "primary" => "1"),
"content" => array("type" => "text", "not null" => "1"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
),
"indexes" => array(
"PRIMARY" => array("url"),
"created" => array("created"),
)
);
$database["parsed_url"] = array(
"fields" => array(
"url" => array("type" => "varchar(255)", "not null" => "1", "primary" => "1"),
"guessing" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0", "primary" => "1"),
"oembed" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0", "primary" => "1"),
"content" => array("type" => "text", "not null" => "1"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
),
"indexes" => array(
"PRIMARY" => array("url", "guessing", "oembed"),
"created" => array("created"),
)
);
$database["pconfig"] = array(
"fields" => array(
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
@ -1287,6 +1318,7 @@ function db_definition() {
"iid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0", "primary" => "1"),
"uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"),
"contact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
"commented" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
@ -1316,6 +1348,8 @@ function db_definition() {
"uid_network_created" => array("uid","network","created"),
"uid_contactid_commented" => array("uid","contact-id","commented"),
"uid_contactid_created" => array("uid","contact-id","created"),
"uid_gcontactid_commented" => array("uid","gcontact-id","commented"),
"uid_gcontactid_created" => array("uid","gcontact-id","created"),
"wall_private_received" => array("wall","private","received"),
"uid_created" => array("uid","created"),
"uid_commented" => array("uid","commented"),
@ -1334,21 +1368,6 @@ function db_definition() {
"PRIMARY" => array("id"),
)
);
$database["unique_contacts"] = array(
"fields" => array(
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"nick" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"avatar" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"about" => array("type" => "text", "not null" => "1"),
),
"indexes" => array(
"PRIMARY" => array("id"),
"url" => array("url"),
)
);
$database["user"] = array(
"fields" => array(
"uid" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),

View File

@ -826,6 +826,23 @@ function diaspora_plink($addr, $guid) {
return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid;
}
function diaspora_repair_signature($signature, $handle = "", $level = 1) {
if ($signature == "")
return($signature);
if (base64_encode(base64_decode(base64_decode($signature))) == base64_decode($signature)) {
$signature = base64_decode($signature);
logger("Repaired double encoded signature from Diaspora/Hubzilla handle ".$handle." - level ".$level, LOGGER_DEBUG);
// Do a recursive call to be able to fix even multiple levels
if ($level < 10)
$signature = diaspora_repair_signature($signature, $handle, ++$level);
}
return($signature);
}
function diaspora_post($importer,$xml,$msg) {
$a = get_app();
@ -1565,18 +1582,19 @@ function diaspora_comment($importer,$xml,$msg) {
//);
//}
if(($parent_item['origin']) && (! $parent_author_signature)) {
// If we are the origin of the parent we store the original signature and notify our followers
if($parent_item['origin']) {
$author_signature_base64 = base64_encode($author_signature);
$author_signature_base64 = diaspora_repair_signature($author_signature_base64, $diaspora_handle);
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($message_id),
dbesc($signed_data),
dbesc(base64_encode($author_signature)),
dbesc($author_signature_base64),
dbesc($diaspora_handle)
);
// if the message isn't already being relayed, notify others
// the existence of parent_author_signature means the parent_author or owner
// is already relaying.
// notify others
proc_run('php','include/notifier.php','comment-import',$message_id);
}
@ -1973,11 +1991,15 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
if(strpos($parent_item['body'],$link_text) === false) {
$parent_item['body'] = $link_text . $parent_item['body'];
$r = q("UPDATE `item` SET `body` = '%s', `visible` = 1 WHERE `id` = %d AND `uid` = %d",
dbesc($link_text . $parent_item['body']),
dbesc($parent_item['body']),
intval($parent_item['id']),
intval($parent_item['uid'])
);
put_item_in_cache($parent_item, true);
update_thread($parent_item['id']);
}
@ -2222,21 +2244,21 @@ EOT;
// );
//}
if(! $parent_author_signature) {
// If we are the origin of the parent we store the original signature and notify our followers
if($parent_item['origin']) {
$author_signature_base64 = base64_encode($author_signature);
$author_signature_base64 = diaspora_repair_signature($author_signature_base64, $diaspora_handle);
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($message_id),
dbesc($signed_data),
dbesc(base64_encode($author_signature)),
dbesc($author_signature_base64),
dbesc($diaspora_handle)
);
}
// if the message isn't already being relayed, notify others
// the existence of parent_author_signature means the parent_author or owner
// is already relaying. The parent_item['origin'] indicates the message was created on our system
if(($parent_item['origin']) && (! $parent_author_signature))
// notify others
proc_run('php','include/notifier.php','comment-import',$message_id);
}
return;
}
@ -2332,8 +2354,7 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
return;
}
}
else {
} else {
$sig_decode = base64_decode($sig);
@ -2367,7 +2388,7 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
intval($r[0]['parent'])
);
if(count($p)) {
if(($p[0]['origin']) && (! $parent_author_signature)) {
if($p[0]['origin']) {
q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
$r[0]['id'],
dbesc($signed_data),
@ -2407,10 +2428,10 @@ function diaspora_profile($importer,$xml,$msg) {
if(! $contact)
return;
if($contact['blocked']) {
logger('diaspora_post: Ignoring this author.');
return 202;
}
//if($contact['blocked']) {
// logger('diaspora_post: Ignoring this author.');
// return 202;
//}
$name = unxmlify($xml->first_name) . ((strlen($xml->last_name)) ? ' ' . unxmlify($xml->last_name) : '');
$image_url = unxmlify($xml->image_url);
@ -2418,6 +2439,8 @@ function diaspora_profile($importer,$xml,$msg) {
$location = diaspora2bb(unxmlify($xml->location));
$about = diaspora2bb(unxmlify($xml->bio));
$gender = unxmlify($xml->gender);
$searchable = (unxmlify($xml->searchable) == "true");
$nsfw = (unxmlify($xml->nsfw) == "true");
$tags = unxmlify($xml->tag_string);
$tags = explode("#", $tags);
@ -2432,6 +2455,8 @@ function diaspora_profile($importer,$xml,$msg) {
$keywords = implode(", ", $keywords);
$handle_parts = explode("@", $diaspora_handle);
$nick = $handle_parts[0];
if($name === '') {
$name = $handle_parts[0];
}
@ -2466,10 +2491,12 @@ function diaspora_profile($importer,$xml,$msg) {
/// @TODO Update name on item['author-name'] if the name changed. See consume_feed()
/// (Not doing this currently because D* protocol is scheduled for revision soon).
$r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d",
$r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d",
dbesc($name),
dbesc($nick),
dbesc($diaspora_handle),
dbesc(datetime_convert()),
dbesc($images[0]),
dbesc($image_url),
dbesc($images[1]),
dbesc($images[2]),
dbesc(datetime_convert()),
@ -2482,26 +2509,17 @@ function diaspora_profile($importer,$xml,$msg) {
intval($importer['uid'])
);
if (unxmlify($xml->searchable) == "true") {
if ($searchable) {
require_once('include/socgraph.php');
poco_check($contact['url'], $name, NETWORK_DIASPORA, $images[0], $about, $location, $gender, $keywords, "",
poco_check($contact['url'], $name, NETWORK_DIASPORA, $image_url, $about, $location, $gender, $keywords, "",
datetime_convert(), 2, $contact['id'], $importer['uid']);
}
$profileurl = "";
$author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
dbesc(normalise_link($contact['url'])));
if (count($author) == 0) {
q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`, `location`, `about`) VALUES ('%s', '%s', '%s', '%s', '%s')",
dbesc(normalise_link($contact['url'])), dbesc($name), dbesc($location), dbesc($about), dbesc($images[0]));
$author = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
dbesc(normalise_link($contact['url'])));
} else if (normalise_link($contact['url']).$name.$location.$about != normalise_link($author[0]["url"]).$author[0]["name"].$author[0]["location"].$author[0]["about"]) {
q("UPDATE unique_contacts SET name = '%s', avatar = '%s', `location` = '%s', `about` = '%s' WHERE url = '%s'",
dbesc($name), dbesc($images[0]), dbesc($location), dbesc($about), dbesc(normalise_link($contact['url'])));
}
update_gcontact(array("url" => $contact['url'], "network" => NETWORK_DIASPORA, "generation" => 2,
"photo" => $image_url, "name" => $name, "location" => $location,
"about" => $about, "birthday" => $birthday, "gender" => $gender,
"addr" => $diaspora_handle, "nick" => $nick, "keywords" => $keywords,
"hide" => !$searchable, "nsfw" => $nsfw));
/* if($r) {
if($oldphotos) {
@ -2643,11 +2661,12 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
}
logger('diaspora_send_status: '.$owner['username'].' -> '.$contact['name'].' base message: '.$msg, LOGGER_DATA);
logger('send guid '.$item['guid'], LOGGER_DEBUG);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
//$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch));
$return_code = diaspora_transmit($owner,$contact,$slap,$public_batch);
$return_code = diaspora_transmit($owner,$contact,$slap,$public_batch,false,$item['guid']);
logger('diaspora_send_status: guid: '.$item['guid'].' result '.$return_code, LOGGER_DEBUG);
@ -2758,10 +2777,12 @@ function diaspora_send_images($item,$owner,$contact,$images,$public_batch = fals
logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA);
logger('send guid '.$r[0]['guid'], LOGGER_DEBUG);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
//$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch));
diaspora_transmit($owner,$contact,$slap,$public_batch);
diaspora_transmit($owner,$contact,$slap,$public_batch,false,$r[0]['guid']);
}
}
@ -2815,7 +2836,7 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
// sign it
if($like)
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent['guid'] . ';' . $positive . ';' . $myaddr;
$signed_text = $positive . ';' . $item['guid'] . ';' . $target_type . ';' . $parent['guid'] . ';' . $myaddr;
else
$signed_text = $item['guid'] . ';' . $parent['guid'] . ';' . $text . ';' . $myaddr;
@ -2832,11 +2853,12 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
));
logger('diaspora_followup: base message: ' . $msg, LOGGER_DATA);
logger('send guid '.$item['guid'], LOGGER_DEBUG);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
//$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch));
return(diaspora_transmit($owner,$contact,$slap,$public_batch));
return(diaspora_transmit($owner,$contact,$slap,$public_batch,false,$item['guid']));
}
@ -2847,9 +2869,6 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
// $theiraddr = $contact['addr'];
$body = $item['body'];
$text = html_entity_decode(bb2diaspora($body));
// Diaspora doesn't support threaded comments, but some
// versions of Diaspora (i.e. Diaspora-pistos) support
// likes on comments
@ -2900,61 +2919,53 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
// fetch the original signature if the relayable was created by a Diaspora
// or DFRN user. Relayables for other networks are not supported.
/* $r = q("select * from sign where " . $sql_sign_id . " = %d limit 1",
$r = q("SELECT `signed_text`, `signature`, `signer` FROM `sign` WHERE " . $sql_sign_id . " = %d LIMIT 1",
intval($item['id'])
);
if(count($r)) {
if(count($r)) {
$orig_sign = $r[0];
$signed_text = $orig_sign['signed_text'];
$authorsig = $orig_sign['signature'];
$handle = $orig_sign['signer'];
// Split the signed text
$signed_parts = explode(";", $signed_text);
// Remove the parent guid
array_shift($signed_parts);
// Remove the comment guid
array_shift($signed_parts);
// Remove the handle
array_pop($signed_parts);
// Glue the parts together
$text = implode(";", $signed_parts);
}
else {
// This part is meant for cases where we don't have the signatur. (Which shouldn't happen with posts from Diaspora and Friendica)
// This means that the comment won't be accepted by newer Diaspora servers
// Author signature information (for likes, comments, and retractions of likes or comments,
// whether from Diaspora or Friendica) must be placed in the `sign` table before this
// function is called
logger('diaspora_send_relay: original author signature not found, cannot send relayable');
return;
}*/
$body = $item['body'];
$text = html_entity_decode(bb2diaspora($body));
/* Since the author signature is only checked by the parent, not by the relay recipients,
* I think it may not be necessary for us to do so much work to preserve all the original
* signatures. The important thing that Diaspora DOES need is the original creator's handle.
* Let's just generate that and forget about all the original author signature stuff.
*
* Note: this might be more of an problem if we want to support likes on comments for older
* versions of Diaspora (diaspora-pistos), but since there are a number of problems with
* doing that, let's ignore it for now.
*
* Currently, only DFRN contacts are supported. StatusNet shouldn't be hard, but it hasn't
* been done yet
*/
$handle = diaspora_handle_from_contact($item['contact-id']);
if(! $handle)
return;
$handle = diaspora_handle_from_contact($item['contact-id']);
if(! $handle)
return;
if($relay_retract)
$signed_text = $item['guid'] . ';' . $target_type;
elseif($like)
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent['guid'] . ';' . $positive . ';' . $handle;
else
$signed_text = $item['guid'] . ';' . $parent['guid'] . ';' . $text . ';' . $handle;
if($relay_retract)
$sender_signed_text = $item['guid'] . ';' . $target_type;
elseif($like)
$sender_signed_text = $item['guid'] . ';' . $target_type . ';' . $parent['guid'] . ';' . $positive . ';' . $handle;
else
$sender_signed_text = $item['guid'] . ';' . $parent['guid'] . ';' . $text . ';' . $handle;
$authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
}
// Sign the relayable with the top-level owner's signature
//
// We'll use the $sender_signed_text that we just created, instead of the $signed_text
// stored in the database, because that provides the best chance that Diaspora will
// be able to reconstruct the signed text the same way we did. This is particularly a
// concern for the comment, whose signed text includes the text of the comment. The
// smallest change in the text of the comment, including removing whitespace, will
// make the signature verification fail. Since we translate from BB code to Diaspora's
// markup at the top of this function, which is AFTER we placed the original $signed_text
// in the database, it's hazardous to trust the original $signed_text.
$parentauthorsig = base64_encode(rsa_sign($sender_signed_text,$owner['uprvkey'],'sha256'));
$parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
$msg = replace_macros($tpl,array(
'$guid' => xmlify($item['guid']),
@ -2968,12 +2979,12 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
));
logger('diaspora_send_relay: base message: ' . $msg, LOGGER_DATA);
logger('send guid '.$item['guid'], LOGGER_DEBUG);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
//$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch));
return(diaspora_transmit($owner,$contact,$slap,$public_batch));
return(diaspora_transmit($owner,$contact,$slap,$public_batch,false,$item['guid']));
}
@ -3005,10 +3016,12 @@ function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) {
'$signature' => xmlify(base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')))
));
logger('send guid '.$item['guid'], LOGGER_DEBUG);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
//$slap = 'xml=' . urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch));
return(diaspora_transmit($owner,$contact,$slap,$public_batch));
return(diaspora_transmit($owner,$contact,$slap,$public_batch,false,$item['guid']));
}
function diaspora_send_mail($item,$owner,$contact) {
@ -3065,16 +3078,17 @@ function diaspora_send_mail($item,$owner,$contact) {
}
logger('diaspora_conversation: ' . print_r($xmsg,true), LOGGER_DATA);
logger('send guid '.$item['guid'], LOGGER_DEBUG);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],false)));
//$slap = 'xml=' . urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],false));
return(diaspora_transmit($owner,$contact,$slap,false));
return(diaspora_transmit($owner,$contact,$slap,false,false,$item['guid']));
}
function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false) {
function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false,$guid = "") {
$enabled = intval(get_config('system','diaspora_enabled'));
if(! $enabled) {
@ -3087,9 +3101,9 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false)
if(! $dest_url) {
logger('diaspora_transmit: no url for contact: ' . $contact['id'] . ' batch mode =' . $public_batch);
return 0;
}
}
logger('diaspora_transmit: ' . $logid . ' ' . $dest_url);
logger('diaspora_transmit: '.$logid.'-'.$guid.' '.$dest_url);
if( (! $queue_run) && (was_recently_delayed($contact['id'])) ) {
$return_code = 0;
@ -3104,7 +3118,7 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false)
}
}
logger('diaspora_transmit: ' . $logid . ' returns: ' . $return_code);
logger('diaspora_transmit: '.$logid.'-'.$guid.' returns: '.$return_code);
if((! $return_code) || (($return_code == 503) && (stristr($a->get_curl_headers(),'retry-after')))) {
logger('diaspora_transmit: queue message');

View File

@ -76,11 +76,18 @@ function discover_poco_run(&$argv, &$argc){
update_suggestions();
elseif (($mode == 2) AND get_config('system','poco_completion'))
discover_users();
elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search'))
elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search')) {
discover_directory($search);
elseif (($mode == 0) AND ($search == "") and (get_config('system','poco_discovery') > 0))
gs_search_user($search);
} elseif (($mode == 0) AND ($search == "") and (get_config('system','poco_discovery') > 0)) {
// Query Friendica and Hubzilla servers for their users
poco_discover();
// Query GNU Social servers for their users ("statistics" addon has to be enabled on the GS server)
if (!get_config('system','ostatus_disabled'))
gs_discover();
}
logger('end '.$search);
return;
@ -128,7 +135,7 @@ function discover_users() {
else
$server_url = poco_detect_server($user["url"]);
if (poco_check_server($server_url, $gcontacts[0]["network"])) {
if (($server_url == "") OR poco_check_server($server_url, $gcontacts[0]["network"])) {
logger('Check user '.$user["url"]);
poco_last_updated($user["url"], true);
@ -191,6 +198,36 @@ function discover_directory($search) {
Cache::set("dirsearch:".$search, time(), CACHE_DAY);
}
/**
* @brief Search for GNU Social user with gstools.org
*
* @param str $search User name
*/
function gs_search_user($search) {
$a = get_app();
$url = "http://gstools.org/api/users_search/".urlencode($search);
$result = z_fetch_url($url);
if (!$result["success"])
return false;
$contacts = json_decode($result["body"]);
if ($contacts->status == 'ERROR')
return false;
foreach($contacts->data AS $user) {
$contact = probe_url($user->site_address."/".$user->name);
if ($contact["network"] != NETWORK_PHANTOM) {
$contact["about"] = $user->description;
update_gcontact($contact);
}
}
}
if (array_search(__file__,get_included_files())===0){
discover_poco_run($_SERVER["argv"],$_SERVER["argc"]);
killme();

View File

@ -1,23 +1,25 @@
<?php
/**
* @file include/features.php *
* @file include/features.php
* @brief Features management
*/
/**
* @brief check if feature is enabled
*
* return boolean
* @return boolean
*/
function feature_enabled($uid,$feature) {
//return true;
$x = get_pconfig($uid,'feature',$feature);
$x = get_config('feature_lock',$feature);
if($x === false) {
$x = get_config('feature',$feature);
if($x === false)
$x = get_feature_default($feature);
$x = get_pconfig($uid,'feature',$feature);
if($x === false) {
$x = get_config('feature',$feature);
if($x === false)
$x = get_feature_default($feature);
}
}
$arr = array('uid' => $uid, 'feature' => $feature, 'enabled' => $x);
call_hooks('feature_enabled',$arr);
@ -42,14 +44,17 @@ function get_feature_default($feature) {
}
/**
* @ brief get a list of all available features
* @brief Get a list of all available features
*
* The array includes the setting group, the setting name,
* explainations for the setting and if it's enabled or disabled
* by default
*
* @param bool $filtered True removes any locked features
*
* @return array
*/
function get_features() {
function get_features($filtered = true) {
$arr = array(
@ -57,56 +62,78 @@ function get_features() {
'general' => array(
t('General Features'),
//array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'),false),
array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'),false),
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, get_config('feature_lock','multi_profiles')),
array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, get_config('feature_lock','photo_location')),
),
// Post composition
'composition' => array(
t('Post Composition Features'),
array('richtext', t('Richtext Editor'), t('Enable richtext editor'),false),
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'),false),
array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.'),false),
array('richtext', t('Richtext Editor'), t('Enable richtext editor'), false, get_config('feature_lock','richtext')),
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, get_config('feature_lock','preview')),
array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.'), false, get_config('feature_lock','aclautomention')),
),
// Network sidebar widgets
'widgets' => array(
t('Network Sidebar Widgets'),
array('archives', t('Search by Date'), t('Ability to select posts by date ranges'),false),
array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'),true),
array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'),false),
array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'),false),
array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'),false),
array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, get_config('feature_lock','archives')),
array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, get_config('feature_lock','forumlist_widget')),
array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, get_config('feature_lock','groups')),
array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, get_config('feature_lock','networks')),
array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, get_config('feature_lock','savedsearch')),
),
// Network tabs
'net_tabs' => array(
t('Network Tabs'),
array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'),false),
array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'),false),
array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'),false),
array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, get_config('feature_lock','personal_tab')),
array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, get_config('feature_lock','new_tab')),
array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, get_config('feature_lock','link_tab')),
),
// Item tools
'tools' => array(
t('Post/Comment Tools'),
array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'),false),
array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'),false),
array('commtag', t('Tagging'), t('Ability to tag existing posts'),false),
array('categories', t('Post Categories'), t('Add categories to your posts'),false),
array('filing', t('Saved Folders'), t('Ability to file posts under folders'),false),
array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments')),
array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'),false),
array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'),false),
array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, get_config('feature_lock','multi_delete')),
array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, get_config('feature_lock','edit_posts')),
array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, get_config('feature_lock','commtag')),
array('categories', t('Post Categories'), t('Add categories to your posts'), false, get_config('feature_lock','categories')),
array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, get_config('feature_lock','filing')),
array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, get_config('feature_lock','dislike')),
array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, get_config('feature_lock','star_posts')),
array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, get_config('feature_lock','ignore_posts')),
),
// Advanced Profile Settings
'advanced_profile' => array(
t('Advanced Profile Settings'),
array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'),false),
array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, get_config('feature_lock','forumlist_profile')),
),
);
// removed any locked features and remove the entire category if this makes it empty
if($filtered) {
foreach($arr as $k => $x) {
$has_items = false;
$kquantity = count($arr[$k]);
for($y = 0; $y < $kquantity; $y ++) {
if(is_array($arr[$k][$y])) {
if($arr[$k][$y][4] === false) {
$has_items = true;
}
else {
unset($arr[$k][$y]);
}
}
}
if(! $has_items) {
unset($arr[$k]);
}
}
}
call_hooks('get_features',$arr);
return $arr;
}

View File

@ -297,17 +297,26 @@ function group_side($every="contacts",$each="group",$editmode = "standard", $gro
return $o;
}
function expand_groups($a,$check_dead = false) {
function expand_groups($a,$check_dead = false, $use_gcontact = false) {
if(! (is_array($a) && count($a)))
return array();
$groups = implode(',', $a);
$groups = dbesc($groups);
$r = q("SELECT `contact-id` FROM `group_member` WHERE `gid` IN ( $groups )");
if ($use_gcontact)
$r = q("SELECT `gcontact`.`id` AS `contact-id` FROM `group_member`
INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
WHERE `gid` IN ($groups)");
else
$r = q("SELECT `contact-id` FROM `group_member` WHERE `gid` IN ( $groups )");
$ret = array();
if(count($r))
foreach($r as $rr)
$ret[] = $rr['contact-id'];
if($check_dead) {
if($check_dead AND !$use_gcontact) {
require_once('include/acl_selectors.php');
$ret = prune_deadguys($ret);
}
@ -366,4 +375,4 @@ function groups_count_unseen() {
);
return $r;
}
}

View File

@ -300,6 +300,7 @@ function profile_sidebar($profile, $block = 0) {
$account_type = "";
if((x($profile,'address') == 1)
|| (x($profile,'location') == 1)
|| (x($profile,'locality') == 1)
|| (x($profile,'region') == 1)
|| (x($profile,'postal-code') == 1)
@ -368,6 +369,8 @@ function profile_sidebar($profile, $block = 0) {
if (isset($p["address"]))
$p["address"] = bbcode($p["address"]);
else
$p["address"] = bbcode($p["location"]);
if (isset($p["photo"]))
$p["photo"] = proxy_url($p["photo"], false, PROXY_SIZE_SMALL);

View File

@ -945,8 +945,9 @@ function add_page_info_data($data) {
$a = get_app();
$hashtags = "\n";
foreach ($data["keywords"] AS $keyword) {
$hashtag = str_replace(array(" ", "+", "/", ".", "#", "'"),
array("","", "", "", "", ""), $keyword);
/// @todo make a positive list of allowed characters
$hashtag = str_replace(array(" ", "+", "/", ".", "#", "'", "", "`", "(", ")", "", ""),
array("","", "", "", "", "", "", "", "", "", "", ""), $keyword);
$hashtags .= "#[url=".$a->get_baseurl()."/search?tag=".rawurlencode($hashtag)."]".$hashtag."[/url] ";
}
}
@ -957,12 +958,7 @@ function add_page_info_data($data) {
function query_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") {
require_once("mod/parse_url.php");
$data = Cache::get("parse_url:".$url);
if (is_null($data)){
$data = parseurl_getsiteinfo($url, true);
Cache::set("parse_url:".$url,serialize($data), CACHE_DAY);
} else
$data = unserialize($data);
$data = parseurl_getsiteinfo_cached($url, true);
if ($photo != "")
$data["images"][0]["src"] = $photo;
@ -1328,6 +1324,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
logger("item_store: Set network to ".$arr["network"]." for ".$arr["uri"], LOGGER_DEBUG);
}
if ($arr["gcontact-id"] == 0)
$arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['author-link'], "network" => $arr['network'],
"photo" => $arr['author-avatar'], "name" => $arr['author-name']));
if ($arr['guid'] != "") {
// Checking if there is already an item with the same guid
logger('checking for an item for user '.$arr['uid'].' on network '.$arr['network'].' with the guid '.$arr['guid'], LOGGER_DEBUG);
@ -1599,6 +1599,14 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
);
if($dsprsig) {
// Friendica servers lower than 3.4.3-2 had double encoded the signature ...
// We can check for this condition when we decode and encode the stuff again.
if (base64_encode(base64_decode(base64_decode($dsprsig->signature))) == base64_decode($dsprsig->signature)) {
$dsprsig->signature = base64_decode($dsprsig->signature);
logger("Repaired double encoded signature from handle ".$dsprsig->signer, LOGGER_DEBUG);
}
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($current_post),
dbesc($dsprsig->signed_text),
@ -2633,7 +2641,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
logger('consume_feed: feed item count = ' . $feed->get_item_quantity());
// in inverse date order
// in inverse date order
if ($datedir)
$items = array_reverse($feed->get_items());
else

View File

@ -279,6 +279,9 @@ function store_diaspora_like_retract_sig($activity, $item, $like_item, $contact)
$contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
$diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
// This code could never had worked (the return values form the queries were used in a wrong way.
// Additionally it is needlessly complicated. Either the contact is owner or not. And we have this data already.
/*
// Get contact's private key if he's a user of the local Friendica server
$r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
dbesc($contact['url'])
@ -289,9 +292,15 @@ function store_diaspora_like_retract_sig($activity, $item, $like_item, $contact)
$r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
intval($contact_uid)
);
*/
// Is the contact the owner? Then fetch the private key
if ($contact['self'] AND ($contact['uid'] > 0)) {
$r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
intval($contact['uid'])
);
if( $r)
$authorsig = base64_encode(rsa_sign($signed_text,$r['prvkey'],'sha256'));
if($r)
$authorsig = base64_encode(rsa_sign($signed_text,$r[0]['prvkey'],'sha256'));
}
if(! isset($authorsig))
@ -329,6 +338,10 @@ function store_diaspora_like_sig($activity, $post_type, $contact, $post_id) {
$contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
$diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
// This code could never had worked (the return values form the queries were used in a wrong way.
// Additionally it is needlessly complicated. Either the contact is owner or not. And we have this data already.
/*
// Get contact's private key if he's a user of the local Friendica server
$r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
dbesc($contact['url'])
@ -343,6 +356,17 @@ function store_diaspora_like_sig($activity, $post_type, $contact, $post_id) {
if( $r)
$contact_uprvkey = $r['prvkey'];
}
*/
// Is the contact the owner? Then fetch the private key
if ($contact['self'] AND ($contact['uid'] > 0)) {
$r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
intval($contact['uid'])
);
if($r)
$contact_uprvkey = $r[0]['prvkey'];
}
$r = q("SELECT guid, parent FROM `item` WHERE id = %d LIMIT 1",
intval($post_id)
@ -353,7 +377,7 @@ function store_diaspora_like_sig($activity, $post_type, $contact, $post_id) {
intval($r[0]['parent'])
);
if( $p) {
$signed_text = $r[0]['guid'] . ';Post;' . $p[0]['guid'] . ';true;' . $diaspora_handle;
$signed_text = 'true;'.$r[0]['guid'].';Post;'.$p[0]['guid'].';'.$diaspora_handle;
if(isset($contact_uprvkey))
$authorsig = base64_encode(rsa_sign($signed_text,$contact_uprvkey,'sha256'));

View File

@ -1246,6 +1246,9 @@ function original_url($url, $depth=1, $fetchbody = false) {
$a->save_timestamp($stamp1, "network");
if ($http_code == 0)
return($url);
if ((($curl_info['http_code'] == "301") OR ($curl_info['http_code'] == "302"))
AND (($curl_info['redirect_url'] != "") OR ($curl_info['location'] != ""))) {
if ($curl_info['redirect_url'] != "")

View File

@ -535,7 +535,7 @@ function notifier_run(&$argv, &$argc){
if($public_message) {
if (!$followup)
if (!$followup AND $top_level)
$r0 = diaspora_fetch_relay();
else
$r0 = array();

View File

@ -13,7 +13,13 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
$a = get_app();
$txt = Cache::get($a->videowidth . $embedurl);
$r = q("SELECT * FROM `oembed` WHERE `url` = '%s'",
dbesc(normalise_link($embedurl)));
if ($r)
$txt = $r[0]["content"];
else
$txt = Cache::get($a->videowidth . $embedurl);
// These media files should now be caught in bbcode.php
// left here as a fallback in case this is called from another source
@ -66,8 +72,14 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
if ($txt[0]!="{")
$txt='{"type":"error"}';
else //save in cache
else { //save in cache
$j = json_decode($txt);
if ($j->type != "error")
q("INSERT INTO `oembed` (`url`, `content`, `created`) VALUES ('%s', '%s', '%s')",
dbesc(normalise_link($embedurl)), dbesc($txt), dbesc(datetime_convert()));
Cache::set($a->videowidth . $embedurl,$txt, CACHE_DAY);
}
}
$j = json_decode($txt);
@ -85,7 +97,7 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
// If fetching information doesn't work, then improve via internal functions
if (($j->type == "error") OR ($no_rich_type AND ($j->type == "rich"))) {
require_once("mod/parse_url.php");
$data = parseurl_getsiteinfo($embedurl, true, false);
$data = parseurl_getsiteinfo_cached($embedurl, true, false);
$j->type = $data["type"];
if ($j->type == "photo") {

View File

@ -129,45 +129,57 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch)
if ($r AND !$onlyfetch) {
// Update contact data
$update_contact = ($r[0]['name-date'] < datetime_convert('','','now -12 hours'));
if ($update_contact) {
$value = $xpath->query("atom:link[@rel='salmon']", $context)->item(0)->nodeValue;
if ($value != "")
$contact["notify"] = $value;
$value = $xpath->evaluate('atom:author/uri/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["alias"] = $value;
$value = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["name"] = $value;
$value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["nick"] = $value;
$value = $xpath->evaluate('atom:author/poco:note/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["about"] = html2bbcode($value);
$value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["location"] = $value;
if (($contact["name"] != $r[0]["name"]) OR ($contact["nick"] != $r[0]["nick"]) OR ($contact["about"] != $r[0]["about"]) OR ($contact["location"] != $r[0]["location"])) {
logger("Update contact data for contact ".$contact["id"], LOGGER_DEBUG);
$value = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["name"] = $value;
$value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["nick"] = $value;
$value = $xpath->evaluate('atom:author/poco:note/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["about"] = html2bbcode($value);
$value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["location"] = $value;
q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `about` = '%s', `location` = '%s', `name-date` = '%s' WHERE `id` = %d AND `network` = '%s'",
dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["about"]), dbesc($contact["location"]),
dbesc(datetime_convert()), intval($contact["id"]), dbesc(NETWORK_OSTATUS));
poco_check($contact["url"], $contact["name"], $contact["network"], $author["author-avatar"], $contact["about"], $contact["location"],
"", "", "", datetime_convert(), 2, $contact["id"], $contact["uid"]);
"", "", "", datetime_convert(), 2, $contact["id"], $contact["uid"]);
}
$update_photo = ($r[0]['avatar-date'] < datetime_convert('','','now -12 hours'));
if ($update_photo AND isset($author["author-avatar"])) {
if (isset($author["author-avatar"]) AND ($author["author-avatar"] != $r[0]['photo'])) {
logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG);
$photos = import_profile_photo($author["author-avatar"], $importer["uid"], $contact["id"]);
q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d AND `network` = '%s'",
dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]),
dbesc($author["author-avatar"]), dbesc($photos[1]), dbesc($photos[2]),
dbesc(datetime_convert()), intval($contact["id"]), dbesc(NETWORK_OSTATUS));
}
/// @todo Add the "addr" field
$contact["generation"] = 2;
$contact["photo"] = $author["author-avatar"];
update_gcontact($contact);
}
return($author);
@ -1447,9 +1459,12 @@ function ostatus_entry($doc, $item, $owner, $toplevel = false, $repeat = false)
$repeated_owner["about"] = "";
$repeated_owner["uid"] = 0;
$r =q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", normalise_link($repeated_item["author-link"]));
// Fetch the missing data from the global contacts
$r =q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", normalise_link($repeated_item["author-link"]));
if ($r) {
$repeated_owner["nick"] = $r[0]["nick"];
if ($r[0]["nick"] != "")
$repeated_owner["nick"] = $r[0]["nick"];
$repeated_owner["location"] = $r[0]["location"];
$repeated_owner["about"] = $r[0]["about"];
}

View File

@ -90,6 +90,14 @@ function get_attached_data($body) {
$post["text"] = $body;
}
}
if (preg_match_all("(\[url\]([$URLSearchString]*)\[\/url\])ism", $body, $links, PREG_SET_ORDER)) {
if (count($links) == 1) {
$post["type"] = "text";
$post["url"] = $links[0][1];
$post["text"] = $body;
}
}
if (!isset($post["type"])) {
$post["type"] = "text";
$post["text"] = trim($body);
@ -129,9 +137,17 @@ function plaintext($a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2) {
require_once("include/html2plain.php");
require_once("include/network.php");
// Remove the hash tags
$URLSearchString = "^\[\]";
$body = preg_replace("/([#@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $b["body"]);
// Add an URL element if the text contains a raw link
$body = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2[/url]', $body);
// At first look at data that is attached via "type-..." stuff
// This will hopefully replaced with a dedicated bbcode later
$post = get_attached_data($b["body"]);
//$post = get_attached_data($b["body"]);
$post = get_attached_data($body);
if (($b["title"] != "") AND ($post["text"] != ""))
$post["text"] = trim($b["title"]."\n\n".$post["text"]);
@ -146,6 +162,8 @@ function plaintext($a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2) {
if ($includedlinks) {
if ($post["type"] == "link")
$link = $post["url"];
elseif ($post["type"] == "text")
$link = $post["url"];
elseif ($post["type"] == "video")
$link = $post["url"];
elseif ($post["type"] == "photo")
@ -161,8 +179,22 @@ function plaintext($a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2) {
// But: if the link is beyond the limit, then it has to be added.
if (($link != "") AND strstr($msg, $link)) {
$pos = strpos($msg, $link);
if (($limit == 0) OR ($pos < $limit))
// Will the text be shortened in the link?
// Or is the link the last item in the post?
if (($limit > 0) AND ($pos < $limit) AND (($pos + 23 > $limit) OR ($pos + strlen($link) == strlen($msg))))
$msg = trim(str_replace($link, "", $msg));
elseif (($limit == 0) OR ($pos < $limit)) {
// The limit has to be increased since it will be shortened - but not now
// Only do it with Twitter (htmlmode = 8)
if (($limit > 0) AND (strlen($link) > 23) AND ($htmlmode == 8))
$limit = $limit - 23 + strlen($link);
$link = "";
if ($post["type"] == "text")
unset($post["url"]);
}
}
}
@ -178,7 +210,9 @@ function plaintext($a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2) {
if (iconv_strlen($msg, "UTF-8") > $limit) {
if (!isset($post["url"])) {
if (($post["type"] == "text") AND isset($post["url"]))
$post["url"] = $b["plink"];
elseif (!isset($post["url"])) {
$limit = $limit - 23;
$post["url"] = $b["plink"];
} elseif (strpos($b["body"], "[share") !== false)

View File

@ -52,6 +52,8 @@ function queue_run(&$argv, &$argc){
$queue_id = 0;
$deadguys = array();
$deadservers = array();
$serverlist = array();
logger('queue: start');
@ -95,7 +97,7 @@ function queue_run(&$argv, &$argc){
// For the first 12 hours we'll try to deliver every 15 minutes
// After that, we'll only attempt delivery once per hour.
$r = q("SELECT `id` FROM `queue` WHERE (( `created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ) OR ( `last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR ))");
$r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
}
if(! $r){
return;
@ -116,7 +118,7 @@ function queue_run(&$argv, &$argc){
// so check again if this entry still needs processing
if($queue_id) {
$qi = q("select * from queue where `id` = %d limit 1",
$qi = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id)
);
}
@ -142,8 +144,18 @@ function queue_run(&$argv, &$argc){
continue;
}
if (!poco_reachable($c[0]['url'])) {
logger('queue: skipping probably dead url: ' . $c[0]['url']);
$server = poco_detect_server($c[0]['url']);
if (($server != "") AND !in_array($server, $serverlist)) {
logger("Check server ".$server." (".$c[0]["network"].")");
if (!poco_check_server($server, $c[0]["network"], true))
$deadservers[] = $server;
$serverlist[] = $server;
}
if (($server != "") AND in_array($server, $deadservers)) {
logger('queue: skipping known dead server: '.$server);
update_queue_time($q_item['id']);
continue;
}
@ -166,37 +178,39 @@ function queue_run(&$argv, &$argc){
switch($contact['network']) {
case NETWORK_DFRN:
logger('queue: dfrndelivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = dfrn_deliver($owner,$contact,$data);
if($deliver_status == (-1)) {
update_queue_time($q_item['id']);
$deadguys[] = $contact['notify'];
}
else {
} else
remove_queue_item($q_item['id']);
}
break;
case NETWORK_OSTATUS:
if($contact['notify']) {
logger('queue: slapdelivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = slapper($owner,$contact['notify'],$data);
if($deliver_status == (-1))
if($deliver_status == (-1)) {
update_queue_time($q_item['id']);
else
$deadguys[] = $contact['notify'];
} else
remove_queue_item($q_item['id']);
}
break;
case NETWORK_DIASPORA:
if($contact['notify']) {
logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = diaspora_transmit($owner,$contact,$data,$public,true);
if($deliver_status == (-1))
if($deliver_status == (-1)) {
update_queue_time($q_item['id']);
else
$deadguys[] = $contact['notify'];
} else
remove_queue_item($q_item['id']);
}
break;
@ -212,6 +226,7 @@ function queue_run(&$argv, &$argc){
break;
}
logger('Deliver status '.$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
}
return;

View File

@ -1,261 +0,0 @@
<?php
/* update friendica */
define('APIBASE', 'http://github.com/api/v2/');
define('F9KREPO', 'friendica/friendica');
$up_totalfiles = 0;
$up_countfiles = 0;
$up_lastp = -1;
function checkUpdate(){
$r = fetch_url( APIBASE."json/repos/show/".F9KREPO."/tags" );
$tags = json_decode($r);
$tag = 0.0;
foreach ($tags->tags as $i=>$v){
$i = (float)$i;
if ($i>$tag) $tag=$i;
}
if ($tag==0.0) return false;
$f = fetch_url("https://raw.github.com/".F9KREPO."/".$tag."/boot.php","r");
preg_match("|'FRIENDICA_VERSION', *'([^']*)'|", $f, $m);
$version = $m[1];
$lv = explode(".", FRIENDICA_VERSION);
$rv = explode(".",$version);
foreach($lv as $i=>$v){
if ((int)$lv[$i] < (int)$rv[$i]) {
return array($tag, $version, "https://github.com/friendica/friendica/zipball/".$tag);
break;
}
}
return false;
}
function canWeWrite(){
$bd = dirname(dirname(__file__));
return is_writable( $bd."/boot.php" );
}
function out($txt){ echo "§".$txt."§"; ob_end_flush(); flush();}
function up_count($path){
$file_count = 0;
$dir_handle = opendir($path);
if (!$dir_handle) return -1;
while ($file = readdir($dir_handle)) {
if ($file == '.' || $file == '..') continue;
$file_count++;
if (is_dir($path . $file)){
$file_count += up_count($path . $file . DIRECTORY_SEPARATOR);
}
}
closedir($dir_handle);
return $file_count;
}
function up_unzip($file, $folder="/tmp"){
$folder.="/";
$zip = zip_open($file);
if ($zip) {
while ($zip_entry = zip_read($zip)) {
$zip_entry_name = zip_entry_name($zip_entry);
if (substr($zip_entry_name,strlen($zip_entry_name)-1,1)=="/"){
mkdir($folder.$zip_entry_name,0777, true);
} else {
$fp = fopen($folder.$zip_entry_name, "w");
if (zip_entry_open($zip, $zip_entry, "r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp,"$buf");
zip_entry_close($zip_entry);
fclose($fp);
}
}
}
zip_close($zip);
}
}
/**
* Walk recoursively in a folder and call a callback function on every
* dir entry.
* args:
* $dir string base dir to walk
* $callback function callback function
* $sort int 0: ascending, 1: descending
* $cb_argv any extra value passed to callback
*
* callback signature:
* function name($fn, $dir [, $argv])
* $fn string full dir entry name
* $dir string start dir path
* $argv any user value to callback
*
*/
function up_walktree($dir, $callback=Null, $sort=0, $cb_argv=Null , $startdir=Null){
if (is_null($callback)) return;
if (is_null($startdir)) $startdir = $dir;
$res = scandir($dir, $sort);
foreach($res as $i=>$v){
if ($v!="." && $v!=".."){
$fn = $dir."/".$v;
if ($sort==0) $callback($fn, $startdir, $cb_argv);
if (is_dir($fn)) up_walktree($fn, $callback, $sort, $cb_argv, $startdir);
if ($sort==1) $callback($fn, $startdir, $cb_argv);
}
}
}
function up_copy($fn, $dir){
global $up_countfiles, $up_totalfiles, $up_lastp;
$up_countfiles++; $prc=(int)(((float)$up_countfiles/(float)$up_totalfiles)*100);
if (strpos($fn, ".gitignore")>-1 || strpos($fn, ".htaccess")>-1) return;
$ddest = dirname(dirname(__file__));
$fd = str_replace($dir, $ddest, $fn);
if (is_dir($fn) && !is_dir($fd)) {
$re=mkdir($fd,0777,true);
}
if (!is_dir($fn)){
$re=copy($fn, $fd);
}
if ($re===false) {
out("ERROR. Abort.");
killme();
}
out("copy@Copy@$prc%");
}
function up_ftp($fn, $dir, $argv){
global $up_countfiles, $up_totalfiles, $up_lastp;
$up_countfiles++; $prc=(int)(((float)$up_countfiles/(float)$up_totalfiles)*100);
if (strpos($fn, ".gitignore")>-1 || strpos($fn, ".htaccess")>-1) return;
list($ddest, $conn_id) = $argv;
$l = strlen($ddest)-1;
if (substr($ddest,$l,1)=="/") $ddest = substr($ddest,0,$l);
$fd = str_replace($dir, $ddest, $fn);
if (is_dir($fn)){
if (ftp_nlist($conn_id, $fd)===false) {
$ret = ftp_mkdir($conn_id, $fd);
} else {
$ret=true;
}
} else {
$ret = ftp_put($conn_id, $fd, $fn, FTP_BINARY);
}
if (!$ret) {
out("ERROR. Abort.");
killme();
}
out("copy@Copy@$prc%");
}
function up_rm($fn, $dir){
if (is_dir($fn)){
rmdir($fn);
} else {
unlink($fn);
}
}
function up_dlfile($url, $file) {
$in = fopen ($url, "r");
$out = fopen ($file, "w");
$fs = filesize($url);
if (!$in || !$out) return false;
$s=0; $count=0;
while (!feof ($in)) {
$line = fgets ($in, 1024);
fwrite( $out, $line);
$count++; $s += strlen($line);
if ($count==50){
$count=0;
$sp=$s/1024.0; $ex="Kb";
if ($sp>1024) { $sp=$sp/1024; $ex="Mb"; }
if ($sp>1024) { $sp=$sp/1024; $ex="Gb"; }
$sp = ((int)($sp*100))/100;
out("dwl@Download@".$sp.$ex);
}
}
fclose($in);
return true;
}
function doUpdate($remotefile, $ftpdata=false){
global $up_totalfiles;
$localtmpfile = tempnam("/tmp", "fk");
out("dwl@Download@starting...");
$rt= up_dlfile($remotefile, $localtmpfile);
if ($rt==false || filesize($localtmpfile)==0){
out("dwl@Download@ERROR.");
unlink($localtmpfile);
return;
}
out("dwl@Download@Ok.");
out("unzip@Unzip@");
$tmpdirname = $localfile."ex";
mkdir($tmpdirname);
up_unzip($localtmpfile, $tmpdirname);
$basedir = glob($tmpdirname."/*"); $basedir=$basedir[0];
out ("unzip@Unzip@Ok.");
$up_totalfiles = up_count($basedir."/");
if (canWeWrite()){
out("copy@Copy@");
up_walktree($basedir, 'up_copy');
}
if ($ftpdata!==false && is_array($ftpdata) && $ftpdata['ftphost']!="" ){
out("ftpcon@Connect to FTP@");
$conn_id = ftp_connect($ftpdata['ftphost']);
$login_result = ftp_login($conn_id, $ftpdata['ftpuser'], $ftpdata['ftppwd']);
if ((!$conn_id) || (!$login_result)) {
out("ftpcon@Connect to FTP@FAILED");
up_clean($tmpdirname, $localtmpfile);
return;
} else {
out("ftpcon@Connect to FTP@Ok.");
}
out("copy@Copy@");
up_walktree($basedir, 'up_ftp', 0, array( $ftpdata['ftppath'], $conn_id));
ftp_close($conn_id);
}
up_clean($tmpdirname, $localtmpfile);
}
function up_clean($tmpdirname, $localtmpfile){
out("clean@Clean up@");
unlink($localtmpfile);
up_walktree($tmpdirname, 'up_rm', 1);
rmdir($tmpdirname);
out("clean@Clean up@Ok.");
}

View File

@ -227,6 +227,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
$server_url = $x[0]["server_url"];
$nick = $x[0]["nick"];
$addr = $x[0]["addr"];
$alias = $x[0]["alias"];
$notify = $x[0]["notify"];
} else {
$created = "0000-00-00 00:00:00";
$server_url = "";
@ -234,6 +236,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
$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)
@ -246,6 +250,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
$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"];
@ -301,12 +307,19 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
if (($addr == "") AND ($x[0]['addr'] != ""))
$addr = $x[0]['addr'];
if (($alias == "") AND ($x[0]['alias'] != ""))
$alias = $x[0]['alias'];
if (($notify == "") AND ($x[0]['notify'] != ""))
$notify = $x[0]['notify'];
if (($generation == 0) AND ($x[0]['generation'] > 0))
$generation = $x[0]['generation'];
if($x[0]['name'] != $name || $x[0]['photo'] != $profile_photo || $x[0]['updated'] < $updated) {
q("UPDATE `gcontact` SET `name` = '%s', `addr` = '%s', `network` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s', `server_url` = '%s',
`updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s', `generation` = %d
`updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s', `generation` = %d,
`alias` = '$s', `notify` = '%s'
WHERE (`generation` >= %d OR `generation` = 0) AND `nurl` = '%s'",
dbesc($name),
dbesc($addr),
@ -320,34 +333,44 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
dbesc($about),
dbesc($keywords),
dbesc($gender),
dbesc($alias),
dbesc($notify),
intval($generation),
intval($generation),
dbesc(normalise_link($profile_url))
);
}
} else {
q("INSERT INTO `gcontact` (`name`, `nick`, `addr`, `network`, `url`, `nurl`, `photo`, `connect`, `server_url`, `created`, `updated`, `location`, `about`, `keywords`, `gender`, `generation`)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
dbesc($name),
dbesc($nick),
dbesc($addr),
dbesc($network),
dbesc($profile_url),
dbesc(normalise_link($profile_url)),
dbesc($profile_photo),
dbesc($connect_url),
dbesc($server_url),
dbesc(datetime_convert()),
dbesc($updated),
dbesc($location),
dbesc($about),
dbesc($keywords),
dbesc($gender),
intval($generation)
);
$x = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
// Maybe another process had inserted the entry after the first check, so it again
$x = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($profile_url))
);
if(!$x) {
q("INSERT INTO `gcontact` (`name`, `nick`, `addr`, `network`, `url`, `nurl`, `photo`, `connect`, `server_url`, `created`, `updated`, `location`, `about`, `keywords`, `gender`, `alias`, `notify`, `generation`)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
dbesc($name),
dbesc($nick),
dbesc($addr),
dbesc($network),
dbesc($profile_url),
dbesc(normalise_link($profile_url)),
dbesc($profile_photo),
dbesc($connect_url),
dbesc($server_url),
dbesc(datetime_convert()),
dbesc($updated),
dbesc($location),
dbesc($about),
dbesc($keywords),
dbesc($gender),
dbesc($alias),
dbesc($notify),
intval($generation)
);
$x = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($profile_url))
);
}
if(count($x))
$gcid = $x[0]['id'];
}
@ -380,11 +403,11 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
}
// For unknown reasons there are sometimes duplicates
q("DELETE FROM `gcontact` WHERE `nurl` = '%s' AND `id` != %d AND
NOT EXISTS (SELECT `gcid` FROM `glink` WHERE `gcid` = `gcontact`.`id`)",
dbesc(normalise_link($profile_url)),
intval($gcid)
);
//q("DELETE FROM `gcontact` WHERE `nurl` = '%s' AND `id` != %d AND
// NOT EXISTS (SELECT `gcid` FROM `glink` WHERE `gcid` = `gcontact`.`id`)",
// dbesc(normalise_link($profile_url)),
// intval($gcid)
//);
return $gcid;
}
@ -698,6 +721,10 @@ function poco_to_boolean($val) {
function poco_check_server($server_url, $network = "", $force = false) {
// Unify the server address
$server_url = trim($server_url, "/");
$server_url = str_replace("/index.php", "", $server_url);
if ($server_url == "")
return false;
@ -769,17 +796,23 @@ function poco_check_server($server_url, $network = "", $force = false) {
// Test for Diaspora
$serverret = z_fetch_url($server_url);
$lines = explode("\n",$serverret["header"]);
if(count($lines))
foreach($lines as $line) {
$line = trim($line);
if(stristr($line,'X-Diaspora-Version:')) {
$platform = "Diaspora";
$version = trim(str_replace("X-Diaspora-Version:", "", $line));
$version = trim(str_replace("x-diaspora-version:", "", $version));
$network = NETWORK_DIASPORA;
if (!$serverret["success"] OR ($serverret["body"] == ""))
$failure = true;
else {
$lines = explode("\n",$serverret["header"]);
if(count($lines))
foreach($lines as $line) {
$line = trim($line);
if(stristr($line,'X-Diaspora-Version:')) {
$platform = "Diaspora";
$version = trim(str_replace("X-Diaspora-Version:", "", $line));
$version = trim(str_replace("x-diaspora-version:", "", $version));
$network = NETWORK_DIASPORA;
$versionparts = explode("-", $version);
$version = $versionparts[0];
}
}
}
}
}
if (!$failure) {
@ -1290,18 +1323,30 @@ function poco_discover_federation() {
return;
}
// Discover Friendica, Hubzilla and Diaspora servers
$serverdata = fetch_url("http://the-federation.info/pods.json");
if (!$serverdata)
return;
if ($serverdata) {
$servers = json_decode($serverdata);
$servers = json_decode($serverdata);
foreach($servers->pods AS $server)
poco_check_server("https://".$server->host);
}
foreach($servers->pods AS $server)
poco_check_server("https://".$server->host);
// Discover GNU Social Servers
if (!get_config('system','ostatus_disabled')) {
$serverdata = "http://gstools.org/api/get_open_instances/";
$result = z_fetch_url($serverdata);
if ($result["success"]) {
$servers = json_decode($result["body"]);
foreach($servers->data AS $server)
poco_check_server($server->instance_address);
}
}
set_config('poco','last_federation_discovery', time());
}
function poco_discover($complete = false) {
@ -1481,4 +1526,232 @@ function poco_discover_server($data, $default_generation = 0) {
}
return $success;
}
/**
* @brief Fetch the gcontact id, add an entry if not existed
*
* @param arr $contact contact array
* @return bool|int Returns false if not found, integer if contact was found
*/
function get_gcontact_id($contact) {
$gcontact_id = 0;
if ($contact["network"] == NETWORK_STATUSNET)
$contact["network"] = NETWORK_OSTATUS;
$r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($contact["url"])));
if ($r)
$gcontact_id = $r[0]["id"];
else {
q("INSERT INTO `gcontact` (`name`, `nick`, `addr` , `network`, `url`, `nurl`, `photo`, `created`, `updated`, `location`, `about`, `generation`)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
dbesc($contact["name"]),
dbesc($contact["nick"]),
dbesc($contact["addr"]),
dbesc($contact["network"]),
dbesc($contact["url"]),
dbesc(normalise_link($contact["url"])),
dbesc($contact["photo"]),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc($contact["location"]),
dbesc($contact["about"]),
intval($contact["generation"])
);
$r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($contact["url"])));
if ($r)
$gcontact_id = $r[0]["id"];
}
return $gcontact_id;
}
/**
* @brief Updates the gcontact table from a given array
*
* @param arr $contact contact array
* @return bool|int Returns false if not found, integer if contact was found
*/
function update_gcontact($contact) {
/// @todo update contact table as well
$gcontact_id = get_gcontact_id($contact);
if (!$gcontact_id)
return false;
$r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, `hide`, `nsfw`, `network`, `alias`, `notify`, `url`
FROM `gcontact` WHERE `id` = %d LIMIT 1",
intval($gcontact_id));
if ($contact["generation"] == 0)
$contact["generation"] = $r[0]["generation"];
if ($contact["photo"] == "")
$contact["photo"] = $r[0]["photo"];
if ($contact["name"] == "")
$contact["name"] = $r[0]["name"];
if ($contact["nick"] == "")
$contact["nick"] = $r[0]["nick"];
if ($contact["addr"] == "")
$contact["addr"] = $r[0]["addr"];
if ($contact["location"] =="")
$contact["location"] = $r[0]["location"];
if ($contact["about"] =="")
$contact["about"] = $r[0]["about"];
if ($contact["birthday"] =="")
$contact["birthday"] = $r[0]["birthday"];
if ($contact["gender"] =="")
$contact["gender"] = $r[0]["gender"];
if ($contact["keywords"] =="")
$contact["keywords"] = $r[0]["keywords"];
if (!isset($contact["hide"]))
$contact["hide"] = $r[0]["hide"];
if (!isset($contact["nsfw"]))
$contact["nsfw"] = $r[0]["nsfw"];
if ($contact["network"] =="")
$contact["network"] = $r[0]["network"];
if ($contact["alias"] =="")
$contact["alias"] = $r[0]["alias"];
if ($contact["url"] =="")
$contact["url"] = $r[0]["url"];
if ($contact["notify"] =="")
$contact["notify"] = $r[0]["notify"];
if ($contact["network"] == NETWORK_STATUSNET)
$contact["network"] = NETWORK_OSTATUS;
if (($contact["photo"] != $r[0]["photo"]) OR ($contact["name"] != $r[0]["name"]) OR ($contact["nick"] != $r[0]["nick"]) OR ($contact["addr"] != $r[0]["addr"]) OR
($contact["birthday"] != $r[0]["birthday"]) OR ($contact["gender"] != $r[0]["gender"]) OR ($contact["keywords"] != $r[0]["keywords"]) OR
($contact["hide"] != $r[0]["hide"]) OR ($contact["nsfw"] != $r[0]["nsfw"]) OR ($contact["network"] != $r[0]["network"]) OR
($contact["alias"] != $r[0]["alias"]) OR ($contact["notify"] != $r[0]["notify"]) OR ($contact["url"] != $r[0]["url"]) OR
($contact["location"] != $r[0]["location"]) OR ($contact["about"] != $r[0]["about"]) OR ($contact["generation"] < $r[0]["generation"])) {
q("UPDATE `gcontact` SET `photo` = '%s', `name` = '%s', `nick` = '%s', `addr` = '%s', `network` = '%s',
`birthday` = '%s', `gender` = '%s', `keywords` = %d, `hide` = %d, `nsfw` = %d,
`alias` = '%s', `notify` = '%s', `url` = '%s',
`location` = '%s', `about` = '%s', `generation` = %d, `updated` = '%s'
WHERE `nurl` = '%s' AND (`generation` = 0 OR `generation` >= %d)",
dbesc($contact["photo"]), dbesc($contact["name"]), dbesc($contact["nick"]),
dbesc($contact["addr"]), dbesc($contact["network"]), dbesc($contact["birthday"]),
dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]),
intval($contact["nsfw"]), dbesc($contact["alias"]), dbesc($contact["notify"]),
dbesc($contact["url"]), dbesc($contact["location"]), dbesc($contact["about"]),
intval($contact["generation"]), dbesc(datetime_convert()),
dbesc(normalise_link($contact["url"])), intval($contact["generation"]));
}
return $gcontact_id;
}
/**
* @brief Updates the gcontact entry from probe
*
* @param str $url profile link
*/
function update_gcontact_from_probe($url) {
$data = probe_url($url);
if ($data["network"] != NETWORK_PHANTOM)
update_gcontact($data);
}
/**
* @brief Fetches users of given GNU Social server
*
* If the "Statistics" plugin is enabled (See http://gstools.org/ for details) we query user data with this.
*
* @param str $server Server address
*/
function gs_fetch_users($server) {
logger("Fetching users from GNU Social server ".$server, LOGGER_DEBUG);
$a = get_app();
$url = $server."/main/statistics";
$result = z_fetch_url($url);
if (!$result["success"])
return false;
$statistics = json_decode($result["body"]);
if (is_object($statistics->config)) {
if ($statistics->config->instance_with_ssl)
$server = "https://";
else
$server = "http://";
$server .= $statistics->config->instance_address;
$hostname = $statistics->config->instance_address;
} else {
if ($statistics->instance_with_ssl)
$server = "https://";
else
$server = "http://";
$server .= $statistics->instance_address;
$hostname = $statistics->instance_address;
}
if (is_object($statistics->users))
foreach ($statistics->users AS $nick => $user) {
$profile_url = $server."/".$user->nickname;
$contact = array("url" => $profile_url,
"name" => $user->fullname,
"addr" => $user->nickname."@".$hostname,
"nick" => $user->nickname,
"about" => $user->bio,
"network" => NETWORK_OSTATUS,
"photo" => $a->get_baseurl()."/images/person-175.jpg");
get_gcontact_id($contact);
}
}
/**
* @brief Asking GNU Social server on a regular base for their user data
*
*/
function gs_discover() {
$requery_days = intval(get_config("system", "poco_requery_days"));
$last_update = date("c", time() - (60 * 60 * 24 * $requery_days));
$r = q("SELECT `nurl`, `url` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `network` = '%s' AND `last_poco_query` < '%s' ORDER BY RAND() LIMIT 5",
dbesc(NETWORK_OSTATUS), dbesc($last_update));
if (!$r)
return;
foreach ($r AS $server) {
gs_fetch_users($server["url"]);
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
}
}
?>

View File

@ -20,10 +20,10 @@ function replace_macros($s,$r) {
$stamp1 = microtime(true);
$a = get_app();
// pass $baseurl to all templates
$r['$baseurl'] = z_root();
$t = $a->template_engine();
try {
@ -895,9 +895,9 @@ function contact_block() {
$micropro = Null;
} else {
$r = q("SELECT * FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0
AND `hidden` = 0 AND `archive` = 0
$r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `micro`, `network` FROM `contact`
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending`
AND NOT `hidden` AND NOT `archive`
AND `network` IN ('%s', '%s', '%s') ORDER BY RAND() LIMIT %d",
intval($a->profile['uid']),
dbesc(NETWORK_DFRN),
@ -1415,7 +1415,14 @@ function prepare_body(&$item,$attach = false, $preview = false) {
$item['hashtags'] = $hashtags;
$item['mentions'] = $mentions;
put_item_in_cache($item, true);
// Update the cached values if there is no "zrl=..." on the links
$update = (!local_user() and !remote_user() and ($item["uid"] == 0));
// Or update it if the current viewer is the intented viewer
if (($item["uid"] == local_user()) AND ($item["uid"] != 0))
$update = true;
put_item_in_cache($item, $update);
$s = $item["rendered-html"];
$prep_arr = array('item' => $item, 'html' => $s, 'preview' => $preview);

View File

@ -1,6 +1,6 @@
<?php
function add_thread($itemid, $onlyshadow = false) {
$items = q("SELECT `uid`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`,
$items = q("SELECT `uid`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`, `gcontact-id`,
`deleted`, `origin`, `forum_mode`, `mention`, `network` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
if (!$items)
@ -66,6 +66,7 @@ function add_thread($itemid, $onlyshadow = false) {
unset($item[0]['id']);
$item[0]['uid'] = 0;
$item[0]['origin'] = 0;
$item[0]['contact-id'] = get_contact($item[0]['author-link'], 0);
$public_shadow = item_store($item[0], false, false, true);
@ -111,8 +112,8 @@ function update_thread_uri($itemuri, $uid) {
}
function update_thread($itemid, $setmention = false) {
$items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`,
`deleted`, `origin`, `forum_mode`, `network` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
$items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`, `gcontact-id`,
`deleted`, `origin`, `forum_mode`, `network`, `rendered-html`, `rendered-hash` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
if (!$items)
return;
@ -125,7 +126,7 @@ function update_thread($itemid, $setmention = false) {
$sql = "";
foreach ($item AS $field => $data)
if (!in_array($field, array("guid", "title", "body"))) {
if (!in_array($field, array("guid", "title", "body", "rendered-html", "rendered-hash"))) {
if ($sql != "")
$sql .= ", ";
@ -142,9 +143,11 @@ function update_thread($itemid, $setmention = false) {
if (!$items)
return;
$result = q("UPDATE `item` SET `title` = '%s', `body` = '%s' WHERE `id` = %d",
$result = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d",
dbesc($item["title"]),
dbesc($item["body"]),
dbesc($item["rendered-html"]),
dbesc($item["rendered-hash"]),
intval($items[0]["id"])
);
logger("Updating public shadow for post ".$items[0]["id"]." - guid ".$item["guid"]." Result: ".print_r($result, true), LOGGER_DEBUG);

View File

@ -556,6 +556,7 @@ EOT;
$page = $a->page;
$profile = $a->profile;
header("X-Friendica-Version: ".FRIENDICA_VERSION);
header("Content-type: text/html; charset=utf-8");

View File

@ -160,7 +160,9 @@
'inline' : true,
'transition' : 'elastic'
});
$("a.ajax-popupbox").colorbox({
'transition' : 'elastic'
});
/* notifications template */
var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());

11
library/Chart.js-1.0.2/Chart.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
Copyright (c) 2013-2015 Nick Downie
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,20 @@
# Chart.js
[![Build Status](https://travis-ci.org/nnnick/Chart.js.svg?branch=master)](https://travis-ci.org/nnnick/Chart.js) [![Code Climate](https://codeclimate.com/github/nnnick/Chart.js/badges/gpa.svg)](https://codeclimate.com/github/nnnick/Chart.js)
*Simple HTML5 Charts using the canvas element* [chartjs.org](http://www.chartjs.org)
## Documentation
You can find documentation at [chartjs.org/docs](http://www.chartjs.org/docs/). The markdown files that build the site are available under `/docs`. Please note - in some of the json examples of configuration you might notice some liquid tags - this is just for the generating the site html, please disregard.
## Bugs, issues and contributing
Before submitting an issue or a pull request to the project, please take a moment to look over the [contributing guidelines](https://github.com/nnnick/Chart.js/blob/master/CONTRIBUTING.md) first.
For support using Chart.js, please post questions with the [`chartjs` tag on Stack Overflow](http://stackoverflow.com/questions/tagged/chartjs).
## License
Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT).

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,10 @@ function community_content(&$a, $update = 0) {
$o = '';
// Currently the community page isn't able to handle update requests
if ($update)
return;
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
notice( t('Public access denied.') . EOL);
return;
@ -143,14 +147,13 @@ function community_getpublicitems($start, $itemspage) {
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
`author-name` AS `name`, `owner-avatar` AS `photo`,
`owner-link` AS `url`, `owner-avatar` AS `thumb`
FROM `item` WHERE `item`.`uid` = 0 AND `item`.`id` = `item`.`parent`
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
ORDER BY `item`.`received` DESC LIMIT %d, %d",
FROM `thread`
INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
WHERE `thread`.`uid` = 0
ORDER BY `thread`.`created` DESC LIMIT %d, %d",
intval($start),
intval($itemspage)
);
return($r);
}

View File

@ -125,7 +125,7 @@ function contacts_batch_actions(&$a){
}
}
if ($count_actions>0) {
info ( sprintf( tt("%d contact edited.", "%d contacts edited", $count_actions), $count_actions) );
info ( sprintf( tt("%d contact edited.", "%d contacts edited.", $count_actions), $count_actions) );
}
if(x($_SESSION,'return_url'))
@ -302,7 +302,7 @@ function _contact_update_profile($contact_id) {
`uri-date` = '%s',
`avatar-date` = '%s'
WHERE `id` = %d",
dbesc($photos[0]),
dbesc($data["photo"]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc(datetime_convert()),
@ -311,6 +311,8 @@ function _contact_update_profile($contact_id) {
intval($contact_id)
);
// Update the entry in the gcontact table
update_gcontact_from_probe($data["url"]);
}
function _contact_block($contact_id, $orig_record) {
@ -345,7 +347,6 @@ function _contact_archive($contact_id, $orig_record) {
return $r;
}
function _contact_drop($contact_id, $orig_record) {
require_once('include/Contact.php');
$a = get_app();
terminate_friendship($a->user,$a->contact,$orig_record);
@ -890,50 +891,24 @@ function contacts_tab($a, $contact_id, $active_tab) {
function contact_posts($a, $contact_id) {
require_once('include/conversation.php');
$r = q("SELECT * FROM `contact` WHERE `id` = %d", intval($contact_id));
$r = q("SELECT `url` FROM `contact` WHERE `id` = %d", intval($contact_id));
if ($r) {
$contact = $r[0];
$a->page['aside'] = "";
profile_load($a, "", 0, get_contact_details_by_url($contact["url"]));
}
if(get_config('system', 'old_pager')) {
$r = q("SELECT COUNT(*) AS `total` FROM `item`
WHERE `item`.`uid` = %d AND `author-link` IN ('%s', '%s')",
intval(local_user()),
dbesc(str_replace("https://", "http://", $contact["url"])),
dbesc(str_replace("http://", "https://", $contact["url"])));
$a->set_pager_total($r[0]['total']);
}
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
`author-name` AS `name`, `owner-avatar` AS `photo`,
`owner-link` AS `url`, `owner-avatar` AS `thumb`
FROM `item` FORCE INDEX (uid_contactid_created)
WHERE `item`.`uid` = %d AND `contact-id` = %d
AND `author-link` IN ('%s', '%s')
ORDER BY `item`.`created` DESC LIMIT %d, %d",
intval(local_user()),
intval($contact_id),
dbesc(str_replace("https://", "http://", $contact["url"])),
dbesc(str_replace("http://", "https://", $contact["url"])),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
} else
$profile = "";
$tab_str = contacts_tab($a, $contact_id, 1);
$o .= $tab_str;
$o .= conversation($a,$r,'community',false);
if ($contact["url"]) {
$r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($contact["url"])));
if(!get_config('system', 'old_pager')) {
$o .= alt_pager($a,count($r));
} else {
$o .= paginate($a);
if ($r[0]["id"] <> 0)
$o .= posts_from_gcontact($a, $r[0]["id"]);
}
return $o;

View File

@ -94,9 +94,15 @@ function dirfind_content(&$a, $prefix = "") {
else
$ostatus = NETWORK_DFRN;
$count = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND
(`url` REGEXP '%s' OR `name` REGEXP '%s' OR `location` REGEXP '%s' OR
`about` REGEXP '%s' OR `keywords` REGEXP '%s')".$extra_sql,
$count = q("SELECT count(*) AS `total` FROM `gcontact`
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
(`gcontact`.`url` REGEXP '%s' OR `gcontact`.`name` REGEXP '%s' OR `gcontact`.`location` REGEXP '%s' OR
`gcontact`.`about` REGEXP '%s' OR `gcontact`.`keywords` REGEXP '%s') $extra_sql",
intval(local_user()), dbesc(CONTACT_IS_SHARING), dbesc(CONTACT_IS_FRIEND),
dbesc(NETWORK_DFRN), dbesc($ostatus), dbesc($diaspora),
dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)),
dbesc(escape_tags($search)), dbesc(escape_tags($search)));
@ -106,8 +112,8 @@ function dirfind_content(&$a, $prefix = "") {
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
WHERE `gcontact`.`network` IN ('%s', '%s', '%s') AND
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)) AND
WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
(`gcontact`.`url` REGEXP '%s' OR `gcontact`.`name` REGEXP '%s' OR `gcontact`.`location` REGEXP '%s' OR
`gcontact`.`about` REGEXP '%s' OR `gcontact`.`keywords` REGEXP '%s') $extra_sql
GROUP BY `gcontact`.`nurl`

View File

@ -154,42 +154,53 @@ function display_fetchauthor($a, $item) {
$profiledata["about"] = "";
}
// Don't show details from Diaspora contacts if you don't follow the contact
$showdetails = ($profiledata["network"] != NETWORK_DIASPORA);
// Fetching further contact data from the contact table
$r = q("SELECT `uid`, `network`, `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` = '%s'",
dbesc(normalise_link($profiledata["url"])), intval($item["uid"]), dbesc($item["network"]));
$r = q("SELECT `uid`, `network`, `name`, `photo`, `nick`, `addr`, `location`, `about`, `gender`, `keywords`
FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` = '%s' AND `rel` IN (%d, %d)",
dbesc(normalise_link($profiledata["url"])), intval(local_user()), dbesc($item["network"]),
intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND));
if (!count($r))
$r = q("SELECT `uid`, `network`, `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
dbesc(normalise_link($profiledata["url"])), intval($item["uid"]));
if (!count($r))
$r = q("SELECT `uid`, `network`, `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
dbesc(normalise_link($profiledata["url"])));
$r = q("SELECT `uid`, `network`, `name`, `photo`, `nick`, `addr`, `location`, `about`, `gender`, `keywords`
FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `rel` IN (%d, %d)",
dbesc(normalise_link($profiledata["url"])), intval(local_user()),
intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND));
if (count($r)) {
if ((($r[0]["uid"] != local_user()) OR !local_user()) AND ($profiledata["network"] == NETWORK_DIASPORA)) {
$r[0]["location"] = "";
$r[0]["about"] = "";
}
$profiledata["name"] = $r[0]["name"];
$profiledata["photo"] = $r[0]["photo"];
$profiledata["address"] = $r[0]["location"];
$profiledata["about"] = $r[0]["about"];
if ($r[0]["nick"] != "")
$profiledata["nickname"] = $r[0]["nick"];
$profiledata["nickname"] = $r[0]["nick"];
$profiledata["addr"] = $r[0]["addr"];
$profiledata["keywords"] = $r[0]["keywords"];
$profiledata["network"] = $r[0]["network"];
if (local_user() OR $showdetails) {
$showdetails = true;
$profiledata["address"] = $r[0]["location"];
$profiledata["about"] = $r[0]["about"];
$profiledata["gender"] = $r[0]["gender"];
}
}
// Fetching profile data from unique contacts
$r = q("SELECT `avatar`, `nick`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($profiledata["url"])));
if (count($r)) {
if ($profiledata["photo"] == "")
$profiledata["photo"] = $r[0]["avatar"];
if (($profiledata["address"] == "") AND ($profiledata["network"] != NETWORK_DIASPORA))
$profiledata["address"] = $r[0]["location"];
if (($profiledata["about"] == "") AND ($profiledata["network"] != NETWORK_DIASPORA))
$profiledata["about"] = $r[0]["about"];
if (($profiledata["nickname"] == "") AND ($r[0]["nick"] != ""))
// Fetching profile data from global contacts
if ($profiledata["network"] != NETWORK_FEED) {
$r = q("SELECT `name`, `photo`, `nick`, `addr`, `location`, `about`, `gender`, `keywords`, `network` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($profiledata["url"])));
if (count($r)) {
$profiledata["name"] = $r[0]["name"];
$profiledata["photo"] = $r[0]["photo"];
$profiledata["nickname"] = $r[0]["nick"];
$profiledata["addr"] = $r[0]["addr"];
$profiledata["keywords"] = $r[0]["keywords"];
$profiledata["network"] = $r[0]["network"];
if ($showdetails) {
$profiledata["address"] = $r[0]["location"];
$profiledata["about"] = $r[0]["about"];
$profiledata["gender"] = $r[0]["gender"];
}
}
}
if (local_user()) {
@ -329,6 +340,10 @@ function display_content(&$a, $update = 0) {
return;
}
// Why do we need this on the display page? We don't have the possibility to write new content here.
// Ad editing of posts work without this as well.
// We should remove this completely for the 3.5.1 release.
/*
if ($is_owner) {
$x = array(
'is_owner' => true,
@ -344,6 +359,7 @@ function display_content(&$a, $update = 0) {
);
$o .= status_editor($a,$x,0,true);
}
*/
$sql_extra = item_permissions_sql($a->profile['uid'],$remote_contact,$groups);

View File

@ -2,6 +2,7 @@
require_once('include/Scrape.php');
require_once('include/follow.php');
require_once('include/Contact.php');
require_once('include/contact_selectors.php');
function follow_content(&$a) {
@ -75,15 +76,18 @@ function follow_content(&$a) {
}
$myaddr = $r[0]["url"];
$gcontact_id = 0;
// Makes the connection request for friendica contacts easier
$_SESSION["fastlane"] = $ret["url"];
$r = q("SELECT `location`, `about`, `keywords` FROM `gcontact` WHERE `nurl` = '%s'",
$r = q("SELECT `id`, `location`, `about`, `keywords` FROM `gcontact` WHERE `nurl` = '%s'",
normalise_link($ret["url"]));
if (!$r)
$r = array(array("location" => "", "about" => "", "keywords" => ""));
else
$gcontact_id = $r[0]["id"];
if($ret['network'] === NETWORK_DIASPORA) {
$r[0]["location"] = "";
@ -95,11 +99,12 @@ function follow_content(&$a) {
if ($ret["addr"] != "")
$header .= " <".$ret["addr"].">";
$header .= " (".network_to_name($ret['network'], $ret['url']).")";
//$header .= " (".network_to_name($ret['network'], $ret['url']).")";
$header = t("Connect/Follow");
$o = replace_macros($tpl,array(
'$header' => htmlentities($header),
'$photo' => proxy_url($ret["photo"], false, PROXY_SIZE_SMALL),
//'$photo' => proxy_url($ret["photo"], false, PROXY_SIZE_SMALL),
'$desc' => "",
'$pls_answer' => t('Please answer the following:'),
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$ret["name"]), false, '', array(t('No'),t('Yes'))),
@ -121,13 +126,26 @@ function follow_content(&$a) {
'$url_label' => t("Profile URL"),
'$myaddr' => $myaddr,
'$request' => $request,
'$location' => bbcode($r[0]["location"]),
/*'$location' => bbcode($r[0]["location"]),
'$location_label' => t("Location:"),
'$about' => bbcode($r[0]["about"], false, false),
'$about_label' => t("About:"),
'$about_label' => t("About:"), */
'$keywords' => $r[0]["keywords"],
'$keywords_label' => t("Tags:")
));
$a->page['aside'] = "";
profile_load($a, "", 0, get_contact_details_by_url($ret["url"]));
// Show last public posts
if ($gcontact_id <> 0) {
$o .= replace_macros(get_markup_template('section_title.tpl'),
array('$title' => t('Status Messages and Posts')
));
$o .= posts_from_gcontact($a, $gcontact_id);
}
return $o;
}

View File

@ -29,10 +29,21 @@ function friendica_init(&$a) {
$visible_plugins[] = $rr['name'];
}
load_config('feature_lock');
$locked_features = array();
if(is_array($a->config['feature_lock']) && count($a->config['feature_lock'])) {
foreach($a->config['feature_lock'] as $k => $v) {
if($k === 'config_loaded')
continue;
$locked_features[$k] = intval($v);
}
}
$data = Array(
'version' => FRIENDICA_VERSION,
'url' => z_root(),
'plugins' => $visible_plugins,
'locked_features' => $locked_features,
'register_policy' => $register_policy[$a->config['register_policy']],
'admin' => $admin,
'site_name' => $a->config['sitename'],

View File

@ -137,14 +137,25 @@ function item_post(&$a) {
AND (normalise_link($parent_contact["url"]) != normalise_link($thrparent[0]["author-link"]))) {
$parent_contact = null;
require_once("include/Scrape.php");
$probed_contact = probe_url($thrparent[0]["author-link"]);
if ($probed_contact["network"] != NETWORK_FEED) {
$parent_contact = $probed_contact;
$parent_contact["nurl"] = normalise_link($probed_contact["url"]);
$parent_contact["thumb"] = $probed_contact["photo"];
$parent_contact["micro"] = $probed_contact["photo"];
$parent_contact["addr"] = $probed_contact["addr"];
$r = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($thrparent[0]["author-link"])));
if (count($r)) {
$parent_contact = $r[0];
$parent_contact["thumb"] = $parent_contact["photo"];
$parent_contact["micro"] = $parent_contact["photo"];
unset($parent_contact["id"]);
}
if (!isset($parent_contact["nick"])) {
require_once("include/Scrape.php");
$probed_contact = probe_url($thrparent[0]["author-link"]);
if ($probed_contact["network"] != NETWORK_FEED) {
$parent_contact = $probed_contact;
$parent_contact["nurl"] = normalise_link($probed_contact["url"]);
$parent_contact["thumb"] = $probed_contact["photo"];
$parent_contact["micro"] = $probed_contact["photo"];
$parent_contact["addr"] = $probed_contact["addr"];
}
}
logger('no contact found: '.print_r($thrparent, true), LOGGER_DEBUG);
} else
@ -693,7 +704,8 @@ function item_post(&$a) {
$datarray['postopts'] = $postopts;
$datarray['origin'] = $origin;
$datarray['moderated'] = $allow_moderated;
$datarray['gcontact-id'] = get_gcontact_id(array("url" => $datarray['author-link'], "network" => $datarray['network'],
"photo" => $datarray['author-avatar'], "name" => $datarray['author-name']));
/**
* These fields are for the convenience of plugins...
* 'self' if true indicates the owner is posting on their own wall
@ -888,7 +900,7 @@ function item_post(&$a) {
// Store the comment signature information in case we need to relay to Diaspora
store_diaspora_comment_sig($datarray, $author, ($self ? $a->user['prvkey'] : false), $parent_item, $post_id);
store_diaspora_comment_sig($datarray, $author, ($self ? $user['prvkey'] : false), $parent_item, $post_id);
} else {
$parent = $post_id;
@ -1060,6 +1072,8 @@ function item_content(&$a) {
* @return boolean true if replaced, false if not replaced
*/
function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $network = "") {
require_once("include/Scrape.php");
require_once("include/socgraph.php");
$replaced = false;
$r = null;
@ -1094,122 +1108,115 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo
$stat = false;
//get the person's name
$name = substr($tag,1);
//is it a link or a full dfrn address?
if((strpos($name,'@')) || (strpos($name,'http://'))) {
$newname = $name;
//get the profile links
$links = @lrdd($name);
if(count($links)) {
//for all links, collect how is to inform and how's profile is to link
foreach($links as $link) {
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
$profile = $link['@attributes']['href'];
if($link['@attributes']['rel'] === 'salmon') {
if(strlen($inform))
$inform .= ',';
$inform .= 'url:' . str_replace(',','%2c',$link['@attributes']['href']);
}
// Sometimes the tag detection doesn't seem to work right
// This is some workaround
$nameparts = explode(" ", $name);
$name = $nameparts[0];
// Try to detect the contact in various ways
if ((strpos($name,'@')) || (strpos($name,'http://'))) {
// Is it in format @user@domain.tld or @http://domain.tld/...?
// First check the contact table for the address
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network`, `notify` FROM `contact` WHERE `addr` = '%s' AND `uid` = %d LIMIT 1",
dbesc($name),
intval($profile_uid)
);
// Then check in the contact table for the url
if (!$r)
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `notify`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
dbesc(normalise_link($name)),
intval($profile_uid)
);
// Then check in the global contacts for the address
if (!$r)
$r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `addr` = '%s' LIMIT 1", dbesc($name));
// Then check in the global contacts for the url
if (!$r)
$r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", dbesc(normalise_link($name)));
// If the data isn't complete then refetch the data
if ($r AND ($r[0]["network"] == NETWORK_OSTATUS) AND (($r[0]["notify"] == "") OR ($r[0]["alias"] == "")))
$r = false;
if (!$r) {
$probed = probe_url($name);
if (isset($probed["url"])) {
update_gcontact($probed);
$r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($probed["url"])));
}
}
} elseif (($network != NETWORK_OSTATUS) AND ($network != NETWORK_TWITTER) AND
($network != NETWORK_STATUSNET) AND ($network != NETWORK_APPNET)) {
//if it is a name rather than an address
$newname = $name;
$alias = '';
$tagcid = 0;
//is it some generated name?
if(strrpos($newname,'+')) {
//get the id
$tagcid = intval(substr($newname,strrpos($newname,'+') + 1));
//remove the next word from tag's name
if(strpos($name,' ')) {
$name = substr($name,0,strpos($name,' '));
}
}
if($tagcid) { //if there was an id
//select contact with that id from the logged in user's contact list
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
} else {
$r = false;
if (strrpos($name,'+')) {
// Is it in format @nick+number?
$tagcid = intval(substr($name,strrpos($name,'+') + 1));
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($tagcid),
intval($profile_uid)
);
}
else {
$newname = str_replace('_',' ',$name);
// At first try to fetch a contact according to the given network
if ($network != "") {
//select someone from this user's contacts by name
$r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
dbesc($newname),
dbesc($network),
intval($profile_uid)
);
if(! $r) {
//select someone by attag or nick and the name passed in
$r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
dbesc($name),
dbesc($name),
dbesc($network),
intval($profile_uid)
);
}
} else
$r = false;
//select someone by attag or nick and the name passed in the current network
if(!$r AND ($network != ""))
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
dbesc($name),
dbesc($name),
dbesc($network),
intval($profile_uid)
);
if(! $r) {
//select someone from this user's contacts by name
$r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
dbesc($newname),
intval($profile_uid)
);
}
//select someone from this user's contacts by name in the current network
if (!$r AND ($network != ""))
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
dbesc($newname),
dbesc($network),
intval($profile_uid)
);
if(! $r) {
//select someone by attag or nick and the name passed in
$r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
dbesc($name),
dbesc($name),
intval($profile_uid)
);
}
}
/* } elseif(strstr($name,'_') || strstr($name,' ')) { //no id
//get the real name
$newname = str_replace('_',' ',$name);
//select someone from this user's contacts by name
$r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
//select someone by attag or nick and the name passed in
if(!$r)
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
dbesc($name),
dbesc($name),
intval($profile_uid)
);
//select someone from this user's contacts by name
if(!$r)
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
dbesc($newname),
intval($profile_uid)
);
} else {
//select someone by attag or nick and the name passed in
$r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
dbesc($name),
dbesc($name),
intval($profile_uid)
);
}*/
//$r is set, if someone could be selected
if(count($r)) {
$profile = $r[0]['url'];
//set newname to nick, find alias
if(($r[0]['network'] === NETWORK_OSTATUS) OR ($r[0]['network'] === NETWORK_TWITTER)
OR ($r[0]['network'] === NETWORK_STATUSNET) OR ($r[0]['network'] === NETWORK_APPNET)) {
$newname = $r[0]['nick'];
$stat = true;
if($r[0]['alias'])
$alias = $r[0]['alias'];
}
else
$newname = $r[0]['name'];
//add person's id to $inform
if(strlen($inform))
$inform .= ',';
$inform .= 'cid:' . $r[0]['id'];
}
}
if ($r) {
if(strlen($inform) AND (isset($r[0]["notify"]) OR isset($r[0]["id"])))
$inform .= ',';
if (isset($r[0]["id"]))
$inform .= 'cid:' . $r[0]["id"];
elseif (isset($r[0]["notify"]))
$inform .= $r[0]["notify"];
$profile = $r[0]["url"];
$alias = $r[0]["alias"];
$newname = $r[0]["nick"];
if (($newname == "") OR (($r[0]["network"] != NETWORK_OSTATUS) AND ($r[0]["network"] != NETWORK_TWITTER)
AND ($r[0]["network"] != NETWORK_STATUSNET) AND ($r[0]["network"] != NETWORK_APPNET)))
$newname = $r[0]["name"];
}
//if there is an url for this persons profile
if(isset($profile)) {
$replaced = true;
//create profile link
$profile = str_replace(',','%2c',$profile);
@ -1264,7 +1271,7 @@ function store_diaspora_comment_sig($datarray, $author, $uprvkey, $parent_item,
$signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $diaspora_handle;
if( $uprvkey !== false )
$authorsig = base64_encode(rsa_sign($signed_text,$uprvkey,'sha256'));
$authorsig = rsa_sign($signed_text,$uprvkey,'sha256');
else
$authorsig = '';

View File

@ -312,6 +312,9 @@ function network_content(&$a, $update = 0) {
return login(false);
}
// Rawmode is used for fetching new content at the end of the page
$rawmode = (isset($_GET["mode"]) AND ($_GET["mode"] == "raw"));
/// @TODO Is this really necessary? $a is already available to hooks
$arr = array('query' => $a->query_string);
call_hooks('network_content_init', $arr);
@ -470,7 +473,7 @@ function network_content(&$a, $update = 0) {
}
set_pconfig(local_user(), 'network.view', 'net.selected', ($nets ? $nets : 'all'));
if(! $update) {
if(!$update AND !$rawmode) {
if($group) {
if(($t = group_public_members($group)) && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
notice( sprintf( tt('Warning: This group contains %s member from an insecure network.',
@ -549,27 +552,30 @@ function network_content(&$a, $update = 0) {
}
$contacts = expand_groups(array($group));
$contact_str_self = "";
$gcontacts = expand_groups(array($group), false, true);
if((is_array($contacts)) && count($contacts)) {
$contact_str_self = "";
$gcontact_str_self = "";
$contact_str = implode(',',$contacts);
$self = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", intval($_SESSION['uid']));
if (count($self))
$contact_str_self = ",".$self[0]["id"];
}
else {
$contact_str = ' 0 ';
$gcontact_str = implode(',',$gcontacts);
$self = q("SELECT `contact`.`id`, `gcontact`.`id` AS `gid` FROM `contact`
INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
WHERE `uid` = %d AND `self`", intval($_SESSION['uid']));
if (count($self)) {
$contact_str_self = $self[0]["id"];
$gcontact_str_self = $self[0]["gid"];
}
$sql_post_table = " INNER JOIN `item` AS `temp1` ON `temp1`.`id` = ".$sql_table.".".$sql_parent;
$sql_extra3 .= " AND ($sql_table.`contact-id` IN ($contact_str) ";
$sql_extra3 .= " OR ($sql_table.`contact-id` = '$contact_str_self' AND `temp1`.`allow_gid` LIKE '".protect_sprintf('%<'.intval($group).'>%')."' AND `temp1`.`private`))";
} else {
$sql_extra3 .= " AND false ";
info( t('Group is empty'));
}
//$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item` WHERE (`contact-id` IN ($contact_str) OR `allow_gid` like '".protect_sprintf('%<'.intval($group).'>%')."') and deleted = 0 ORDER BY `created` DESC) AS `temp1` ON $sql_table.$sql_parent = `temp1`.`parent` ";
$sql_extra3 .= " AND `contact-id` IN ($contact_str$contact_str_self) ";
$sql_extra3 .= " AND EXISTS (SELECT `id` FROM `item` WHERE (`contact-id` IN ($contact_str)
OR `allow_gid` LIKE '".protect_sprintf('%<'.intval($group).'>%')."') AND `deleted` = 0
AND `parent` = $sql_table.$sql_parent) ";
$o = replace_macros(get_markup_template("section_title.tpl"),array(
'$title' => sprintf( t('Group: %s'), $r[0]['name'])
)) . $o;
@ -582,11 +588,7 @@ function network_content(&$a, $update = 0) {
intval($cid)
);
if(count($r)) {
$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item`
WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." AND `deleted` = 0
ORDER BY `item`.`received` DESC) AS `temp1`
ON $sql_table.$sql_parent = `temp1`.`parent` ";
$sql_extra = "";
$sql_extra = " AND ".$sql_table.".`contact-id` = ".intval($cid);
$entries[0] = array(
'id' => 'network',
@ -668,7 +670,7 @@ function network_content(&$a, $update = 0) {
}
if($conv)
$sql_extra3 .= " AND `mention`";
$sql_extra3 .= " AND $sql_table.`mention`";
if($update) {

View File

@ -45,11 +45,6 @@ function newmember_content(&$a) {
$o .= '<ul>';
if(in_array('facebook', $a->plugins))
$o .= '<li>' . '<a target="newmember" href="facebook">' . t('Facebook') . '</a><br />' . t("Authorise the Facebook Connector if you currently have a Facebook account and we will \x28optionally\x29 import all your Facebook friends and conversations.") . '</li>' . EOL;
else
$o .= '<li>' . '<a target="newmember" href="help/Installing-Connectors">' . t('Facebook') . '</a><br />' . t("<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web.") . '</li>' . EOL;
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
if(! $mail_disabled)

View File

@ -56,7 +56,15 @@ function completeurl($url, $scheme) {
function parseurl_getsiteinfo_cached($url, $no_guessing = false, $do_oembed = true) {
$data = Cache::get("parse_url:".$no_guessing.":".$do_oembed.":".$url);
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;
@ -64,13 +72,15 @@ function parseurl_getsiteinfo_cached($url, $no_guessing = false, $do_oembed = tr
$data = parseurl_getsiteinfo($url, $no_guessing, $do_oembed);
Cache::set("parse_url:".$no_guessing.":".$do_oembed.":".$url,serialize($data), CACHE_DAY);
q("INSERT INTO `parsed_url` (`url`, `guessing`, `oembed`, `content`, `created`) VALUES ('%s', %d, %d, '%s', '%s')",
dbesc(normalise_link($url)), intval(!$no_guessing), intval($do_oembed), dbesc(serialize($data)), dbesc(datetime_convert()));
return $data;
}
function parseurl_getsiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1) {
require_once("include/network.php");
require_once("include/Photo.php");
$a = get_app();
@ -321,7 +331,7 @@ function parseurl_getsiteinfo($url, $no_guessing = false, $do_oembed = true, $co
$attr[$attribute->name] = $attribute->value;
$src = completeurl($attr["src"], $url);
$photodata = @getimagesize($src);
$photodata = get_photo_info($src);
if (($photodata) && ($photodata[0] > 150) and ($photodata[1] > 150)) {
if ($photodata[0] > 300) {
@ -338,12 +348,12 @@ function parseurl_getsiteinfo($url, $no_guessing = false, $do_oembed = true, $co
}
}
} else {
} elseif ($siteinfo["image"] != "") {
$src = completeurl($siteinfo["image"], $url);
unset($siteinfo["image"]);
$photodata = @getimagesize($src);
$photodata = get_photo_info($src);
if (($photodata) && ($photodata[0] > 10) and ($photodata[1] > 10))
$siteinfo["images"][] = array("src"=>$src,

View File

@ -61,8 +61,7 @@ function poco_init(&$a) {
$update_limit = date("Y-m-d H:i:s",strtotime($_GET['updatedSince']));
if ($global) {
//$r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND ((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND `network` IN ('%s')",
$r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND `network` IN ('%s', '%s', '%s')",
$r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND NOT `hide` AND `network` IN ('%s', '%s', '%s')",
dbesc($update_limit),
dbesc(NETWORK_DFRN),
dbesc(NETWORK_DIASPORA),
@ -94,8 +93,7 @@ function poco_init(&$a) {
if ($global) {
logger("Start global query", LOGGER_DEBUG);
//$r = q("SELECT * FROM `gcontact` WHERE `updated` > '%s' AND `network` IN ('%s') AND ((`last_contact` >= `last_failure`) OR (`updated` > `last_failure`)) LIMIT %d, %d",
$r = q("SELECT * FROM `gcontact` WHERE `updated` > '%s' AND `network` IN ('%s', '%s', '%s') AND `updated` > `last_failure`
$r = q("SELECT * FROM `gcontact` WHERE `updated` > '%s' AND NOT `hide` AND `network` IN ('%s', '%s', '%s') AND `updated` > `last_failure`
ORDER BY `updated` DESC LIMIT %d, %d",
dbesc($update_limit),
dbesc(NETWORK_DFRN),

View File

@ -43,57 +43,67 @@ function settings_init(&$a) {
'selected' => (($a->argc == 1) && ($a->argv[0] === 'settings')?'active':''),
'accesskey' => 'o',
),
array(
'label' => t('Additional features'),
'url' => $a->get_baseurl(true).'/settings/features',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'features') ? 'active' : ''),
'accesskey' => 't',
),
array(
'label' => t('Display'),
'url' => $a->get_baseurl(true).'/settings/display',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'display')?'active':''),
'accesskey' => 'i',
),
array(
'label' => t('Social Networks'),
'url' => $a->get_baseurl(true).'/settings/connectors',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'connectors')?'active':''),
'accesskey' => 'w',
),
array(
'label' => t('Plugins'),
'url' => $a->get_baseurl(true).'/settings/addon',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'addon')?'active':''),
'accesskey' => 'l',
),
array(
'label' => t('Delegations'),
'url' => $a->get_baseurl(true).'/delegate',
'selected' => (($a->argc == 1) && ($a->argv[0] === 'delegate')?'active':''),
'accesskey' => 'd',
),
array(
'label' => t('Connected apps'),
'url' => $a->get_baseurl(true) . '/settings/oauth',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'oauth')?'active':''),
'accesskey' => 'b',
),
array(
'label' => t('Export personal data'),
'url' => $a->get_baseurl(true) . '/uexport',
'selected' => (($a->argc == 1) && ($a->argv[0] === 'uexport')?'active':''),
'accesskey' => 'e',
),
array(
'label' => t('Remove account'),
'url' => $a->get_baseurl(true) . '/removeme',
'selected' => (($a->argc == 1) && ($a->argv[0] === 'removeme')?'active':''),
'accesskey' => 'r',
)
);
if(get_features()) {
$tabs[] = array(
'label' => t('Additional features'),
'url' => $a->get_baseurl(true).'/settings/features',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'features') ? 'active' : ''),
'accesskey' => 't',
);
}
$tabs[] = array(
'label' => t('Display'),
'url' => $a->get_baseurl(true).'/settings/display',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'display')?'active':''),
'accesskey' => 'i',
);
$tabs[] = array(
'label' => t('Social Networks'),
'url' => $a->get_baseurl(true).'/settings/connectors',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'connectors')?'active':''),
'accesskey' => 'w',
);
$tabs[] = array(
'label' => t('Plugins'),
'url' => $a->get_baseurl(true).'/settings/addon',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'addon')?'active':''),
'accesskey' => 'l',
);
$tabs[] = array(
'label' => t('Delegations'),
'url' => $a->get_baseurl(true).'/delegate',
'selected' => (($a->argc == 1) && ($a->argv[0] === 'delegate')?'active':''),
'accesskey' => 'd',
);
$tabs[] = array(
'label' => t('Connected apps'),
'url' => $a->get_baseurl(true) . '/settings/oauth',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'oauth')?'active':''),
'accesskey' => 'b',
);
$tabs[] = array(
'label' => t('Export personal data'),
'url' => $a->get_baseurl(true) . '/uexport',
'selected' => (($a->argc == 1) && ($a->argv[0] === 'uexport')?'active':''),
'accesskey' => 'e',
);
$tabs[] = array(
'label' => t('Remove account'),
'url' => $a->get_baseurl(true) . '/removeme',
'selected' => (($a->argc == 1) && ($a->argv[0] === 'removeme')?'active':''),
'accesskey' => 'r',
);
$tabtpl = get_markup_template("generic_links_widget.tpl");
$a->page['aside'] = replace_macros($tabtpl, array(
'$title' => t('Settings'),
@ -622,7 +632,6 @@ function settings_post(&$a) {
}
if(! function_exists('settings_content')) {
function settings_content(&$a) {
$o = '';
@ -747,7 +756,7 @@ function settings_content(&$a) {
$arr[$fname] = array();
$arr[$fname][0] = $fdata[0];
foreach(array_slice($fdata,1) as $f) {
$arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(get_pconfig(local_user(),'feature',$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
$arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_user(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
}
}
@ -1287,5 +1296,5 @@ function settings_content(&$a) {
return $o;
}}
}

View File

@ -1,6 +1,6 @@
<?php
define( 'UPDATE_VERSION' , 1191 );
define( 'UPDATE_VERSION' , 1193 );
/**
*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@ $a->strings["Network:"] = "Netzwerk";
$a->strings["Forum"] = "Forum";
$a->strings["%d contact edited."] = array(
0 => "%d Kontakt bearbeitet.",
1 => "%d Kontakte bearbeitet",
1 => "%d Kontakte bearbeitet.",
);
$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
@ -142,9 +142,6 @@ $a->strings["Edit your <strong>default</strong> profile to your liking. Review t
$a->strings["Profile Keywords"] = "Profil Schlüsselbegriffe";
$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in Dein Standardprofil ein, die Deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die Deine Interessen teilen und können Dir dann Kontakte vorschlagen.";
$a->strings["Connecting"] = "Verbindungen knüpfen";
$a->strings["Facebook"] = "Facebook";
$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn Du im Augenblick ein Facebook-Konto hast und (optional) Deine Facebook-Freunde und -Unterhaltungen importieren willst.";
$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Wenn</em> dies Dein privater Server ist, könnte die Installation des Facebook Connectors Deinen Umzug ins freie soziale Netz angenehmer gestalten.";
$a->strings["Importing Emails"] = "Emails Importieren";
$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib Deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls Du E-Mails aus Deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willst.";
$a->strings["Go to Your Contacts Page"] = "Gehe zu deiner Kontakt-Seite";
@ -290,12 +287,6 @@ $a->strings["Forgot your Password?"] = "Hast Du Dein Passwort vergessen?";
$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse an und fordere ein neues Passwort an. Es werden Dir dann weitere Informationen per Mail zugesendet.";
$a->strings["Nickname or Email: "] = "Spitzname oder E-Mail:";
$a->strings["Reset"] = "Zurücksetzen";
$a->strings["event"] = "Event";
$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
$a->strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil.";
$a->strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt nicht an %2\$ss %3\$s teil.";
$a->strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt eventuell an %2\$ss %3\$s teil.";
$a->strings["{0} wants to be your friend"] = "{0} möchte mit Dir in Kontakt treten";
$a->strings["{0} sent you a message"] = "{0} schickte Dir eine Nachricht";
$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
@ -425,16 +416,22 @@ $a->strings["Site"] = "Seite";
$a->strings["Users"] = "Nutzer";
$a->strings["Plugins"] = "Plugins";
$a->strings["Themes"] = "Themen";
$a->strings["Additional features"] = "Zusätzliche Features";
$a->strings["DB updates"] = "DB Updates";
$a->strings["Inspect Queue"] = "Warteschlange Inspizieren";
$a->strings["Federation Statistics"] = "Federation Statistik";
$a->strings["Logs"] = "Protokolle";
$a->strings["View Logs"] = "Protokolle anzeigen";
$a->strings["probe address"] = "Adresse untersuchen";
$a->strings["check webfinger"] = "Webfinger überprüfen";
$a->strings["Admin"] = "Administration";
$a->strings["Plugin Features"] = "Plugin Features";
$a->strings["diagnostics"] = "Diagnose";
$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
$a->strings["This page offers you some numbers to the known part of the federated social network your Friendica node is part of. These numbers are not complete but only reflect the part of the network your node is aware of."] = "Diese Seite präsentiert einige Zahlen zu dem bekannten Teil des föderalen sozialen Netzwerks, von dem deine Friendica Installation ein Teil ist. Diese Zahlen sind nicht absolut und reflektieren nur den Teil des Netzwerks, den dein Knoten kennt.";
$a->strings["The <em>Auto Discovered Contact Directory</em> feature is not enabled, it will improve the data displayed here."] = "Die Funktion um <em>Automatisch ein Kontaktverzeichnis erstellen</em> ist nicht aktiv. Es wird die hier angezeigten Daten verbessern.";
$a->strings["Administration"] = "Administration";
$a->strings["Currently this node is aware of nodes from the following platforms:"] = "Momentan kennt dieser Knoten andere Knoten der folgenden Plattformen:";
$a->strings["ID"] = "ID";
$a->strings["Recipient Name"] = "Empfänger Name";
$a->strings["Recipient Profile"] = "Empfänger Profil";
@ -686,9 +683,11 @@ $a->strings["Toggle"] = "Umschalten";
$a->strings["Author: "] = "Autor:";
$a->strings["Maintainer: "] = "Betreuer:";
$a->strings["Reload active plugins"] = "Aktive Plugins neu laden";
$a->strings["There are currently no plugins available on your node. You can find the official plugin repository at %1\$s and might find other interesting plugins in the open plugin registry at %2\$s"] = "Es sind derzeit keine Plugins auf diesem Knoten verfügbar. Du findest das offizielle Plugin-Repository unter %1\$s und weitere eventuell interessante Plugins im offenen Plugins-Verzeichnis auf %2\$s.";
$a->strings["No themes found."] = "Keine Themen gefunden.";
$a->strings["Screenshot"] = "Bildschirmfoto";
$a->strings["Reload active themes"] = "Aktives Theme neu laden";
$a->strings["No themes found on the system. They should be paced in %1\$s"] = "Es wurden keine Themes auf dem System gefunden. Diese sollten in %1\$s patziert werden.";
$a->strings["[Experimental]"] = "[Experimentell]";
$a->strings["[Unsupported]"] = "[Nicht unterstützt]";
$a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
@ -697,11 +696,12 @@ $a->strings["Enable Debugging"] = "Protokoll führen";
$a->strings["Log file"] = "Protokolldatei";
$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "Webserver muss Schreibrechte besitzen. Abhängig vom Friendica-Installationsverzeichnis.";
$a->strings["Log level"] = "Protokoll-Level";
$a->strings["Close"] = "Schließen";
$a->strings["FTP Host"] = "FTP Host";
$a->strings["FTP Path"] = "FTP Pfad";
$a->strings["FTP User"] = "FTP Nutzername";
$a->strings["FTP Password"] = "FTP Passwort";
$a->strings["PHP logging"] = "PHP Protokollieren";
$a->strings["To enable logging of PHP errors and warnings you can add the following to the .htconfig.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."] = "Um PHP Warnungen und Fehler zu protokollieren, kannst du die folgenden Zeilen zur .htconfig.php Datei deiner Installation hinzufügen. Den Dateinamen der Log-Datei legst du in der Zeile mit dem 'error_log' fest, Er ist relativ zum Friendica-Stammverzeichnis und muss schreibbar durch den Webserver sein. Eine \"1\" als Option für die Punkte 'log_errors' und 'display_errors' aktiviert die Funktionen zum Protokollieren bzw. Anzeigen der Fehler, eine \"0\" deaktiviert sie.";
$a->strings["Off"] = "Aus";
$a->strings["On"] = "An";
$a->strings["Lock feature %s"] = "Feature festlegen: %s";
$a->strings["Manage Additional Features"] = "Zusätzliche Features Verwalten";
$a->strings["Search Results For: %s"] = "Suchergebnisse für: %s";
$a->strings["Remove term"] = "Begriff entfernen";
$a->strings["Saved Searches"] = "Gespeicherte Suchen";
@ -923,7 +923,6 @@ $a->strings["Not available."] = "Nicht verfügbar.";
$a->strings["Community"] = "Gemeinschaft";
$a->strings["No results."] = "Keine Ergebnisse.";
$a->strings["everybody"] = "jeder";
$a->strings["Additional features"] = "Zusätzliche Features";
$a->strings["Display"] = "Anzeige";
$a->strings["Social Networks"] = "Soziale Netzwerke";
$a->strings["Delegations"] = "Delegationen";
@ -960,8 +959,6 @@ $a->strings["No name"] = "Kein Name";
$a->strings["Remove authorization"] = "Autorisierung entziehen";
$a->strings["No Plugin settings configured"] = "Keine Plugin-Einstellungen konfiguriert";
$a->strings["Plugin Settings"] = "Plugin-Einstellungen";
$a->strings["Off"] = "Aus";
$a->strings["On"] = "An";
$a->strings["Additional Features"] = "Zusätzliche Features";
$a->strings["General Social Media Settings"] = "Allgemeine Einstellungen zu Sozialen Medien";
$a->strings["Disable intelligent shortening"] = "Intelligentes Link kürzen ausschalten";
@ -1108,12 +1105,12 @@ $a->strings["Friends are advised to please try again in 24 hours."] = "Freunde s
$a->strings["Invalid locator"] = "Ungültiger Locator";
$a->strings["Invalid email address."] = "Ungültige E-Mail-Adresse.";
$a->strings["This account has not been configured for email. Request failed."] = "Dieses Konto ist nicht für E-Mail konfiguriert. Anfrage fehlgeschlagen.";
$a->strings["Unable to resolve your name at the provided location."] = "Konnte Deinen Namen an der angegebenen Stelle nicht finden.";
$a->strings["You have already introduced yourself here."] = "Du hast Dich hier bereits vorgestellt.";
$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob Du bereits mit %s befreundet bist.";
$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
$a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
$a->strings["Remote subscription can't be done for your network. Please subscribe directly on your system."] = "Entferntes abon­nie­ren kann für dein Netzwerk nicht durchgeführt werden. Bitte nutze direkt die Abonnieren-Funktion deines Systems. ";
$a->strings["Please login to confirm introduction."] = "Bitte melde Dich an, um die Kontaktanfrage zu bestätigen.";
$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Momentan bist Du mit einer anderen Identität angemeldet. Bitte melde Dich mit <strong>diesem</strong> Profil an.";
$a->strings["Confirm"] = "Bestätigen";
@ -1565,11 +1562,18 @@ $a->strings["Forums:"] = "Foren:";
$a->strings["Videos"] = "Videos";
$a->strings["Events and Calendar"] = "Ereignisse und Kalender";
$a->strings["Only You Can See This"] = "Nur Du kannst das sehen";
$a->strings["event"] = "Event";
$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
$a->strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil.";
$a->strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt nicht an %2\$ss %3\$s teil.";
$a->strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt eventuell an %2\$ss %3\$s teil.";
$a->strings["Post to Email"] = "An E-Mail senden";
$a->strings["Connectors disabled, since \"%s\" is enabled."] = "Konnektoren sind nicht verfügbar, da \"%s\" aktiv ist.";
$a->strings["Visible to everybody"] = "Für jeden sichtbar";
$a->strings["show"] = "zeigen";
$a->strings["don't show"] = "nicht zeigen";
$a->strings["Close"] = "Schließen";
$a->strings["[no subject]"] = "[kein Betreff]";
$a->strings["stopped following"] = "wird nicht mehr gefolgt";
$a->strings["View Status"] = "Pinnwand anschauen";
@ -1699,8 +1703,6 @@ $a->strings["<a href=\"%1\$s\" target=\"_blank\">%2\$s</a> %3\$s"] = "<a href=\"
$a->strings["<span><a href=\"%s\" target=\"_blank\">%s</a> wrote the following <a href=\"%s\" target=\"_blank\">post</a>"] = "<span><a href=\"%s\" target=\"_blank\">%s</a> schrieb den folgenden <a href=\"%s\" target=\"_blank\">Beitrag</a>";
$a->strings["$1 wrote:"] = "$1 hat geschrieben:";
$a->strings["Encrypted content"] = "Verschlüsselter Inhalt";
$a->strings["(no subject)"] = "(kein Betreff)";
$a->strings["noreply"] = "noreply";
$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbankserver '%s' nicht ermitteln.";
$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
$a->strings["Block immediately"] = "Sofort blockieren";
@ -1712,6 +1714,7 @@ $a->strings["Weekly"] = "Wöchentlich";
$a->strings["Monthly"] = "Monatlich";
$a->strings["OStatus"] = "OStatus";
$a->strings["RSS/Atom"] = "RSS/Atom";
$a->strings["Facebook"] = "Facebook";
$a->strings["Zot!"] = "Zott";
$a->strings["LinkedIn"] = "LinkedIn";
$a->strings["XMPP/IM"] = "XMPP/Chat";
@ -1767,15 +1770,9 @@ $a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalte
$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
$a->strings["Navigation"] = "Navigation";
$a->strings["Site map"] = "Sitemap";
$a->strings["User not found."] = "Nutzer nicht gefunden.";
$a->strings["Daily posting limit of %d posts reached. The post was rejected."] = "Das tägliche Nachrichtenlimit von %d Nachrichten wurde erreicht. Die Nachtricht wurde verworfen.";
$a->strings["Weekly posting limit of %d posts reached. The post was rejected."] = "Das wöchentliche Nachrichtenlimit von %d Nachrichten wurde erreicht. Die Nachtricht wurde verworfen.";
$a->strings["Monthly posting limit of %d posts reached. The post was rejected."] = "Das monatliche Nachrichtenlimit von %d Nachrichten wurde erreicht. Die Nachtricht wurde verworfen.";
$a->strings["There is no status with this id."] = "Es gibt keinen Status mit dieser ID.";
$a->strings["There is no conversation with this id."] = "Es existiert keine Unterhaltung mit dieser ID.";
$a->strings["Invalid item."] = "Ungültiges Objekt";
$a->strings["Invalid action. "] = "Ungültige Aktion";
$a->strings["DB error"] = "DB Error";
$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
@ -1798,6 +1795,8 @@ $a->strings["\n\t\tDear %1\$s,\n\t\t\tThank you for registering at %2\$s. Your a
$a->strings["\n\t\tThe login details are as follows:\n\t\t\tSite Location:\t%3\$s\n\t\t\tLogin Name:\t%1\$s\n\t\t\tPassword:\t%5\$s\n\n\t\tYou may change your password from your account \"Settings\" page after logging\n\t\tin.\n\n\t\tPlease take a few moments to review the other account settings on that page.\n\n\t\tYou may also wish to add some basic information to your default profile\n\t\t(on the \"Profiles\" page) so that other people can easily find you.\n\n\t\tWe recommend setting your full name, adding a profile photo,\n\t\tadding some profile \"keywords\" (very useful in making new friends) - and\n\t\tperhaps what country you live in; if you do not wish to be more specific\n\t\tthan that.\n\n\t\tWe fully respect your right to privacy, and none of these items are necessary.\n\t\tIf you are new and do not know anybody here, they may help\n\t\tyou to make some new and interesting friends.\n\n\n\t\tThank you and welcome to %2\$s."] = "\nDie Anmelde-Details sind die folgenden:\n\tAdresse der Seite:\t%3\$s\n\tBenutzernamename:\t%1\$s\n\tPasswort:\t%5\$s\n\nDu kannst Dein Passwort unter \"Einstellungen\" ändern, sobald Du Dich\nangemeldet hast.\n\nBitte nimm Dir ein paar Minuten um die anderen Einstellungen auf dieser\nSeite zu kontrollieren.\n\nEventuell magst Du ja auch einige Informationen über Dich in Deinem\nProfil veröffentlichen, damit andere Leute Dich einfacher finden können.\nBearbeite hierfür einfach Dein Standard-Profil (über die Profil-Seite).\n\nWir empfehlen Dir, Deinen kompletten Namen anzugeben und ein zu Dir\npassendes Profilbild zu wählen, damit Dich alte Bekannte wieder finden.\nAußerdem ist es nützlich, wenn Du auf Deinem Profil Schlüsselwörter\nangibst. Das erleichtert es, Leute zu finden, die Deine Interessen teilen.\n\nWir respektieren Deine Privatsphäre - keine dieser Angaben ist nötig.\nWenn Du neu im Netzwerk bist und noch niemanden kennst, dann können sie\nallerdings dabei helfen, neue und interessante Kontakte zu knüpfen.\n\nDanke für Deine Aufmerksamkeit und willkommen auf %2\$s.";
$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
$a->strings["Attachments:"] = "Anhänge:";
$a->strings["(no subject)"] = "(kein Betreff)";
$a->strings["noreply"] = "noreply";
$a->strings["Do you really want to delete this item?"] = "Möchtest Du wirklich dieses Item löschen?";
$a->strings["Archives"] = "Archiv";
$a->strings["Male"] = "Männlich";
@ -1958,18 +1957,6 @@ $a->strings["Your personal photos"] = "Deine privaten Fotos";
$a->strings["Local Directory"] = "Lokales Verzeichnis";
$a->strings["Set zoomfactor for Earth Layers"] = "Zoomfaktor der Earth Layer";
$a->strings["Show/hide boxes at right-hand column:"] = "Rahmen auf der rechten Seite anzeigen/verbergen";
$a->strings["Midnight"] = "Mitternacht";
$a->strings["Zenburn"] = "Zenburn";
$a->strings["Bootstrap"] = "Bootstrap";
$a->strings["Shades of Pink"] = "Shades of Pink";
$a->strings["Lime and Orange"] = "Lime and Orange";
$a->strings["GeoCities Retro"] = "GeoCities Retro";
$a->strings["Background Image"] = "Hintergrundbild";
$a->strings["The URL to a picture (e.g. from your photo album) that should be used as background image."] = "Die URL eines Bildes (z.B. aus deinem Fotoalbum), das als Hintergrundbild verwendet werden soll.";
$a->strings["Background Color"] = "Hintergrundfarbe";
$a->strings["HEX value for the background color. Don't include the #"] = "HEX Wert der Hintergrundfarbe. Gib die # nicht mit an.";
$a->strings["font size"] = "Schriftgröße";
$a->strings["base font size for your interface"] = "Basis-Schriftgröße für dein Interface.";
$a->strings["Comma separated list of helper forums"] = "Komma-Separierte Liste der Helfer-Foren";
$a->strings["Set style"] = "Stil auswählen";
$a->strings["Quick Start"] = "Schnell-Start";

View File

@ -177,7 +177,7 @@
content: "Z";
}
.shashape.hash:before{
content: "/";
content: "#";
}
.shashape.tag:before{
content: "=";

View File

@ -93,7 +93,7 @@ span.connector {
/* Shared Messages */
.shared_header {
height: 32px;
min-height: 32px;
color: #999;
border-top: 1px solid #D2D2D2;
padding-top: 5px;
@ -118,10 +118,12 @@ span.connector {
-moz-border-radius: 4px;
border-radius: 4px;
float: left;
margin-right: 9px;
}
.shared_header span {
margin-left: 9px;
display: table-cell;
float: none;
}
blockquote.shared_content {
@ -274,13 +276,37 @@ a {
#poke-recip-label, #poke-action-label, #prvmail-message-label {
margin: 10px 0 10px;
}
.version-match {
font-weight: bold;
color: #00a700;
}
.federation-graph {
width: 400px;
height: 400px;
float: right;
margin: 20px;
}
.federation-network-graph {
width: 240px;
height: 240px;
float: left;
margin: 20px;
}
ul.federation-stats,
ul.credits {
list-style: none;
}
ul.federation-stats li,
ul.credits li {
float: left;
width: 240px;
}
table#federation-stats {
width: 100%;
}
td.federation-data {
border-bottom: 1px solid #000;
}
.contact-entry-photo img {
max-width: 80px;
@ -321,3 +347,7 @@ ul.credits li {
.p-addr {
clear: both;
}
#live-community {
clear: both;
}

File diff suppressed because it is too large Load Diff

View File

@ -5,9 +5,11 @@ function string_plural_select_nl($n){
return ($n != 1);;
}}
;
$a->strings["Network:"] = "Netwerk:";
$a->strings["Forum"] = "Forum";
$a->strings["%d contact edited."] = array(
0 => "",
1 => "",
0 => "%d contact gewijzigd.",
1 => "%d contacten gewijzigd.",
);
$a->strings["Could not access contact record."] = "Kon geen toegang krijgen tot de contactgegevens";
$a->strings["Could not locate selected profile."] = "Kon het geselecteerde profiel niet vinden.";
@ -33,28 +35,11 @@ $a->strings["(Update was successful)"] = "(Wijziging is geslaagd)";
$a->strings["(Update was not successful)"] = "(Wijziging is niet geslaagd)";
$a->strings["Suggest friends"] = "Stel vrienden voor";
$a->strings["Network type: %s"] = "Netwerk type: %s";
$a->strings["%d contact in common"] = array(
0 => "%d gedeeld contact",
1 => "%d gedeelde contacten",
);
$a->strings["View all contacts"] = "Alle contacten zien";
$a->strings["Unblock"] = "Blokkering opheffen";
$a->strings["Block"] = "Blokkeren";
$a->strings["Toggle Blocked status"] = "Schakel geblokkeerde status";
$a->strings["Unignore"] = "Negeer niet meer";
$a->strings["Ignore"] = "Negeren";
$a->strings["Toggle Ignored status"] = "Schakel negeerstatus";
$a->strings["Unarchive"] = "Archiveer niet meer";
$a->strings["Archive"] = "Archiveer";
$a->strings["Toggle Archive status"] = "Schakel archiveringsstatus";
$a->strings["Repair"] = "Herstellen";
$a->strings["Advanced Contact Settings"] = "Geavanceerde instellingen voor contacten";
$a->strings["Communications lost with this contact!"] = "Communicatie met dit contact is verbroken!";
$a->strings["Fetch further information for feeds"] = "";
$a->strings["Disabled"] = "Uitgeschakeld";
$a->strings["Fetch information"] = "";
$a->strings["Fetch information and keywords"] = "";
$a->strings["Contact Editor"] = "Contactbewerker";
$a->strings["Submit"] = "Opslaan";
$a->strings["Profile Visibility"] = "Zichtbaarheid profiel";
$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat getoond moet worden wanneer %s uw profiel bezoekt. ";
@ -70,6 +55,10 @@ $a->strings["Last update:"] = "Laatste wijziging:";
$a->strings["Update public posts"] = "Openbare posts aanpassen";
$a->strings["Update now"] = "Wijzig nu";
$a->strings["Connect/Follow"] = "Verbind/Volg";
$a->strings["Unblock"] = "Blokkering opheffen";
$a->strings["Block"] = "Blokkeren";
$a->strings["Unignore"] = "Negeer niet meer";
$a->strings["Ignore"] = "Negeren";
$a->strings["Currently blocked"] = "Op dit moment geblokkeerd";
$a->strings["Currently ignored"] = "Op dit moment genegeerd";
$a->strings["Currently archived"] = "Op dit moment gearchiveerd";
@ -80,6 +69,9 @@ $a->strings["Send a notification of every new post of this contact"] = "";
$a->strings["Blacklisted keywords"] = "";
$a->strings["Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"] = "";
$a->strings["Profile URL"] = "Profiel url";
$a->strings["Location:"] = "Plaats:";
$a->strings["About:"] = "Over:";
$a->strings["Tags:"] = "Labels:";
$a->strings["Suggestions"] = "Voorstellen";
$a->strings["Suggest potential friends"] = "Stel vrienden voor";
$a->strings["All Contacts"] = "Alle Contacten";
@ -99,7 +91,21 @@ $a->strings["Search your contacts"] = "Doorzoek je contacten";
$a->strings["Finding: "] = "Gevonden:";
$a->strings["Find"] = "Zoek";
$a->strings["Update"] = "Wijzigen";
$a->strings["Archive"] = "Archiveer";
$a->strings["Unarchive"] = "Archiveer niet meer";
$a->strings["Delete"] = "Verwijder";
$a->strings["Status"] = "Tijdlijn";
$a->strings["Status Messages and Posts"] = "Berichten op jouw tijdlijn";
$a->strings["Profile"] = "Profiel";
$a->strings["Profile Details"] = "Profieldetails";
$a->strings["View all contacts"] = "Alle contacten zien";
$a->strings["Common Friends"] = "Gedeelde Vrienden";
$a->strings["View all common friends"] = "";
$a->strings["Repair"] = "Herstellen";
$a->strings["Advanced Contact Settings"] = "Geavanceerde instellingen voor contacten";
$a->strings["Toggle Blocked status"] = "Schakel geblokkeerde status";
$a->strings["Toggle Ignored status"] = "Schakel negeerstatus";
$a->strings["Toggle Archive status"] = "Schakel archiveringsstatus";
$a->strings["Mutual Friendship"] = "Wederzijdse vriendschap";
$a->strings["is a fan of yours"] = "Is een fan van jou";
$a->strings["you are a fan of"] = "Jij bent een fan van";
@ -112,7 +118,6 @@ $a->strings["Post successful."] = "Bericht succesvol geplaatst.";
$a->strings["Permission denied"] = "Toegang geweigerd";
$a->strings["Invalid profile identifier."] = "Ongeldige profiel-identificatie.";
$a->strings["Profile Visibility Editor"] = "";
$a->strings["Profile"] = "Profiel";
$a->strings["Click on a contact to add or remove."] = "Klik op een contact om het toe te voegen of te verwijderen.";
$a->strings["Visible To"] = "Zichtbaar voor";
$a->strings["All Contacts (with secure profile access)"] = "Alle contacten (met veilige profieltoegang)";
@ -137,9 +142,6 @@ $a->strings["Edit your <strong>default</strong> profile to your liking. Review t
$a->strings["Profile Keywords"] = "Sleutelwoorden voor dit profiel";
$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Stel enkele openbare sleutelwoorden in voor je standaard profiel die je interesses beschrijven. We kunnen dan misschien mensen vinden met gelijkaardige interesses, en vrienden voorstellen.";
$a->strings["Connecting"] = "Verbinding aan het maken";
$a->strings["Facebook"] = "Facebook";
$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Machtig de Facebook Connector als je een Facebook account hebt. We zullen (optioneel) al je Facebook vrienden en conversaties importeren.";
$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Als</em> dit jouw eigen persoonlijke server is kan het installeren van de Facebook toevoeging je overgang naar het vrije sociale web vergemakkelijken.";
$a->strings["Importing Emails"] = "E-mails importeren";
$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Vul je e-mailtoegangsinformatie in op je pagina met verbindingsinstellingen als je vrienden of mailinglijsten uit je e-mail-inbox wilt importeren, en met hen wilt communiceren";
$a->strings["Go to Your Contacts Page"] = "Ga naar je contactenpagina";
@ -184,7 +186,7 @@ $a->strings["Tag removed"] = "Label verwijderd";
$a->strings["Remove Item Tag"] = "Verwijder label van item";
$a->strings["Select a tag to remove: "] = "Selecteer een label om te verwijderen: ";
$a->strings["Remove"] = "Verwijderen";
$a->strings["Subsribing to OStatus contacts"] = "";
$a->strings["Subscribing to OStatus contacts"] = "";
$a->strings["No contact provided."] = "";
$a->strings["Couldn't fetch information for contact."] = "";
$a->strings["Couldn't fetch friends for contact."] = "";
@ -206,9 +208,6 @@ $a->strings["Does %s know you?"] = "Kent %s jou?";
$a->strings["No"] = "Nee";
$a->strings["Add a personal note:"] = "Voeg een persoonlijke opmerking toe:";
$a->strings["Your Identity Address:"] = "Adres van uw identiteit:";
$a->strings["Location:"] = "Plaats:";
$a->strings["About:"] = "Over:";
$a->strings["Tags:"] = "Labels:";
$a->strings["Contact added"] = "Contact toegevoegd";
$a->strings["Unable to locate original post."] = "Ik kan de originele post niet meer vinden.";
$a->strings["Empty post discarded."] = "Lege post weggegooid.";
@ -229,6 +228,7 @@ $a->strings["Group removed."] = "Groep verwijderd.";
$a->strings["Unable to remove group."] = "Niet in staat om groep te verwijderen.";
$a->strings["Group Editor"] = "Groepsbewerker";
$a->strings["Members"] = "Leden";
$a->strings["Group is empty"] = "De groep is leeg";
$a->strings["You must be logged in to use addons. "] = "Je moet ingelogd zijn om deze addons te kunnen gebruiken. ";
$a->strings["Applications"] = "Toepassingen";
$a->strings["No installed applications."] = "Geen toepassingen geïnstalleerd";
@ -287,17 +287,10 @@ $a->strings["Forgot your Password?"] = "Wachtwoord vergeten?";
$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Voer je e-mailadres in en verstuur het om je wachtwoord opnieuw in te stellen. Kijk dan je e-mail na voor verdere instructies.";
$a->strings["Nickname or Email: "] = "Bijnaam of e-mail:";
$a->strings["Reset"] = "Opnieuw";
$a->strings["event"] = "gebeurtenis";
$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt het %3\$s van %2\$s leuk";
$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt het %3\$s van %2\$s niet leuk";
$a->strings["%1\$s is attending %2\$s's %3\$s"] = "";
$a->strings["%1\$s is not attending %2\$s's %3\$s"] = "";
$a->strings["%1\$s may attend %2\$s's %3\$s"] = "";
$a->strings["{0} wants to be your friend"] = "{0} wilt je vriend worden";
$a->strings["{0} sent you a message"] = "{0} stuurde jou een bericht";
$a->strings["{0} requested registration"] = "{0} vroeg om zich te registreren";
$a->strings["No contacts."] = "Geen contacten.";
$a->strings["View Contacts"] = "Bekijk contacten";
$a->strings["Invalid request identifier."] = "Ongeldige <em>request identifier</em>.";
$a->strings["Discard"] = "Verwerpen";
$a->strings["System"] = "Systeem";
@ -393,7 +386,6 @@ $a->strings["Please use your browser 'Back' button <strong>now</strong> if you a
$a->strings["No mirroring"] = "";
$a->strings["Mirror as forwarded posting"] = "";
$a->strings["Mirror as my own posting"] = "";
$a->strings["Repair Contact Settings"] = "Contactinstellingen herstellen";
$a->strings["Return to contact editor"] = "Ga terug naar contactbewerker";
$a->strings["Refetch contact data"] = "";
$a->strings["Name"] = "Naam";
@ -424,16 +416,22 @@ $a->strings["Site"] = "Website";
$a->strings["Users"] = "Gebruiker";
$a->strings["Plugins"] = "Plugins";
$a->strings["Themes"] = "Thema's";
$a->strings["Additional features"] = "Extra functies";
$a->strings["DB updates"] = "DB aanpassingen";
$a->strings["Inspect Queue"] = "";
$a->strings["Federation Statistics"] = "";
$a->strings["Logs"] = "Logs";
$a->strings["View Logs"] = "";
$a->strings["probe address"] = "";
$a->strings["check webfinger"] = "";
$a->strings["Admin"] = "Beheer";
$a->strings["Plugin Features"] = "Plugin Functies";
$a->strings["diagnostics"] = "";
$a->strings["User registrations waiting for confirmation"] = "Gebruikersregistraties wachten op bevestiging";
$a->strings["This page offers you some numbers to the known part of the federated social network your Friendica node is part of. These numbers are not complete but only reflect the part of the network your node is aware of."] = "";
$a->strings["The <em>Auto Discovered Contact Directory</em> feature is not enabled, it will improve the data displayed here."] = "";
$a->strings["Administration"] = "Beheer";
$a->strings["Currently this node is aware of nodes from the following platforms:"] = "";
$a->strings["ID"] = "ID";
$a->strings["Recipient Name"] = "";
$a->strings["Recipient Profile"] = "";
@ -582,6 +580,10 @@ $a->strings["Maximum Load Average"] = "Maximum gemiddelde belasting";
$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximum systeembelasting voordat aflever- en poll-processen uitgesteld worden - standaard 50.";
$a->strings["Maximum Load Average (Frontend)"] = "";
$a->strings["Maximum system load before the frontend quits service - default 50."] = "";
$a->strings["Maximum table size for optimization"] = "";
$a->strings["Maximum table size (in MB) for the automatic optimization - default 100 MB. Enter -1 to disable it."] = "";
$a->strings["Minimum level of fragmentation"] = "";
$a->strings["Minimum fragmenation level to start the automatic optimization - default value is 30%."] = "";
$a->strings["Periodical check of global contacts"] = "";
$a->strings["If enabled, the global contacts are checked periodically for missing or outdated data and the vitality of the contacts and servers."] = "";
$a->strings["Days between requery"] = "";
@ -681,9 +683,11 @@ $a->strings["Toggle"] = "Schakelaar";
$a->strings["Author: "] = "Auteur:";
$a->strings["Maintainer: "] = "Onderhoud:";
$a->strings["Reload active plugins"] = "";
$a->strings["There are currently no plugins available on your node. You can find the official plugin repository at %1\$s and might find other interesting plugins in the open plugin registry at %2\$s"] = "";
$a->strings["No themes found."] = "Geen thema's gevonden.";
$a->strings["Screenshot"] = "Schermafdruk";
$a->strings["Reload active themes"] = "";
$a->strings["No themes found on the system. They should be paced in %1\$s"] = "";
$a->strings["[Experimental]"] = "[Experimenteel]";
$a->strings["[Unsupported]"] = "[Niet ondersteund]";
$a->strings["Log settings updated."] = "Log instellingen gewijzigd";
@ -692,11 +696,12 @@ $a->strings["Enable Debugging"] = "";
$a->strings["Log file"] = "Logbestand";
$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "De webserver moet hier kunnen schrijven. Relatief t.o.v. van de hoogste folder binnen uw Friendica-installatie.";
$a->strings["Log level"] = "Log niveau";
$a->strings["Close"] = "Afsluiten";
$a->strings["FTP Host"] = "FTP Server";
$a->strings["FTP Path"] = "FTP Pad";
$a->strings["FTP User"] = "FTP Gebruiker";
$a->strings["FTP Password"] = "FTP wachtwoord";
$a->strings["PHP logging"] = "";
$a->strings["To enable logging of PHP errors and warnings you can add the following to the .htconfig.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."] = "";
$a->strings["Off"] = "Uit";
$a->strings["On"] = "Aan";
$a->strings["Lock feature %s"] = "";
$a->strings["Manage Additional Features"] = "";
$a->strings["Search Results For: %s"] = "";
$a->strings["Remove term"] = "Verwijder zoekterm";
$a->strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
@ -718,14 +723,10 @@ $a->strings["Warning: This group contains %s member from an insecure network."]
);
$a->strings["Private messages to this group are at risk of public disclosure."] = "Privéberichten naar deze groep kunnen openbaar gemaakt worden.";
$a->strings["No such group"] = "Zo'n groep bestaat niet";
$a->strings["Group is empty"] = "De groep is leeg";
$a->strings["Group: %s"] = "";
$a->strings["Contact: %s"] = "";
$a->strings["Private messages to this person are at risk of public disclosure."] = "Privéberichten naar deze persoon kunnen openbaar gemaakt worden.";
$a->strings["Invalid contact."] = "Ongeldig contact.";
$a->strings["No friends to display."] = "Geen vrienden om te laten zien.";
$a->strings["Forum"] = "";
$a->strings["Friends of %s"] = "Vrienden van %s";
$a->strings["Event can not end before it has started."] = "";
$a->strings["Event title and start time are required."] = "Titel en begintijd van de gebeurtenis zijn vereist.";
$a->strings["Sun"] = "";
@ -922,7 +923,6 @@ $a->strings["Not available."] = "Niet beschikbaar";
$a->strings["Community"] = "Website";
$a->strings["No results."] = "Geen resultaten.";
$a->strings["everybody"] = "iedereen";
$a->strings["Additional features"] = "Extra functies";
$a->strings["Display"] = "Weergave";
$a->strings["Social Networks"] = "Sociale netwerken";
$a->strings["Delegations"] = "";
@ -959,8 +959,6 @@ $a->strings["No name"] = "Geen naam";
$a->strings["Remove authorization"] = "Verwijder authorisatie";
$a->strings["No Plugin settings configured"] = "";
$a->strings["Plugin Settings"] = "Plugin Instellingen";
$a->strings["Off"] = "Uit";
$a->strings["On"] = "Aan";
$a->strings["Additional Features"] = "Extra functies";
$a->strings["General Social Media Settings"] = "";
$a->strings["Disable intelligent shortening"] = "";
@ -995,7 +993,7 @@ $a->strings["Display Settings"] = "Scherminstellingen";
$a->strings["Display Theme:"] = "Schermthema:";
$a->strings["Mobile Theme:"] = "Mobiel thema:";
$a->strings["Update browser every xx seconds"] = "Browser elke xx seconden verversen";
$a->strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 seconden, geen maximum";
$a->strings["Minimum of 10 seconds. Enter -1 to disable it."] = "";
$a->strings["Number of items to display per page:"] = "Aantal items te tonen per pagina:";
$a->strings["Maximum of 100 items"] = "Maximum 100 items";
$a->strings["Number of items to display per page when viewed from mobile device:"] = "Aantal items per pagina als je een mobiel toestel gebruikt:";
@ -1107,12 +1105,12 @@ $a->strings["Friends are advised to please try again in 24 hours."] = "Wij advis
$a->strings["Invalid locator"] = "Ongeldige plaatsbepaler";
$a->strings["Invalid email address."] = "Geen geldig e-mailadres";
$a->strings["This account has not been configured for email. Request failed."] = "Aanvraag mislukt. Dit account is niet geconfigureerd voor e-mail.";
$a->strings["Unable to resolve your name at the provided location."] = "Ik kan jouw naam op het opgegeven adres niet vinden.";
$a->strings["You have already introduced yourself here."] = "Je hebt jezelf hier al voorgesteld.";
$a->strings["Apparently you are already friends with %s."] = "Blijkbaar bent u al bevriend met %s.";
$a->strings["Invalid profile URL."] = "Ongeldig profiel adres.";
$a->strings["Disallowed profile URL."] = "Niet toegelaten profiel adres.";
$a->strings["Your introduction has been sent."] = "Je verzoek is verzonden.";
$a->strings["Remote subscription can't be done for your network. Please subscribe directly on your system."] = "";
$a->strings["Please login to confirm introduction."] = "Log in om je verzoek te bevestigen.";
$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Je huidige identiteit is niet de juiste. Log met <strong>dit</strong> profiel in.";
$a->strings["Confirm"] = "Bevestig";
@ -1128,6 +1126,7 @@ $a->strings["StatusNet/Federated Social Web"] = "StatusNet/Gefedereerde Sociale
$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "- Gebruik niet dit formulier. Vul %s in in je Diaspora zoekbalk.";
$a->strings["Registration successful. Please check your email for further instructions."] = "Registratie geslaagd. Kijk je e-mail na voor verdere instructies.";
$a->strings["Failed to send email message. Here your accout details:<br> login: %s<br> password: %s<br><br>You can change your password after login."] = "";
$a->strings["Registration successful."] = "";
$a->strings["Your registration can not be processed."] = "Je registratie kan niet verwerkt worden.";
$a->strings["Your registration is pending approval by the site owner."] = "Jouw registratie wacht op goedkeuring van de beheerder.";
$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze website heeft het toegelaten dagelijkse aantal registraties overschreden. Probeer morgen opnieuw.";
@ -1152,8 +1151,6 @@ $a->strings["Only one search per minute is permitted for not logged in users."]
$a->strings["Search"] = "Zoeken";
$a->strings["Items tagged with: %s"] = "";
$a->strings["Search results for: %s"] = "";
$a->strings["Age: "] = "Leeftijd:";
$a->strings["Gender: "] = "Geslacht:";
$a->strings["Status:"] = "Tijdlijn:";
$a->strings["Homepage:"] = "Website:";
$a->strings["Global Directory"] = "Globale gids";
@ -1170,7 +1167,6 @@ $a->strings["Potential Delegates"] = "Mogelijke personen waaraan het paginabehee
$a->strings["Add"] = "Toevoegen";
$a->strings["No entries."] = "Geen gegevens.";
$a->strings["No contacts in common."] = "Geen gedeelde contacten.";
$a->strings["Common Friends"] = "Gedeelde Vrienden";
$a->strings["Export account"] = "Account exporteren";
$a->strings["Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server."] = "Je account informatie en contacten exporteren. Gebruik dit om een backup van je account te maken en/of om het te verhuizen naar een andere server.";
$a->strings["Export all"] = "Alles exporteren";
@ -1257,6 +1253,7 @@ $a->strings["Love/romance"] = "Liefde/romance";
$a->strings["Work/employment"] = "Werk";
$a->strings["School/education"] = "School/opleiding";
$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dit is jouw <strong>publiek</strong> profiel.<br />Het <strong>kan</strong> zichtbaar zijn voor iedereen op het internet.";
$a->strings["Age: "] = "Leeftijd:";
$a->strings["Edit/Manage Profiles"] = "Wijzig/Beheer Profielen";
$a->strings["Change profile photo"] = "Profiel foto wijzigen";
$a->strings["Create New Profile"] = "Maak nieuw profiel";
@ -1310,7 +1307,7 @@ $a->strings["poke, prod or do other things to somebody"] = "aanstoten, porren of
$a->strings["Recipient"] = "Ontvanger";
$a->strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
$a->strings["Make this post private"] = "Dit bericht privé maken";
$a->strings["Resubsribing to OStatus contacts"] = "";
$a->strings["Resubscribing to OStatus contacts"] = "";
$a->strings["Error"] = "";
$a->strings["Total invitation limit exceeded."] = "Totale uitnodigingslimiet overschreden.";
$a->strings["%s : Not a valid email address."] = "%s: Geen geldig e-mailadres.";
@ -1443,6 +1440,10 @@ $a->strings["All Networks"] = "Alle netwerken";
$a->strings["Saved Folders"] = "Bewaarde Mappen";
$a->strings["Everything"] = "Alles";
$a->strings["Categories"] = "Categorieën";
$a->strings["%d contact in common"] = array(
0 => "%d gedeeld contact",
1 => "%d gedeelde contacten",
);
$a->strings["General Features"] = "Algemene functies";
$a->strings["Multiple Profiles"] = "Meerdere profielen";
$a->strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
@ -1458,6 +1459,8 @@ $a->strings["Add/remove mention when a fourm page is selected/deselected in ACL
$a->strings["Network Sidebar Widgets"] = "Zijbalkwidgets op netwerkpagina";
$a->strings["Search by Date"] = "Zoeken op datum";
$a->strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten te selecteren volgens datumbereik";
$a->strings["List Forums"] = "";
$a->strings["Enable widget to display the forums your are connected with"] = "";
$a->strings["Group Filter"] = "Groepsfilter";
$a->strings["Enable widget to display Network posts only from selected group"] = "Sta de widget toe om netwerkberichten te tonen van bepaalde groepen";
$a->strings["Network Filter"] = "Netwerkfilter";
@ -1486,6 +1489,8 @@ $a->strings["Star Posts"] = "Geef berichten een ster";
$a->strings["Ability to mark special posts with a star indicator"] = "";
$a->strings["Mute Post Notifications"] = "";
$a->strings["Ability to mute notifications for a thread"] = "";
$a->strings["Advanced Profile Settings"] = "";
$a->strings["Show visitors public community forums at the Advanced Profile Page"] = "";
$a->strings["Connect URL missing."] = "";
$a->strings["This site is not configured to allow communications with other networks."] = "Deze website is niet geconfigureerd voor communicatie met andere netwerken.";
$a->strings["No compatible communication protocols or feeds were discovered."] = "Er werden geen compatibele communicatieprotocols of feeds ontdekt.";
@ -1502,6 +1507,7 @@ $a->strings["A deleted group with this name was revived. Existing item permissio
$a->strings["Default privacy group for new contacts"] = "";
$a->strings["Everybody"] = "Iedereen";
$a->strings["edit"] = "verander";
$a->strings["Edit groups"] = "";
$a->strings["Edit group"] = "Verander groep";
$a->strings["Create a new group"] = "Maak nieuwe groep";
$a->strings["Contacts not in any group"] = "";
@ -1525,10 +1531,10 @@ $a->strings["%s's birthday"] = "%s's verjaardag";
$a->strings["Happy Birthday %s"] = "Gefeliciteerd %s";
$a->strings["Requested account is not available."] = "Gevraagde account is niet beschikbaar.";
$a->strings["Edit profile"] = "Bewerk profiel";
$a->strings["Atom feed"] = "";
$a->strings["Message"] = "Bericht";
$a->strings["Profiles"] = "Profielen";
$a->strings["Manage/edit profiles"] = "Beheer/wijzig profielen";
$a->strings["Network:"] = "";
$a->strings["g A l F d"] = "G l j F";
$a->strings["F d"] = "d F";
$a->strings["[today]"] = "[vandaag]";
@ -1552,17 +1558,22 @@ $a->strings["Film/dance/culture/entertainment:"] = "Film/dans/cultuur/ontspannin
$a->strings["Love/Romance:"] = "Liefde/romance:";
$a->strings["Work/employment:"] = "Werk/beroep:";
$a->strings["School/education:"] = "School/opleiding:";
$a->strings["Status"] = "Tijdlijn";
$a->strings["Status Messages and Posts"] = "Berichten op jouw tijdlijn";
$a->strings["Profile Details"] = "Profieldetails";
$a->strings["Forums:"] = "";
$a->strings["Videos"] = "Video's";
$a->strings["Events and Calendar"] = "Gebeurtenissen en kalender";
$a->strings["Only You Can See This"] = "Alleen jij kunt dit zien";
$a->strings["event"] = "gebeurtenis";
$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt het %3\$s van %2\$s leuk";
$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt het %3\$s van %2\$s niet leuk";
$a->strings["%1\$s is attending %2\$s's %3\$s"] = "";
$a->strings["%1\$s is not attending %2\$s's %3\$s"] = "";
$a->strings["%1\$s may attend %2\$s's %3\$s"] = "";
$a->strings["Post to Email"] = "Verzenden per e-mail";
$a->strings["Connectors disabled, since \"%s\" is enabled."] = "";
$a->strings["Visible to everybody"] = "Zichtbaar voor iedereen";
$a->strings["show"] = "tonen";
$a->strings["don't show"] = "niet tonen";
$a->strings["Close"] = "Afsluiten";
$a->strings["[no subject]"] = "[geen onderwerp]";
$a->strings["stopped following"] = "";
$a->strings["View Status"] = "Bekijk status";
@ -1629,6 +1640,8 @@ $a->strings["Undecided"] = array(
0 => "",
1 => "",
);
$a->strings["Forums"] = "";
$a->strings["External link to forum"] = "";
$a->strings["view full size"] = "Volledig formaat";
$a->strings["newer"] = "nieuwere berichten";
$a->strings["older"] = "oudere berichten";
@ -1643,9 +1656,9 @@ $a->strings["%d Contact"] = array(
0 => "%d contact",
1 => "%d contacten",
);
$a->strings["View Contacts"] = "Bekijk contacten";
$a->strings["Full Text"] = "";
$a->strings["Tags"] = "";
$a->strings["Forums"] = "";
$a->strings["poke"] = "aanstoten";
$a->strings["poked"] = "aangestoten";
$a->strings["ping"] = "ping";
@ -1690,8 +1703,6 @@ $a->strings["<a href=\"%1\$s\" target=\"_blank\">%2\$s</a> %3\$s"] = "";
$a->strings["<span><a href=\"%s\" target=\"_blank\">%s</a> wrote the following <a href=\"%s\" target=\"_blank\">post</a>"] = "";
$a->strings["$1 wrote:"] = "$1 schreef:";
$a->strings["Encrypted content"] = "Versleutelde inhoud";
$a->strings["(no subject)"] = "(geen onderwerp)";
$a->strings["noreply"] = "geen reactie";
$a->strings["Cannot locate DNS info for database server '%s'"] = "";
$a->strings["Unknown | Not categorised"] = "Onbekend | Niet ";
$a->strings["Block immediately"] = "Onmiddellijk blokkeren";
@ -1703,6 +1714,7 @@ $a->strings["Weekly"] = "wekelijks";
$a->strings["Monthly"] = "maandelijks";
$a->strings["OStatus"] = "OStatus";
$a->strings["RSS/Atom"] = "RSS/Atom";
$a->strings["Facebook"] = "Facebook";
$a->strings["Zot!"] = "Zot!";
$a->strings["LinkedIn"] = "Linkedln";
$a->strings["XMPP/IM"] = "XMPP/IM";
@ -1758,15 +1770,9 @@ $a->strings["Manage/edit friends and contacts"] = "Beheer/Wijzig vrienden en con
$a->strings["Site setup and configuration"] = "Website opzetten en configureren";
$a->strings["Navigation"] = "Navigatie";
$a->strings["Site map"] = "Sitemap";
$a->strings["User not found."] = "Gebruiker niet gevonden";
$a->strings["Daily posting limit of %d posts reached. The post was rejected."] = "";
$a->strings["Weekly posting limit of %d posts reached. The post was rejected."] = "";
$a->strings["Monthly posting limit of %d posts reached. The post was rejected."] = "";
$a->strings["There is no status with this id."] = "Er is geen status met dit kenmerk";
$a->strings["There is no conversation with this id."] = "";
$a->strings["Invalid item."] = "";
$a->strings["Invalid action. "] = "";
$a->strings["DB error"] = "";
$a->strings["An invitation is required."] = "Een uitnodiging is vereist.";
$a->strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden.";
$a->strings["Invalid OpenID url"] = "Ongeldige OpenID url";
@ -1789,6 +1795,8 @@ $a->strings["\n\t\tDear %1\$s,\n\t\t\tThank you for registering at %2\$s. Your a
$a->strings["\n\t\tThe login details are as follows:\n\t\t\tSite Location:\t%3\$s\n\t\t\tLogin Name:\t%1\$s\n\t\t\tPassword:\t%5\$s\n\n\t\tYou may change your password from your account \"Settings\" page after logging\n\t\tin.\n\n\t\tPlease take a few moments to review the other account settings on that page.\n\n\t\tYou may also wish to add some basic information to your default profile\n\t\t(on the \"Profiles\" page) so that other people can easily find you.\n\n\t\tWe recommend setting your full name, adding a profile photo,\n\t\tadding some profile \"keywords\" (very useful in making new friends) - and\n\t\tperhaps what country you live in; if you do not wish to be more specific\n\t\tthan that.\n\n\t\tWe fully respect your right to privacy, and none of these items are necessary.\n\t\tIf you are new and do not know anybody here, they may help\n\t\tyou to make some new and interesting friends.\n\n\n\t\tThank you and welcome to %2\$s."] = "";
$a->strings["Sharing notification from Diaspora network"] = "";
$a->strings["Attachments:"] = "Bijlagen:";
$a->strings["(no subject)"] = "(geen onderwerp)";
$a->strings["noreply"] = "geen reactie";
$a->strings["Do you really want to delete this item?"] = "Wil je echt dit item verwijderen?";
$a->strings["Archives"] = "Archieven";
$a->strings["Male"] = "Man";
@ -1951,7 +1959,6 @@ $a->strings["Set zoomfactor for Earth Layers"] = "";
$a->strings["Show/hide boxes at right-hand column:"] = "";
$a->strings["Comma separated list of helper forums"] = "";
$a->strings["Set style"] = "";
$a->strings["External link to forum"] = "";
$a->strings["Quick Start"] = "";
$a->strings["greenzero"] = "";
$a->strings["purplezero"] = "";

View File

@ -10,14 +10,12 @@
});
});
</script>
<h4><a href="{{$admurl}}">{{$admtxt}}</a></h4>
<ul class='admin linklist'>
<li class='admin link button {{$admin.site.2}}'><a href='{{$admin.site.0}}'>{{$admin.site.1}}</a></li>
<li class='admin link button {{$admin.users.2}}'><a href='{{$admin.users.0}}'>{{$admin.users.1}}</a><span id='pending-update' title='{{$h_pending}}'></span></li>
<li class='admin link button {{$admin.plugins.2}}'><a href='{{$admin.plugins.0}}'>{{$admin.plugins.1}}</a></li>
<li class='admin link button {{$admin.themes.2}}'><a href='{{$admin.themes.0}}'>{{$admin.themes.1}}</a></li>
<li class='admin link button {{$admin.dbsync.2}}'><a href='{{$admin.dbsync.0}}'>{{$admin.dbsync.1}}</a></li>
<li class='admin link button {{$admin.queue.2}}'><a href='{{$admin.queue.0}}'>{{$admin.queue.1}}</a></li>
{{foreach $subpages as $page}}
<li class='admin link button {{$page.2}}'><a href='{{$page.0}}'>{{$page.1}}</a></li>
{{/foreach}}
</ul>
{{if $admin.update}}
@ -39,6 +37,7 @@
<h4>{{$logtxt}}</h4>
<ul class='admin linklist'>
<li class='admin link button {{$admin.logs.2}}'><a href='{{$admin.logs.0}}'>{{$admin.logs.1}}</a></li>
<li class='admin link button {{$admin.viewlogs.2}}'><a href='{{$admin.viewlogs.0}}'>{{$admin.viewlogs.1}}</a></li>
</ul>
<h4>{{$diagnosticstxt}}</h4>

View File

@ -0,0 +1,58 @@
<script src="{{$baseurl}}/library/Chart.js-1.0.2/Chart.min.js"></script>
<canvas id="FederationChart" class="federation-graph"></canvas>
<div id="adminpage">
<h1>{{$title}} - {{$page}}</h1>
<p>{{$intro}}</p>
{{if not $autoactive}}
<p class="error-message">{{$hint}}</p>
{{/if}}
<p>{{$legendtext}}
<ul>
{{foreach $counts as $c}}
{{if $c[0]['total'] > 0}}
<li>{{$c[0]['platform']}} ({{$c[0]['total']}})</li>
{{/if}}
{{/foreach}}
</ul>
</p>
</div>
<script>
var FedData = [
{{foreach $counts as $c}}
{ value: {{$c[0]['total']}}, label: "{{$c[0]['platform']}}", color: "#90EE90", highlight: "#EE90A1", },
{{/foreach}}
];
var ctx = document.getElementById("FederationChart").getContext("2d");
var myDoughnutChart = new Chart(ctx).Doughnut(FedData, { animateRotate : false, });
</script>
<table id="federation-stats">
{{foreach $counts as $c}}
{{if $c[0]['total'] > 0}}
<tr>
<th>{{$c[0]['platform']}}</th>
<th><strong>{{$c[0]['total']}}</strong></td>
<td>{{$c[0]['network']}}</td>
</tr>
<tr>
<td colspan="3" class="federation-data">
<canvas id="{{$c[2]}}Chart" class="federation-network-graph"></canvas>
<script>
var {{$c[2]}}data = [
{{foreach $c[1] as $v}}
{ value: {{$v['total']}}, label: '{{$v['version']}}', color: "#90EE90", highlight: "#EE90A1",},
{{/foreach}}
];
var ctx = document.getElementById("{{$c[2]}}Chart").getContext("2d");
var my{{$c[2]}}DoughnutChart = new Chart(ctx).Doughnut({{$c[2]}}data, {animateRotate : false,});
</script>
<ul class="federation-stats">
{{foreach $c[1] as $v}}
<li>{{if ($c[0]['platform']==='Friendica' and $version===$v['version']) }}<span class="version-match">{{$v['version']}}</span>{{else}}{{$v['version']}}{{/if}} ({{$v['total']}})</li>
{{/foreach}}
</ul>
</td>
</tr>
{{/if}}
{{/foreach}}
</table>

View File

@ -1,19 +1,21 @@
<div id='adminpage'>
<h1>{{$title}} - {{$page}}</h1>
<h1>{{$title}} - {{$page}}</h1>
<form action="{{$baseurl}}/admin/logs" method="post">
<input type='hidden' name='form_security_token' value="{{$form_security_token|escape:'html'}}">
<input type='hidden' name='form_security_token' value="{{$form_security_token|escape:'html'}}">
{{include file="field_checkbox.tpl" field=$debugging}}
{{include file="field_input.tpl" field=$logfile}}
{{include file="field_select.tpl" field=$loglevel}}
{{include file="field_checkbox.tpl" field=$debugging}}
{{include file="field_input.tpl" field=$logfile}}
{{include file="field_select.tpl" field=$loglevel}}
<div class="submit"><input type="submit" name="page_logs" value="{{$submit|escape:'html'}}" /></div>
<div class="submit"><input type="submit" name="page_logs" value="{{$submit|escape:'html'}}" /></div>
</form>
<h2>{{$phpheader}}</h2>
<div>
<p>{{$phphint}}</p>
<pre>{{$phplogcode}}</pre>
</div>
<h3>{{$logname}}</h3>
<div style="width:100%; height:400px; overflow: auto; "><pre>{{$data}}</pre></div>
<!-- <iframe src='{{$baseurl}}/{{$logname}}' style="width:100%; height:400px"></iframe> -->
<!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="{{$clear}}" /></div> -->
</div>

View File

@ -1,6 +1,11 @@
<div id='adminpage'>
<h1>{{$title}} - {{$page}}</h1>
{{if $pcount eq 0}}
<div class="error-message">
{{$noplugshint}}
</div>
{{else}}
<a class="btn" href="{{$baseurl}}/admin/{{$function}}?a=r&amp;t={{$form_security_token}}">{{$reload}}</a>
<ul id='pluginslist'>
{{foreach $plugins as $p}}
@ -13,4 +18,5 @@
</li>
{{/foreach}}
</ul>
{{/if}}
</div>

View File

@ -1,99 +0,0 @@
<script src="js/jquery.htmlstream.js"></script>
<script>
/* ajax updater */
function updateEnd(data){
//$("#updatepopup .panel_text").html(data);
$("#remoteupdate_form").find("input").removeAttr('disabled');
$(".panel_action_close").fadeIn()
}
function updateOn(data){
var patt=/§([^§]*)§/g;
var matches = data.match(patt);
$(matches).each(function(id,data){
data = data.replace(/§/g,"");
d = data.split("@");
console.log(d);
elm = $("#updatepopup .panel_text #"+d[0]);
html = "<div id='"+d[0]+"' class='progress'>"+d[1]+"<span>"+d[2]+"</span></div>";
if (elm.length==0){
$("#updatepopup .panel_text").append(html);
} else {
$(elm).replaceWith(html);
}
});
}
$(function(){
$("#remoteupdate_form").submit(function(){
var data={};
$(this).find("input").each(function(i, e){
name = $(e).attr('name');
value = $(e).val();
e.disabled = true;
data[name]=value;
});
$("#updatepopup .panel_text").html("");
$("#updatepopup").show();
$("#updatepopup .panel").hide().slideDown(500);
$(".panel_action_close").hide().click(function(){
$("#updatepopup .panel").slideUp(500, function(){
$("#updatepopup").hide();
});
});
$.post(
$(this).attr('action'),
data,
updateEnd,
'text',
updateOn
);
return false;
})
});
</script>
<div id="updatepopup" class="popup">
<div class="background"></div>
<div class="panel">
<div class="panel_in">
<h1>Friendica Update</h1>
<div class="panel_text"></div>
<div class="panel_actions">
<input type="button" value="{{$close|escape:'html'}}" class="panel_action_close">
</div>
</div>
</div>
</div>
<div id="adminpage">
<dl> <dt>Your version:</dt><dd>{{$localversion}}</dd> </dl>
{{if $needupdate}}
<dl> <dt>New version:</dt><dd>{{$remoteversion}}</dd> </dl>
<form id="remoteupdate_form" method="POST" action="{{$baseurl}}/admin/update">
<input type="hidden" name="{{$remotefile.0}}" value="{{$remotefile.2|escape:'html'}}">
{{if $canwrite}}
<div class="submit"><input type="submit" name="remoteupdate" value="{{$submit|escape:'html'}}" /></div>
{{else}}
<h3>Your friendica installation is not writable by web server.</h3>
{{if $canftp}}
<p>You can try to update via FTP</p>
{{include file="field_input.tpl" field=$ftphost}}
{{include file="field_input.tpl" field=$ftppath}}
{{include file="field_input.tpl" field=$ftpuser}}
{{include file="field_password.tpl" field=$ftppwd}}
<div class="submit"><input type="submit" name="remoteupdate" value="{{$submit|escape:'html'}}" /></div>
{{/if}}
{{/if}}
</form>
{{else}}
<h4>No updates</h4>
{{/if}}
</div>

View File

@ -0,0 +1,21 @@
<h1>{{$title}}</h1>
<form action="admin/features" method="post" autocomplete="off">
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{foreach $features as $g => $f}}
<h3 class="settings-heading"><a href="javascript:;">{{$f.0}}</a></h3>
<div class="settings-content-block">
{{foreach $f.1 as $fcat}}
{{include file="field_yesno.tpl" field=$fcat.0}}
{{include file="field_yesno.tpl" field=$fcat.1}}
{{/foreach}}
<div class="settings-submit-wrapper" >
<input type="submit" name="submit" class="settings-features-submit" value="{{$submit|escape:'html'}}" />
</div>
</div>
{{/foreach}}
</form>

View File

@ -0,0 +1,9 @@
<script>
$(document).ready(function() {
$('.settings-content-block').hide();
$('.settings-heading').click(function(){
$('.settings-content-block').hide();
$(this).next('.settings-content-block').toggle();
});
});
</script>

View File

@ -0,0 +1,6 @@
<div id='adminpage'>
<h1>{{$title}} - {{$page}}</h1>
<h3>{{$logname}}</h3>
<div style="width:100%; height:400px; overflow: auto; "><pre>{{$data}}</pre></div>
</div>

View File

@ -1,6 +1,6 @@
{{$tabs}}
<h2>{{$title}}</h2>
{{include file="section_title.tpl"}}
<div id="new-event-link"><a href="{{$new_event.0}}" >{{$new_event.1}}</a></div>

View File

@ -4,7 +4,7 @@
<div id="event-wrapper" style="display: none;" ><div id="event-title">{{$event_title}}</div>
<div id="event-title-end"></div>
{{foreach $events as $event}}
<div class="event-list" id="event-{{$event.id}}"> <a class="cboxElement" href="events/?id={{$event.id}}">{{$event.title}}</a> - {{$event.date}} </div>
<div class="event-list" id="event-{{$event.id}}"> <a class="ajax-popupbox" href="events/?id={{$event.id}}">{{$event.title}}</a> - {{$event.date}} </div>
{{/foreach}}
</div>
{{/if}}

View File

@ -1,5 +1,5 @@
<h2>{{$title}}</h2>
{{include file="section_title.tpl"}}
<dl id="aprofile-fullname" class="aprofile">
<dt>{{$profile.fullname.0}}</dt>

View File

@ -1055,6 +1055,7 @@ aside .vcard .title {
aside .vcard dl {
height: auto;
overflow: auto;
word-break: break-word;
}
aside .vcard .account-type {
margin-bottom: 13px;
@ -1412,6 +1413,7 @@ section.minimal {
/* font-size: 14px; */
max-width: 660px;
word-wrap: break-word;
word-break: break-word;
/* line-height: 1.36; */
padding-bottom: 6px;
}

View File

@ -1,12 +1,7 @@
<?php
if (file_exists("$THEMEPATH//style.css")){
echo file_get_contents("$THEMEPATH//style.css");
}
$uid = get_theme_uid();
$style = get_pconfig( $uid, 'vier', 'style');
$style = get_pconfig($uid, 'vier', 'style');
if ($style == "")
$style = get_config('vier', 'style');
@ -15,14 +10,45 @@ if ($style == "")
$style = "plus";
if ($style == "flat")
$stylecss = file_get_contents('view/theme/vier/flat.css');
$stylecssfile = 'view/theme/vier/flat.css';
else if ($style == "netcolour")
$stylecss = file_get_contents('view/theme/vier/netcolour.css');
$stylecssfile = 'view/theme/vier/netcolour.css';
else if ($style == "breathe")
$stylecss = file_get_contents('view/theme/vier/breathe.css');
$stylecssfile = 'view/theme/vier/breathe.css';
else if ($style == "plus")
$stylecss = file_get_contents('view/theme/vier/plus.css');
$stylecssfile = 'view/theme/vier/plus.css';
else if ($style == "dark")
$stylecss = file_get_contents('view/theme/vier/dark.css');
$stylecssfile = 'view/theme/vier/dark.css';
if (file_exists($THEMEPATH."//style.css")) {
$stylecss = file_get_contents($THEMEPATH."//style.css")."\n";
$modified = filemtime($THEMEPATH."//style.css");
}
$stylemodified = filemtime($stylecssfile);
$stylecss .= file_get_contents($stylecssfile);
if ($stylemodified > $modified)
$modified = $stylemodified;
$modified = gmdate('r', $modified);
$etag = md5($stylecss);
// Only send the CSS file if it was changed
header('Cache-Control: public');
header('ETag: "'.$etag.'"');
header('Last-Modified: '.$modified);
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
$cached_modified = gmdate('r', strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']));
$cached_etag = str_replace(array('"', "-gzip"), array('', ''),
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']));
if (($cached_modified == $modified) AND ($cached_etag == $etag)) {
header('HTTP/1.1 304 Not Modified');
exit();
}
}
echo $stylecss;

View File

@ -4,7 +4,7 @@
</div>
{{/if}}
<h2>{{$title}}</h2>
{{include file="section_title.tpl"}}
<dl id="aprofile-fullname" class="aprofile">
<dt>{{$profile.fullname.0}}</dt>
@ -171,6 +171,9 @@
</dl>
{{/if}}
{{if $profile.forumlist}}
<dl id="aprofile-forumlist" class="aprofile">
<dt>{{$profile.forumlist.0}}</dt>
<dd>{{$profile.forumlist.1}}</dd>
</dl>
{{/if}}